@sherwoodagent/cli 0.41.4 → 0.42.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.
Files changed (54) hide show
  1. package/dist/{addresses-JBIU5U3T.js → addresses-DCQMJJFI.js} +4 -4
  2. package/dist/{agent-LBF6OZRW.js → agent-5YEJ6W6W.js} +6 -6
  3. package/dist/{chat-3GE6474H.js → chat-UWJ6JBFE.js} +8 -8
  4. package/dist/{chunk-WCBG44IQ.js → chunk-4EHI4SKM.js} +25 -1
  5. package/dist/chunk-4EHI4SKM.js.map +1 -0
  6. package/dist/{chunk-AGKCDHKI.js → chunk-4OAZ7TP5.js} +4 -4
  7. package/dist/{chunk-JJ4EF7ZE.js → chunk-5Q3VT6NQ.js} +25 -6
  8. package/dist/{chunk-JJ4EF7ZE.js.map → chunk-5Q3VT6NQ.js.map} +1 -1
  9. package/dist/{chunk-JGJAKTKK.js → chunk-6U3A6ZJ2.js} +5 -5
  10. package/dist/{chunk-IJG4CTOI.js → chunk-FOOZC4AM.js} +12 -2
  11. package/dist/{chunk-IJG4CTOI.js.map → chunk-FOOZC4AM.js.map} +1 -1
  12. package/dist/{chunk-DNX3P5YK.js → chunk-GMVDHSCF.js} +2 -2
  13. package/dist/{chunk-CECQNUS6.js → chunk-JNDEZFXW.js} +110 -68
  14. package/dist/chunk-JNDEZFXW.js.map +1 -0
  15. package/dist/{chunk-OFR3LCYE.js → chunk-SWKHSKDH.js} +3 -3
  16. package/dist/{chunk-ARHM3CYN.js → chunk-T2IA6CCW.js} +4 -4
  17. package/dist/{chunk-VMNB4ARO.js → chunk-XAUMJZU2.js} +2 -2
  18. package/dist/{client-HKAG55PQ.js → client-DRVUILER.js} +4 -4
  19. package/dist/{config-LS7FKZL5.js → config-YRERDZSL.js} +2 -2
  20. package/dist/{eas-27JA63VQ.js → eas-KBU2BAOD.js} +16 -6
  21. package/dist/{governor-YLZJIQOB.js → governor-KH7RNH2E.js} +6 -6
  22. package/dist/index.js +163 -45
  23. package/dist/index.js.map +1 -1
  24. package/dist/{network-KSMKPKNL.js → network-3HB46JMQ.js} +7 -5
  25. package/dist/{price-5RAPTAYW.js → price-TTQWI672.js} +5 -5
  26. package/dist/{research-HDEPP2SL.js → research-J3HYU3N6.js} +9 -9
  27. package/dist/research-NR4VC5LN.js +14 -0
  28. package/dist/{session-EST3O7W3.js → session-NUPHC6ZN.js} +10 -10
  29. package/dist/{trade-XTLUZJB6.js → trade-VGECC4QZ.js} +16 -16
  30. package/dist/{xmtp-LPCRZRHX.js → xmtp-JO7W6RFK.js} +6 -6
  31. package/package.json +1 -1
  32. package/dist/chunk-CECQNUS6.js.map +0 -1
  33. package/dist/chunk-WCBG44IQ.js.map +0 -1
  34. package/dist/research-4UA4UB5P.js +0 -14
  35. /package/dist/{addresses-JBIU5U3T.js.map → addresses-DCQMJJFI.js.map} +0 -0
  36. /package/dist/{agent-LBF6OZRW.js.map → agent-5YEJ6W6W.js.map} +0 -0
  37. /package/dist/{chat-3GE6474H.js.map → chat-UWJ6JBFE.js.map} +0 -0
  38. /package/dist/{chunk-AGKCDHKI.js.map → chunk-4OAZ7TP5.js.map} +0 -0
  39. /package/dist/{chunk-JGJAKTKK.js.map → chunk-6U3A6ZJ2.js.map} +0 -0
  40. /package/dist/{chunk-DNX3P5YK.js.map → chunk-GMVDHSCF.js.map} +0 -0
  41. /package/dist/{chunk-OFR3LCYE.js.map → chunk-SWKHSKDH.js.map} +0 -0
  42. /package/dist/{chunk-ARHM3CYN.js.map → chunk-T2IA6CCW.js.map} +0 -0
  43. /package/dist/{chunk-VMNB4ARO.js.map → chunk-XAUMJZU2.js.map} +0 -0
  44. /package/dist/{client-HKAG55PQ.js.map → client-DRVUILER.js.map} +0 -0
  45. /package/dist/{config-LS7FKZL5.js.map → config-YRERDZSL.js.map} +0 -0
  46. /package/dist/{eas-27JA63VQ.js.map → eas-KBU2BAOD.js.map} +0 -0
  47. /package/dist/{governor-YLZJIQOB.js.map → governor-KH7RNH2E.js.map} +0 -0
  48. /package/dist/{network-KSMKPKNL.js.map → network-3HB46JMQ.js.map} +0 -0
  49. /package/dist/{price-5RAPTAYW.js.map → price-TTQWI672.js.map} +0 -0
  50. /package/dist/{research-HDEPP2SL.js.map → research-J3HYU3N6.js.map} +0 -0
  51. /package/dist/{research-4UA4UB5P.js.map → research-NR4VC5LN.js.map} +0 -0
  52. /package/dist/{session-EST3O7W3.js.map → session-NUPHC6ZN.js.map} +0 -0
  53. /package/dist/{trade-XTLUZJB6.js.map → trade-VGECC4QZ.js.map} +0 -0
  54. /package/dist/{xmtp-LPCRZRHX.js.map → xmtp-JO7W6RFK.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/moonwell.ts","../src/commands/strategy-template.ts","../src/lib/clone.ts","../src/lib/batch.ts","../src/strategies/moonwell-supply-template.ts","../src/strategies/venice-inference-template.ts","../src/strategies/aerodrome-lp-template.ts","../src/strategies/wsteth-moonwell-template.ts","../src/strategies/mamo-yield-template.ts","../src/strategies/portfolio-template.ts","../src/strategies/hyperliquid-perp-template.ts","../src/lib/subgraph.ts","../src/commands/venice.ts","../src/commands/allowance.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/commands/proposal.ts","../src/lib/format.ts","../src/lib/simulate.ts","../src/commands/governor.ts","../src/commands/guardian-delegate.ts"],"sourcesContent":["#!/usr/bin/env node\n// Load .env if present (dev convenience — production uses ~/.sherwood/config.json)\nimport { config as loadDotenv } from \"dotenv\";\ntry { loadDotenv(); } catch {};\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require(\"../package.json\");\nimport { Command, Option } from \"commander\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork, getNetwork, VALID_NETWORKS } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } from \"./lib/network.js\";\nimport type { Network } from \"./lib/network.js\";\nimport { TOKENS } from \"./lib/addresses.js\";\nimport { getPublicClient, getAccount, formatContractError } from \"./lib/client.js\";\nimport { ERC20_ABI } from \"./lib/abis.js\";\nimport { MoonwellProvider } from \"./providers/moonwell.js\";\nimport { UniswapProvider } from \"./providers/uniswap.js\";\nimport { registerStrategyTemplateCommands } from \"./commands/strategy-template.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\n// registryLib removed — strategy registry is deprecated, replaced by template commands\nimport { uploadMetadata } from \"./lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"./lib/ipfs.js\";\nimport { registerVeniceCommands } from \"./commands/venice.js\";\nimport { registerAllowanceCommands } from \"./commands/allowance.js\";\nimport { registerIdentityCommands } from \"./commands/identity.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { registerGovernorCommands } from \"./commands/governor.js\";\nimport { registerGuardianCommands } from \"./commands/guardian-delegate.js\";\nimport { setTextRecord, getTextRecord, resolveVaultSyndicate, resolveSyndicate } from \"./lib/ens.js\";\nimport * as easLib from \"./lib/eas.js\";\nimport { EAS_SCHEMAS } from \"./lib/addresses.js\";\n\n// XMTP shells out to @xmtp/cli binary — lazy-load to avoid breaking\n// non-chat commands if the CLI is not installed.\nasync function loadXmtp() {\n return import(\"./lib/xmtp.js\");\n}\n// Lazy-load cron module (only needed for openclaw agents)\nasync function loadCron() {\n return import(\"./lib/cron.js\");\n}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId, setConfigRpcUrl, getNotifyTo, setNotifyTo, setUniswapApiKey, getUniswapApiKey, setVeniceApiKey, getVeniceApiKey, addSyndicate, getSyndicates, setPrimarySyndicate, getPrimarySyndicate } from \"./lib/config.js\";\nimport { isTestnet } from \"./lib/network.js\";\n\n// ── Theme ──\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction validateAddress(value: string, name: string): Address {\n if (!isAddress(value)) {\n console.error(chalk.red(`Invalid ${name} address: ${value}`));\n process.exit(1);\n }\n return value as Address;\n}\n\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(validateAddress(opts.vault, \"vault\"));\n }\n // If no --vault flag, getVaultAddress() in vault.ts reads from config\n}\n\nconst program = new Command();\n\nprogram\n .name(\"sherwood\")\n .description(\"CLI for agent-managed investment syndicates\")\n .version(CLI_VERSION)\n .addOption(\n new Option(\"--chain <network>\", \"Target network\")\n .choices(VALID_NETWORKS)\n .default(\"base\"),\n )\n .option(\"--testnet\", \"Alias for --chain base-sepolia (deprecated)\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n let network: string = opts.chain;\n if (opts.testnet) {\n process.env.ENABLE_TESTNET = \"true\";\n if (network !== \"base\") {\n console.warn(\n chalk.yellow(\"[warn] --testnet ignored, --chain takes precedence\"),\n );\n } else {\n network = \"base-sepolia\";\n }\n }\n setNetwork(network as Network);\n if (getNetwork() !== \"base\") {\n console.log(chalk.yellow(`[${getNetwork()}]`));\n }\n });\n\n// ── Syndicate commands ──\nconst syndicate = program.command(\"syndicate\");\n\nsyndicate\n .command(\"create\")\n .description(\"Create a new syndicate via the factory (interactive)\")\n .option(\"--subdomain <name>\", \"ENS subdomain (skip prompt)\")\n .option(\"--name <name>\", \"Syndicate name (skip prompt)\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent identity token ID (skip prompt)\")\n .option(\"--asset <symbol-or-address>\", \"Vault asset: USDC, WETH, or a token address\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--metadata-uri <uri>\", \"Override metadata URI (skip IPFS upload)\")\n .option(\"--open-deposits\", \"Allow anyone to deposit (no whitelist)\")\n .option(\"--public-chat\", \"Enable dashboard spectator mode\", false)\n .option(\"-y, --yes\", \"Skip confirmation prompt (non-interactive mode)\", false)\n .action(async (opts) => {\n try {\n // ── Header ──\n console.log();\n console.log(LABEL(\" ◆ Create Syndicate\"));\n SEP();\n\n const wallet = getAccount();\n console.log(DIM(` Wallet: ${wallet.address}`));\n console.log(DIM(` Network: ${getChain().name}`));\n SEP();\n\n // ── Gather inputs (prompt if not provided via flags) ──\n\n const savedAgentId = getAgentId();\n\n const nonInteractive = opts.yes;\n\n const name = opts.name || (nonInteractive\n ? (() => { throw new Error(\"--name is required in non-interactive mode (-y)\"); })()\n : await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n }));\n\n const subdomain = opts.subdomain || (nonInteractive\n ? name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\")\n : await input({\n message: G(\"ENS subdomain\"),\n default: name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\"),\n validate: (v: string) => v.length >= 3 || \"Must be at least 3 characters\",\n }));\n\n const description = opts.description || (nonInteractive\n ? `${name} — a Sherwood syndicate`\n : await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n }));\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? (nonInteractive\n ? String(savedAgentId)\n : await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) }))\n : (nonInteractive\n ? \"0\"\n : await input({ message: G(\"Agent ID (ERC-8004)\"), validate: (v: string) => /^\\d+$/.test(v) || \"Must be a number\" }))\n );\n\n const openDeposits = opts.openDeposits !== undefined ? opts.openDeposits : (nonInteractive\n ? true\n : await confirm({\n message: G(\"Open deposits? (anyone can deposit)\"),\n default: true,\n }));\n\n // ── Resolve asset ──\n // Supported symbols (testnet + mainnet). Will expand on mainnet launch.\n const ASSET_SYMBOLS: Record<string, Address> = {\n USDC: TOKENS().USDC,\n WETH: TOKENS().WETH,\n };\n\n let asset: Address;\n if (opts.asset) {\n const upper = opts.asset.toUpperCase();\n if (ASSET_SYMBOLS[upper]) {\n asset = ASSET_SYMBOLS[upper];\n } else if (opts.asset.startsWith(\"0x\") && opts.asset.length === 42) {\n asset = opts.asset as Address;\n } else {\n const supported = Object.keys(ASSET_SYMBOLS).join(\", \");\n console.error(chalk.red(` Unknown asset \"${opts.asset}\". Use a symbol (${supported}) or a 0x address.`));\n process.exit(1);\n }\n } else if (nonInteractive) {\n // Default to WETH on chains without USDC, otherwise USDC\n asset = TOKENS().USDC !== \"0x0000000000000000000000000000000000000000\"\n ? ASSET_SYMBOLS.USDC\n : ASSET_SYMBOLS.WETH;\n } else {\n // Interactive prompt\n const assetChoice = await select({\n message: G(\"Vault asset (what token do depositors provide?)\"),\n choices: [\n { name: \"USDC\", value: \"USDC\", description: \"USD Coin (6 decimals)\" },\n { name: \"WETH\", value: \"WETH\", description: \"Wrapped Ether (18 decimals)\" },\n ],\n });\n asset = ASSET_SYMBOLS[assetChoice];\n }\n\n const publicClient = getPublicClient();\n const [decimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n ]);\n const symbol = `sw${assetSymbol}`;\n\n // ── Confirmation ──\n console.log();\n console.log(LABEL(\" ◆ Review\"));\n SEP();\n console.log(W(` Name: ${BOLD(name)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Description: ${DIM(description)}`));\n console.log(W(` Agent ID: #${agentIdStr}`));\n console.log(W(` Asset: ${assetSymbol} (${asset.slice(0, 10)}...)`));\n console.log(W(` Share token: ${symbol}`));\n console.log(W(` Open deposits: ${openDeposits ? G(\"yes\") : chalk.red(\"no (whitelist)\")}`));\n SEP();\n\n if (!nonInteractive) {\n const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\n }\n }\n\n // ── Upload metadata to IPFS ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {\n feeModel: \"none\",\n },\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(`IPFS upload failed — using inline metadata`));\n const json = JSON.stringify({ name, description, subdomain, asset: assetSymbol, openDeposits, createdBy: \"@sherwoodagent/cli\" });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Idempotent check: resume if subdomain already exists ──\n const existingId = await factoryLib.subdomainExists(subdomain);\n if (existingId !== null) {\n const existingInfo = await factoryLib.getSyndicate(existingId);\n const callerAddress = getAccount().address.toLowerCase();\n\n if (existingInfo.creator.toLowerCase() !== callerAddress) {\n console.error(chalk.red(`\\n ✖ Subdomain '${subdomain}' is already taken by another syndicate.\\n`));\n process.exit(1);\n }\n\n // Partial completion — creator already deployed, resume post-deploy steps\n console.log(chalk.yellow(`\\n ⚠ Syndicate '${subdomain}' already exists — resuming setup...\\n`));\n\n const spinner = ora({ text: W(\"Resuming setup...\"), color: \"green\" }).start();\n\n // Save to config\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", existingInfo.vault);\n addSyndicate(chainId, { subdomain, vault: existingInfo.vault, role: \"creator\" });\n setPrimarySyndicate(chainId, subdomain);\n\n // Register creator as agent (if not already)\n spinner.text = W(\"Checking agent registration...\");\n try {\n vaultLib.setVaultAddress(existingInfo.vault);\n const isAlreadyAgent = await vaultLib.isAgent(getAccount().address);\n if (!isAlreadyAgent) {\n spinner.text = W(\"Registering creator as agent...\");\n await vaultLib.registerAgent(BigInt(agentIdStr), getAccount().address);\n }\n } catch { /* non-fatal */ }\n\n // Create XMTP group (if not already)\n spinner.text = W(\"Checking chat group...\");\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n try {\n await xmtp.getGroup(xmtpClient, subdomain);\n // Group exists, skip\n } catch {\n // No group — create one\n spinner.text = W(\"Creating chat group...\");\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, existingInfo.vault as Address);\n cacheGroupId(subdomain, groupId);\n }\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not set up XMTP chat group\"));\n }\n\n // Register crons\n try {\n const cron = await loadCron();\n cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n } catch { /* non-fatal */ }\n\n spinner.stop();\n console.log();\n console.log(LABEL(\" ◆ Syndicate Setup Resumed\"));\n SEP();\n console.log(W(` ID: ${G(`#${existingId}`)}`));\n console.log(W(` Vault: ${G(existingInfo.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n const refParam = getAgentId() ? `?ref=${getAgentId()}` : \"\";\n console.log(W(` Share: ${G(`https://sherwood.sh/syndicate/${subdomain}${refParam}`)}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log();\n return;\n }\n\n // ── Deploy (fresh syndicate) ──\n const spinner = ora({ text: W(\"Deploying vault via factory...\"), color: \"green\" }).start();\n\n const result = await factoryLib.createSyndicate({\n creatorAgentId: BigInt(agentIdStr),\n metadataURI,\n asset,\n name,\n symbol,\n openDeposits,\n subdomain,\n });\n\n // Auto-save vault address + syndicate membership to config\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", result.vault);\n addSyndicate(chainId, { subdomain, vault: result.vault, role: \"creator\" });\n setPrimarySyndicate(chainId, subdomain);\n\n // ── Register creator as agent on the vault ──\n // Brief delay to let the RPC node sync its nonce after createSyndicate tx\n await new Promise((r) => setTimeout(r, 2000));\n spinner.text = W(\"Registering creator as agent...\");\n try {\n vaultLib.setVaultAddress(result.vault);\n const creatorAddress = getAccount().address;\n await vaultLib.registerAgent(\n BigInt(agentIdStr),\n creatorAddress, // agentAddress = creator EOA (direct execution)\n );\n } catch (regErr) {\n // Non-fatal — creator can register later via `syndicate add`\n console.warn(chalk.yellow(\"\\n ⚠ Could not auto-register creator as agent — register manually with `syndicate add`\"));\n }\n\n spinner.text = W(\"Setting up chat...\");\n\n // Create XMTP group for syndicate chat\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n cacheGroupId(subdomain, groupId);\n try {\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, result.vault as Address);\n } catch { /* ENS not available on all chains */ }\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not create XMTP chat group\"));\n console.warn(chalk.dim(` Recover later with: sherwood chat ${subdomain} init`));\n }\n\n // ── Auto-register participation crons ──\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (15m check + hourly summary)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n spinner.stop();\n\n // ── Success ──\n console.log();\n console.log(LABEL(\" ◆ Syndicate Created\"));\n SEP();\n console.log(W(` ID: ${G(`#${result.syndicateId}`)}`));\n console.log(W(` Vault: ${G(result.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(result.hash))}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n const refParam = getAgentId() ? `?ref=${getAgentId()}` : \"\";\n console.log(W(` Share: ${G(`https://sherwood.sh/syndicate/${subdomain}${refParam}`)}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"list\")\n .description(\"List active syndicates (queries subgraph, falls back to on-chain)\")\n .option(\"--creator <address>\", \"Filter by creator address\")\n .action(async (opts) => {\n const spinner = ora(\"Loading syndicates...\").start();\n try {\n // Try subgraph first (fast, indexed), fall back to on-chain\n let syndicates: { id: string | bigint; vault: string; creator: string; metadataURI: string; createdAt: string | bigint; totalDeposits?: string; totalWithdrawals?: string; subdomain?: string }[];\n\n if (process.env.SUBGRAPH_URL) {\n const result = await subgraphLib.getActiveSyndicates(opts.creator);\n syndicates = result;\n } else {\n const result = await factoryLib.getActiveSyndicates();\n syndicates = result.map((s) => ({\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n subdomain: s.subdomain,\n }));\n }\n\n spinner.stop();\n\n if (syndicates.length === 0) {\n console.log(chalk.dim(\"No active syndicates found.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Active Syndicates (${syndicates.length})`));\n if (!process.env.SUBGRAPH_URL) {\n console.log(chalk.dim(\" (Set SUBGRAPH_URL for faster indexed queries)\"));\n }\n console.log(chalk.dim(\"─\".repeat(70)));\n\n for (const s of syndicates) {\n const ts = typeof s.createdAt === \"string\" ? Number(s.createdAt) : Number(s.createdAt);\n const date = new Date(ts * 1000).toLocaleDateString();\n const ensName = s.subdomain ? `${s.subdomain}.sherwoodagent.eth` : \"\";\n console.log(` #${s.id} ${chalk.bold(ensName || String(s.vault))}`);\n if (ensName) console.log(` Vault: ${chalk.cyan(String(s.vault))}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Created: ${date}`);\n if (s.totalDeposits) {\n console.log(` Deposits: ${s.totalDeposits} USDC`);\n }\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n }\n } catch (err) {\n spinner.fail(\"Failed to load syndicates\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"info\")\n .description(\"Display syndicate details by ID or subdomain\")\n .argument(\"<id>\", \"Syndicate ID or subdomain name\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading syndicate info...\").start();\n try {\n let id: bigint;\n if (/^\\d+$/.test(idStr)) {\n id = BigInt(idStr);\n } else {\n // Resolve subdomain to syndicate ID\n const resolved = await resolveSyndicate(idStr);\n id = resolved.id;\n }\n const info = await factoryLib.getSyndicate(id);\n spinner.stop();\n\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n console.log(chalk.red(`Syndicate #${id} not found.`));\n process.exit(1);\n }\n\n const date = new Date(Number(info.createdAt) * 1000).toLocaleDateString();\n console.log();\n console.log(chalk.bold(`Syndicate #${info.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n if (info.subdomain) {\n console.log(` ENS: ${chalk.bold(`${info.subdomain}.sherwoodagent.eth`)}`);\n }\n console.log(` Vault: ${chalk.cyan(info.vault)}`);\n console.log(` Creator: ${info.creator}`);\n console.log(` Created: ${date}`);\n console.log(` Active: ${info.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n if (info.metadataURI) {\n console.log(` Metadata: ${chalk.dim(info.metadataURI)}`);\n }\n\n // Show XMTP group ID if cached\n if (info.subdomain) {\n const xmtpGroupId = getCachedGroupId(info.subdomain);\n if (xmtpGroupId) {\n console.log(` XMTP Group: ${chalk.cyan(xmtpGroupId)}`);\n }\n }\n\n // Also show vault info\n vaultLib.setVaultAddress(info.vault);\n const vaultInfo = await vaultLib.getVaultInfo();\n console.log();\n console.log(chalk.bold(\" Vault Stats\"));\n console.log(` Total Assets: ${vaultInfo.totalAssets}`);\n console.log(` Agent Count: ${vaultInfo.agentCount}`);\n console.log(` Redemptions Locked: ${vaultInfo.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(vaultInfo.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load syndicate info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"update-metadata\")\n .description(\"Update syndicate metadata (creator only)\")\n .requiredOption(\"--id <id>\", \"Syndicate ID\")\n .option(\"--name <name>\", \"Syndicate name\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--uri <uri>\", \"Direct metadata URI (skips IPFS upload)\")\n .action(async (opts) => {\n const spinner = ora({ text: W(\"Loading syndicate...\"), color: \"green\" }).start();\n try {\n const syndicateId = BigInt(opts.id);\n let metadataURI = opts.uri;\n\n if (!metadataURI) {\n const info = await factoryLib.getSyndicate(syndicateId);\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n spinner.fail(`Syndicate #${opts.id} not found.`);\n process.exit(1);\n }\n\n const name = opts.name || info.subdomain;\n const description = opts.description || `${name} — a Sherwood syndicate on ${info.subdomain}.sherwoodagent.eth`;\n\n spinner.text = W(\"Uploading metadata to IPFS...\");\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {},\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.text = W(\"Updating on-chain metadata...\");\n }\n\n const hash = await factoryLib.updateMetadata(syndicateId, metadataURI);\n spinner.succeed(G(`Metadata updated`));\n console.log(DIM(` IPFS: ${metadataURI}`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Metadata update failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve-depositor\")\n .description(\"Approve an address to deposit (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to approve\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Approving depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.approveDepositor(depositor);\n spinner.succeed(`Depositor approved: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"remove-depositor\")\n .description(\"Remove an address from the depositor whitelist (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to remove\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Removing depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.removeDepositor(depositor);\n spinner.succeed(`Depositor removed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Removal failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"add\")\n .description(\"Register an agent on a syndicate vault (creator only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID (resolved from wallet if omitted)\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault address from --vault flag or config\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n\n // Verify caller is the syndicate creator\n const { creator, subdomain } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can add agents\");\n process.exit(1);\n }\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Resolve agent ID: use --agent-id if provided, otherwise look up from wallet\n let agentId: bigint;\n if (opts.agentId) {\n agentId = BigInt(opts.agentId);\n } else {\n const { AGENT_REGISTRY } = await import(\"./lib/addresses.js\");\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n\n // Chains without ERC-8004 (e.g. HyperEVM) — contract skips identity check\n if (registry === \"0x0000000000000000000000000000000000000000\") {\n agentId = 0n;\n } else {\n spinner.text = \"Looking up ERC-8004 identity from wallet...\";\n const client = getPublicClient();\n\n const balance = await client.readContract({\n address: registry,\n abi: [{\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n }] as const,\n functionName: \"balanceOf\",\n args: [agentWallet],\n }) as bigint;\n\n if (balance === 0n) {\n spinner.fail(\"Agent wallet does not own an ERC-8004 identity NFT\");\n console.error(chalk.dim(\" Mint one first: sherwood identity mint --name <name>\"));\n process.exit(1);\n }\n\n const tokenId = await client.readContract({\n address: registry,\n abi: [{\n name: \"tokenOfOwnerByIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }, { name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n }] as const,\n functionName: \"tokenOfOwnerByIndex\",\n args: [agentWallet, 0n],\n }) as bigint;\n\n agentId = tokenId;\n console.log(chalk.dim(` Resolved agent ID: #${agentId}`));\n }\n }\n\n spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(agentId, agentWallet);\n spinner.succeed(`Agent registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n\n // Auto-add agent to XMTP chat group\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(chalk.dim(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n } catch (err) {\n spinner.fail(\"Registration failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"share\")\n .description(\"Print the shareable dashboard URL for your syndicate\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (default: primary)\")\n .action(async (opts) => {\n try {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n console.error(chalk.red(\" No syndicate configured. Pass --subdomain <name> or run 'syndicate create/join' first.\"));\n process.exit(1);\n }\n\n // Verify syndicate exists on-chain\n const syndicateInfo = await resolveSyndicate(subdomain);\n\n const agentId = getAgentId();\n const refParam = agentId ? `?ref=${agentId}` : \"\";\n const dashboardUrl = `https://sherwood.sh/syndicate/${subdomain}${refParam}`;\n\n console.log();\n console.log(LABEL(\" ◆ Share Your Syndicate\"));\n SEP();\n console.log(W(` Dashboard: ${G(dashboardUrl)}`));\n console.log(W(` ENS: ${DIM(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Vault: ${DIM(syndicateInfo.vault)}`));\n console.log(W(` Join CLI: ${DIM(`sherwood syndicate join --subdomain ${subdomain}`)}`));\n SEP();\n\n // Try to copy to clipboard (optional — uses pbcopy/xclip if available)\n try {\n const { exec } = await import(\"node:child_process\");\n const platform = (await import(\"node:os\")).platform();\n const cmd = platform === \"darwin\" ? \"pbcopy\" : \"xclip -selection clipboard\";\n const proc = exec(cmd);\n proc.stdin?.write(dashboardUrl);\n proc.stdin?.end();\n console.log(G(\" ✓ Dashboard URL copied to clipboard\"));\n } catch {\n // clipboard not available — no problem\n }\n console.log();\n } catch (err) {\n console.error(chalk.red(` ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n// ── EAS Join Request / Approval Commands ──\n\nsyndicate\n .command(\"join\")\n .description(\"Request to join a syndicate (creates an EAS attestation)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain to join\")\n .option(\"--ref <agentId>\", \"Referrer agent ID (from invite link)\")\n .option(\"--message <text>\", \"Message to the creator\", \"Requesting to join your syndicate\")\n .action(async (opts) => {\n const spinner = ora(\"Resolving syndicate...\").start();\n try {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n spinner.fail(\"No syndicate configured. Pass --subdomain <name> or run 'syndicate create' first.\");\n process.exit(1);\n }\n\n const agentId = getAgentId();\n if (!agentId) {\n spinner.fail(\"No agent identity found. Run 'sherwood identity mint' first.\");\n process.exit(1);\n }\n\n const syndicate = await resolveSyndicate(subdomain);\n const callerAddress = getAccount().address;\n\n // Check if already registered as an agent on this vault\n spinner.text = \"Checking membership...\";\n vaultLib.setVaultAddress(syndicate.vault);\n const alreadyAgent = await vaultLib.isAgent(callerAddress);\n if (alreadyAgent) {\n spinner.succeed(\"You are already a registered agent on this syndicate\");\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n // Auto-register participation crons (idempotent)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(chalk.green(\" ✓ Participation crons registered\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(chalk.dim(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n return;\n }\n\n // Check for existing pending join request\n spinner.text = \"Checking pending requests...\";\n const pendingRequests = await easLib.queryJoinRequests(syndicate.creator);\n const existingRequest = pendingRequests.find(\n (r) => r.attester.toLowerCase() === callerAddress.toLowerCase()\n && r.decoded.vault.toLowerCase() === syndicate.vault.toLowerCase(),\n );\n if (existingRequest) {\n spinner.succeed(\"You already have a pending join request for this syndicate\");\n console.log(chalk.dim(` Attestation: ${existingRequest.uid}`));\n console.log(chalk.dim(` Submitted: ${new Date(existingRequest.time * 1000).toLocaleString()}`));\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n return;\n }\n\n spinner.text = \"Creating join request attestation...\";\n const referrerAgentId = opts.ref ? parseInt(opts.ref, 10) : undefined;\n const { uid, hash } = await easLib.createJoinRequest(\n syndicate.id,\n BigInt(agentId),\n syndicate.vault,\n syndicate.creator,\n opts.message,\n referrerAgentId,\n );\n\n // Pre-register XMTP identity so the creator can add us to the group on approval\n try {\n spinner.text = \"Registering XMTP identity...\";\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n spinner.succeed(\"Join request created (XMTP identity ready)\");\n } catch {\n spinner.succeed(\"Join request created\");\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity — creator may not be able to auto-add you to chat\"));\n }\n\n // Save syndicate membership + set as primary\n addSyndicate(getChain().id, { subdomain, vault: syndicate.vault, role: \"agent\" });\n setPrimarySyndicate(getChain().id, subdomain);\n\n // Auto-register participation crons (will HEARTBEAT_OK until approved)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (will activate after approval)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n console.log();\n console.log(LABEL(\" ◆ Join Request Submitted\"));\n SEP();\n console.log(W(` Syndicate: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Agent ID: #${agentId}`));\n console.log(W(` Creator: ${DIM(syndicate.creator)}`));\n console.log(W(` Attestation: ${DIM(uid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(uid))}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(hash))}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log(G(\" ✓ The creator can review with:\"));\n console.log(DIM(` sherwood syndicate requests --subdomain ${subdomain}`));\n console.log();\n } catch (err) {\n spinner.fail(\"Join request failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"requests\")\n .description(\"View pending join requests for a syndicate (creator only)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n const spinner = ora(\"Loading join requests...\").start();\n try {\n let creatorAddress: Address;\n let subdomain: string;\n let syndicateVault: Address;\n\n // Resolve syndicate: --subdomain > primary syndicate > --vault > config vault\n const resolvedSubdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (resolvedSubdomain) {\n const syndicateInfo = await resolveSyndicate(resolvedSubdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = resolvedSubdomain;\n syndicateVault = syndicateInfo.vault as Address;\n } else {\n resolveVault(opts);\n syndicateVault = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(syndicateVault);\n creatorAddress = syndicateInfo.creator;\n subdomain = syndicateInfo.subdomain;\n }\n\n // Verify caller is creator\n const callerAddress = getAccount().address.toLowerCase();\n if (creatorAddress.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can view join requests\");\n process.exit(1);\n }\n\n spinner.text = \"Querying EAS attestations...\";\n const [allRequests, approvals] = await Promise.all([\n easLib.queryJoinRequests(creatorAddress),\n easLib.queryApprovals(creatorAddress),\n ]);\n\n // Filter out agents that have already been approved for the same vault\n const approvedKeys = new Set(\n approvals\n .filter((a) => a.decoded.vault.toLowerCase() === syndicateVault.toLowerCase())\n .map((a) => a.decoded.agentId.toString()),\n );\n const requests = allRequests.filter(\n (r) => !approvedKeys.has(r.decoded.agentId.toString())\n && r.decoded.vault.toLowerCase() === syndicateVault.toLowerCase(),\n );\n\n spinner.stop();\n\n if (requests.length === 0) {\n console.log(DIM(\"\\n No pending join requests.\\n\"));\n return;\n }\n\n console.log();\n console.log(LABEL(` ◆ Pending Join Requests (${requests.length})`));\n SEP();\n\n for (let i = 0; i < requests.length; i++) {\n const req = requests[i];\n const date = new Date(req.time * 1000).toLocaleString();\n const referrer = easLib.parseReferrer(req.decoded.message);\n const cleanMessage = easLib.stripReferrerPrefix(req.decoded.message);\n console.log(W(` ${i + 1}. Agent #${req.decoded.agentId} ${DIM(`(${req.attester})`)}`));\n console.log(DIM(` Message: \"${cleanMessage}\"`));\n if (referrer !== null) {\n console.log(G(` Referred by: Agent #${referrer}`));\n }\n console.log(DIM(` Requested: ${date}`));\n console.log(DIM(` Attestation: ${req.uid}`));\n console.log();\n }\n\n console.log(G(\" To approve:\"));\n console.log(DIM(` sherwood syndicate approve --agent-id <id> --wallet <addr>`));\n console.log(G(\" To reject:\"));\n console.log(DIM(` sherwood syndicate reject --attestation <uid>`));\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load requests\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve\")\n .description(\"Approve an agent join request (registers agent + creates EAS approval)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (alternative to --vault)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault: --subdomain > primary syndicate > --vault > config vault\n const approveSubdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (approveSubdomain && !opts.vault) {\n const syndicateInfo = await resolveSyndicate(approveSubdomain);\n vaultLib.setVaultAddress(syndicateInfo.vault);\n } else {\n resolveVault(opts);\n }\n const vaultAddress = vaultLib.getVaultAddress();\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Verify caller is creator\n const { creator, subdomain, id: syndicateId } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can approve agents\");\n process.exit(1);\n }\n\n // 1. Register agent on-chain (same as syndicate add)\n spinner.text = \"Registering agent on vault...\";\n let agentWasRegistered = false;\n try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n agentWasRegistered = true;\n console.log(DIM(` Agent registered: ${getExplorerUrl(regHash)}`));\n } catch (regErr) {\n const msg = regErr instanceof Error ? regErr.message : String(regErr);\n if (msg.includes(\"0xe098d3ee\") || msg.includes(\"AgentAlreadyRegistered\")) {\n console.log(DIM(\" Agent already registered on vault — skipping\"));\n } else {\n throw regErr;\n }\n }\n\n // Brief delay after on-chain registration to let the RPC node sync its nonce\n if (agentWasRegistered) {\n await new Promise((r) => setTimeout(r, 2000));\n }\n\n // 2. Create AGENT_APPROVED attestation (skip if one already exists)\n spinner.text = \"Checking for existing approval...\";\n const existingApprovals = await easLib.queryApprovals(getAccount().address);\n const alreadyApproved = existingApprovals.find(\n (a) => a.decoded.agentId === BigInt(opts.agentId) && a.decoded.vault.toLowerCase() === vaultAddress.toLowerCase(),\n );\n\n let approvalUid: `0x${string}`;\n if (alreadyApproved) {\n approvalUid = alreadyApproved.uid;\n console.log(DIM(` Approval attestation already exists — skipping`));\n } else {\n spinner.text = \"Creating approval attestation...\";\n const result = await easLib.createApproval(\n syndicateId,\n BigInt(opts.agentId),\n vaultAddress,\n agentWallet,\n );\n approvalUid = result.uid;\n }\n\n // 3. Auto-add agent to XMTP chat group\n try {\n spinner.text = \"Adding to chat...\";\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(DIM(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n\n spinner.succeed(\"Agent approved and registered\");\n console.log();\n console.log(LABEL(\" ◆ Agent Approved\"));\n SEP();\n console.log(W(` Agent ID: #${opts.agentId}`));\n console.log(W(` Wallet: ${G(opts.wallet)}`));\n console.log(W(` Approval: ${DIM(approvalUid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(approvalUid))}`));\n SEP();\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"reject\")\n .description(\"Reject a join request by revoking its attestation\")\n .requiredOption(\"--attestation <uid>\", \"Join request attestation UID to revoke\")\n .action(async (opts) => {\n const spinner = ora(\"Revoking attestation...\").start();\n try {\n const hash = await easLib.revokeAttestation(\n EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n opts.attestation as `0x${string}`,\n );\n spinner.succeed(\"Join request rejected\");\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Rejection failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"leave\")\n .description(\"Leave a syndicate — removes participation crons and session state\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain to leave\")\n .action(async (opts) => {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n console.error(chalk.red(\" No syndicate configured. Pass --subdomain <name>.\"));\n process.exit(1);\n }\n const spinner = ora(\"Cleaning up...\").start();\n try {\n // 1. Remove participation crons (if OpenClaw)\n let cronsRemoved = false;\n try {\n const cron = await loadCron();\n const result = cron.unregisterSyndicateCrons(subdomain, isTestnet());\n cronsRemoved = result.removed;\n } catch { /* non-fatal */ }\n\n // 2. Reset session state\n const { resetSession } = await import(\"./lib/session.js\");\n resetSession(subdomain);\n\n spinner.succeed(\"Left syndicate\");\n if (cronsRemoved) {\n console.log(G(\" ✓ Participation crons removed\"));\n }\n console.log(G(\" ✓ Session state cleared\"));\n console.log();\n console.log(chalk.dim(\" Note: This does not remove you on-chain. To exit your position:\"));\n console.log(chalk.dim(\" sherwood vault balance — check your LP share balance\"));\n console.log(chalk.dim(\" Redeem shares via the vault contract or dashboard\"));\n console.log();\n } catch (err) {\n spinner.fail(\"Leave failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"set-primary\")\n .description(\"Set the active syndicate for CLI commands (auto-used when --subdomain is omitted)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n try {\n const chainId = getChain().id;\n const memberships = getSyndicates(chainId);\n\n if (!opts.subdomain && !opts.vault) {\n // List syndicates and show which is primary\n const primary = getPrimarySyndicate(chainId);\n if (memberships.length === 0) {\n console.log(DIM(\"\\n No syndicates saved. Create or join one first.\\n\"));\n return;\n }\n console.log();\n console.log(LABEL(\" ◆ Your Syndicates\"));\n SEP();\n for (const m of memberships) {\n const isPrimary = primary?.subdomain === m.subdomain;\n const marker = isPrimary ? G(\" ★\") : \"\";\n console.log(W(` ${m.subdomain}.sherwoodagent.eth${marker} ${DIM(`(${m.role})`)}`));\n console.log(DIM(` vault: ${m.vault}`));\n }\n SEP();\n if (memberships.length > 1) {\n console.log(DIM(\" Switch with: sherwood syndicate set-primary --subdomain <name>\"));\n }\n console.log();\n return;\n }\n\n let target: string | undefined;\n\n if (opts.subdomain) {\n // Verify it's in our list\n const found = memberships.find((m) => m.subdomain === opts.subdomain);\n if (!found) {\n // Resolve on-chain to verify it exists, then add it\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n addSyndicate(chainId, { subdomain: opts.subdomain, vault: syndicateInfo.vault, role: \"agent\" });\n }\n target = opts.subdomain;\n } else if (opts.vault) {\n // Find by vault address\n const found = memberships.find(\n (m) => m.vault.toLowerCase() === opts.vault.toLowerCase(),\n );\n if (found) {\n target = found.subdomain;\n } else {\n // Resolve on-chain\n const syndicateInfo = await resolveVaultSyndicate(validateAddress(opts.vault, \"vault\"));\n addSyndicate(chainId, { subdomain: syndicateInfo.subdomain, vault: opts.vault, role: \"agent\" });\n target = syndicateInfo.subdomain;\n }\n }\n\n if (!target) {\n console.error(chalk.red(\" Could not resolve syndicate. Pass --subdomain or --vault.\"));\n process.exit(1);\n }\n\n setPrimarySyndicate(chainId, target);\n console.log(G(`\\n ✓ Primary syndicate set to ${target}.sherwoodagent.eth\\n`));\n } catch (err) {\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n// ── Vault commands ──\nconst vaultCmd = program.command(\"vault\");\n\nvaultCmd\n .command(\"deposit\")\n .description(\"Deposit into a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--amount <amount>\", \"Amount to deposit (in asset units)\")\n .option(\"--use-eth\", \"Auto-wrap ETH → WETH before depositing (for WETH vaults)\")\n .action(async (opts) => {\n resolveVault(opts);\n const decimals = await vaultLib.getAssetDecimals();\n const amount = parseUnits(opts.amount, decimals);\n\n // Pre-flight checks — catch issues before submitting transactions\n try {\n if (!opts.useEth) {\n await vaultLib.preflightDeposit(amount);\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n const spinner = ora(`Depositing ${opts.amount}...`).start();\n try {\n let hash;\n if (opts.useEth) {\n spinner.text = `Wrapping ETH + depositing ${opts.amount}...`;\n hash = await vaultLib.depositWithEthWrap(amount);\n } else {\n hash = await vaultLib.deposit(amount);\n }\n spinner.succeed(`Deposited: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Deposit failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"info\")\n .description(\"Display vault state\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading vault info...\").start();\n try {\n const info = await vaultLib.getVaultInfo();\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"Vault Info\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Address: ${info.address}`);\n console.log(` Total Assets: ${info.totalAssets}`);\n console.log(` Agent Count: ${info.agentCount}`);\n console.log(` Redemptions Locked: ${info.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(info.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load vault info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"balance\")\n .description(\"Show LP share balance and asset value\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--address <address>\", \"Address to check (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading balance...\").start();\n try {\n const balance = await vaultLib.getBalance(opts.address as Address | undefined);\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"LP Position\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Shares: ${balance.shares.toString()}`);\n console.log(` Asset Value: ${balance.assetsValue}`);\n console.log(` % of Vault: ${balance.percentOfVault}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"redeem\")\n .description(\"Redeem vault shares for the underlying asset (ERC-4626)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--shares <amount>\", \"Shares to redeem in whole-share units (default: all)\")\n .option(\"--receiver <address>\", \"Receiver of the underlying asset (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n\n // Vault shares use (assetDecimals + _decimalsOffset) where offset = assetDecimals.\n // For USDC (6) this is 12. Treat --shares as whole-share units and scale by decimals * 2.\n const assetDecimals = await vaultLib.getAssetDecimals();\n const shareDecimals = assetDecimals * 2;\n\n let shares: bigint;\n try {\n if (opts.shares) {\n shares = parseUnits(opts.shares, shareDecimals);\n } else {\n shares = await vaultLib.getShareBalance();\n if (shares === 0n) {\n console.error(chalk.red(\"\\n ✖ No shares to redeem.\\n\"));\n process.exit(1);\n }\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n if (opts.receiver && !isAddress(opts.receiver)) {\n console.error(chalk.red(`\\n ✖ Invalid receiver address: ${opts.receiver}\\n`));\n process.exit(1);\n }\n\n try {\n await vaultLib.preflightRedeem(shares);\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n const sharesDisplay = formatUnits(shares, shareDecimals);\n const spinner = ora(`Redeeming ${sharesDisplay} shares...`).start();\n try {\n const { hash, assetsOut } = await vaultLib.redeem(\n shares,\n opts.receiver as Address | undefined,\n );\n spinner.succeed(`Redeemed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n console.log(` Assets received: ${formatUnits(assetsOut, assetDecimals)}`);\n } catch (err) {\n spinner.fail(\"Redeem failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n// ── Strategy commands ──\nconst strategy = program.command(\"strategy\").description(\"Strategy templates — list, clone, propose\");\nregisterStrategyTemplateCommands(strategy);\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(async () => {\n const { MessariProvider, NansenProvider } = await import(\"./providers/research/index.js\");\n const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];\n for (const p of providers) {\n const info = p.info();\n console.log(`\\n${info.name} (${info.type})`);\n console.log(` Capabilities: ${info.capabilities.join(\", \")}`);\n console.log(` Chains: ${info.supportedChains.map((c) => c.name).join(\", \")}`);\n }\n });\n\n// ── Chat commands (lazy-loaded — requires @xmtp/cli binary) ──\ntry {\n const { registerChatCommands } = await import(\"./commands/chat.js\");\n registerChatCommands(program);\n} catch {\n program\n .command(\"chat <name> [action] [actionArgs...]\")\n .description(\"Syndicate chat (XMTP) — requires @xmtp/cli\")\n .action(() => {\n console.error(chalk.red(\"XMTP CLI not available.\"));\n console.error(chalk.dim(\"Install with: npm install -g @xmtp/cli\"));\n console.error(chalk.dim(\"Or reinstall: npm i -g @sherwoodagent/cli\"));\n process.exit(1);\n });\n}\n\n// ── Session commands ──\nconst { registerSessionCommands } = await import(\"./commands/session.js\");\nregisterSessionCommands(program);\n\n// ── Venice commands ──\nregisterVeniceCommands(program);\n\n// ── Allowance commands ──\nregisterAllowanceCommands(program);\n\n// ── Identity commands ──\nregisterIdentityCommands(program);\n\n// ── Proposal commands ──\nregisterProposalCommands(program);\n\n// ── Governor commands ──\nregisterGovernorCommands(program);\n\n// ── Guardian delegation commands (V1.5) ──\nregisterGuardianCommands(program);\n\n// ── Research commands ──\nconst { registerResearchCommands } = await import(\"./commands/research.js\");\nregisterResearchCommands(program);\n\n// ── Agent commands ──\nconst { registerAgentCommands } = await import(\"./commands/agent.js\");\nregisterAgentCommands(program);\n\n// ── Trade commands ──\nconst { registerTradeCommands } = await import(\"./commands/trade.js\");\nregisterTradeCommands(program);\n\n// ── Config commands ──\nconst configCmd = program.command(\"config\");\n\nconfigCmd\n .command(\"set\")\n .description(\"Save settings to ~/.sherwood/config.json (persists across sessions)\")\n .option(\"--private-key <key>\", \"Wallet private key (0x-prefixed)\")\n .option(\"--vault <address>\", \"Default SyndicateVault address\")\n .option(\"--rpc <url>\", \"Custom RPC URL for the active --chain network\")\n .option(\"--notify-to <id>\", \"Destination for cron summaries (Telegram chat ID, phone, etc.)\")\n .option(\"--uniswap-api-key <key>\", \"Uniswap Trading API key (from developers.uniswap.org)\")\n .option(\"--venice-api-key <key>\", \"Venice AI inference API key\")\n .option(\"--xmtp-group <subdomain:groupId>\", \"Cache an XMTP group ID for a syndicate (e.g. my-fund:abc123)\")\n .action((opts) => {\n let saved = false;\n\n if (opts.privateKey) {\n setPrivateKey(opts.privateKey);\n const account = getAccount();\n console.log(chalk.green(\"Private key saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Wallet: ${account.address}`));\n saved = true;\n }\n\n if (opts.vault) {\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", opts.vault);\n console.log(chalk.green(`Vault saved to ~/.sherwood/config.json (chain ${chainId})`));\n console.log(chalk.dim(` Vault: ${opts.vault}`));\n saved = true;\n }\n\n if (opts.rpc) {\n const network = getNetwork();\n setConfigRpcUrl(network, opts.rpc);\n console.log(chalk.green(`RPC URL saved for ${network}`));\n console.log(chalk.dim(` RPC: ${opts.rpc}`));\n saved = true;\n }\n\n if (opts.notifyTo) {\n setNotifyTo(opts.notifyTo);\n console.log(chalk.green(\"Notify destination saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Notify to: ${opts.notifyTo}`));\n saved = true;\n }\n\n if (opts.uniswapApiKey) {\n setUniswapApiKey(opts.uniswapApiKey);\n console.log(chalk.green(\"Uniswap API key saved to ~/.sherwood/config.json\"));\n saved = true;\n }\n\n if (opts.veniceApiKey) {\n setVeniceApiKey(opts.veniceApiKey);\n console.log(chalk.green(\"Venice API key saved to ~/.sherwood/config.json\"));\n saved = true;\n }\n\n if (opts.xmtpGroup) {\n const parts = opts.xmtpGroup.split(\":\");\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n console.log(chalk.red(\"Format: --xmtp-group <subdomain>:<groupId>\"));\n process.exit(1);\n }\n cacheGroupId(parts[0], parts[1]);\n console.log(chalk.green(`XMTP group ID cached for ${parts[0]}`));\n console.log(chalk.dim(` Group ID: ${parts[1]}`));\n saved = true;\n }\n\n if (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault, --rpc, --notify-to, --uniswap-api-key, --venice-api-key, --xmtp-group\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const network = getNetwork();\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n const customRpc = config.rpc?.[network];\n\n console.log();\n console.log(chalk.bold(`Sherwood Config`));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(` Network: ${chalk.cyan(network)} (chain ${chainId})`);\n console.log(` RPC: ${customRpc ? chalk.green(customRpc) : chalk.dim(\"default\")}`);\n console.log(` Wallet: ${config.privateKey ? chalk.green(\"configured\") : chalk.dim(\"not set\")}`);\n console.log(` Agent ID: ${config.agentId ?? chalk.dim(\"not set\")}`);\n console.log(` Vault: ${contracts.vault ?? chalk.dim(\"not set\")}`);\n console.log(` Uniswap: ${getUniswapApiKey() ? chalk.green(\"API key configured\") : chalk.dim(\"not set\")}`);\n console.log(` Venice: ${getVeniceApiKey() ? chalk.green(\"API key configured\") : chalk.dim(\"not set\")}`);\n\n // Show XMTP group IDs\n const groupEntries = Object.entries(config.groupCache || {}).filter(([, v]) => v);\n if (groupEntries.length > 0) {\n console.log();\n console.log(chalk.bold(\" XMTP Groups\"));\n for (const [sub, gid] of groupEntries) {\n console.log(` ${sub}: ${chalk.cyan(gid)}`);\n }\n }\n\n console.log();\n console.log(chalk.dim(\" Config file: ~/.sherwood/config.json\"));\n console.log();\n });\n\nprogram.parse();\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address, Chain } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { LendingProvider, ProviderInfo, DepositParams, BorrowParams, RepayParams, WithdrawParams, TxResult, LendingPosition } from \"../types.js\";\nimport { MOONWELL as getMoonwell } from \"../lib/addresses.js\";\n\nexport class MoonwellProvider implements LendingProvider {\n info(): ProviderInfo {\n return {\n name: \"moonwell\",\n type: \"lending\",\n capabilities: [\n \"lend.deposit\",\n \"lend.borrow\",\n \"lend.repay\",\n \"lend.withdraw\",\n \"lend.positions\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async depositCollateral(params: DepositParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async borrow(params: BorrowParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async repay(params: RepayParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async withdrawCollateral(params: WithdrawParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async getPosition(account: Address): Promise<LendingPosition> {\n throw new Error(\"Not implemented\");\n }\n}\n","/**\n * Strategy template commands — clone, build calls, propose, rebalance, status.\n *\n * Replaces the old strategy registry commands with template-based workflow:\n * sherwood strategy list — show available templates\n * sherwood strategy clone — clone + initialize a template\n * sherwood strategy propose — clone + init + build calls + submit proposal (all-in-one)\n * sherwood strategy status — read portfolio allocations + state\n * sherwood strategy rebalance — sell-all/re-buy at current target weights (Portfolio only)\n */\n\nimport type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, formatUnits, isAddress, erc20Abi, encodeAbiParameters, decodeAbiParameters } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt, formatContractError } from \"../lib/client.js\";\nimport { getChain, getExplorerUrl, getNetwork, CHAIN_REGISTRY } from \"../lib/network.js\";\nimport { getCachedSwapRoute, cacheSwapRoute, type SwapRoute } from \"../lib/config.js\";\nimport { TOKENS, MOONWELL, VENICE, AERODROME, UNISWAP, STRATEGY_TEMPLATES, SYNTHRA, CHAINLINK } from \"../lib/addresses.js\";\nimport { BASE_STRATEGY_ABI, PORTFOLIO_STRATEGY_ABI, SYNDICATE_VAULT_ABI } from \"../lib/abis.js\";\nimport { cloneTemplate } from \"../lib/clone.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { formatBatch } from \"../lib/batch.js\";\n\nimport * as moonwellBuilder from \"../strategies/moonwell-supply-template.js\";\nimport * as veniceBuilder from \"../strategies/venice-inference-template.js\";\nimport * as aerodromeBuilder from \"../strategies/aerodrome-lp-template.js\";\nimport * as wstethBuilder from \"../strategies/wsteth-moonwell-template.js\";\nimport * as mamoBuilder from \"../strategies/mamo-yield-template.js\";\nimport * as portfolioBuilder from \"../strategies/portfolio-template.js\";\nimport * as hyperliquidPerpBuilder from \"../strategies/hyperliquid-perp-template.js\";\n\nimport { concat, numberToHex, size } from \"viem\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Uniswap V3 swap routing helpers ──\n\n/**\n * Encode Uniswap V3 packed path: token (20 bytes) + fee (3 bytes) + token (20 bytes) [+ fee + token ...]\n */\nfunction encodeV3Path(tokens: Address[], fees: number[]): Hex {\n if (tokens.length !== fees.length + 1) throw new Error(\"tokens.length must be fees.length + 1\");\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // fee as 3 bytes (uint24)\n parts.push(numberToHex(fees[i], { size: 3 }));\n }\n }\n return concat(parts);\n}\n\n/**\n * Build swapExtraData for the UniswapSwapAdapter.\n *\n * Mode 0 — single-hop: 0x00 + abi.encode(uint24 fee)\n * Mode 1 — multi-hop: 0x01 + abi.encode(bytes path)\n *\n * For Synthra (Robinhood), extraData is just abi.encode(uint24 fee) with no mode prefix.\n */\nfunction buildSwapExtraData(\n network: string,\n tokenIn: Address,\n tokenOut: Address,\n feeTier: number,\n hop?: { via: Address; feeIn: number; feeOut: number },\n): Hex {\n if (network === \"robinhood-testnet\") {\n // SynthraDirectAdapter: plain abi.encode(uint24 fee)\n return encodeAbiParameters([{ type: \"uint24\" }], [feeTier]);\n }\n\n if (hop) {\n // Multi-hop: tokenIn → hop.via → tokenOut\n const path = encodeV3Path([tokenIn, hop.via, tokenOut], [hop.feeIn, hop.feeOut]);\n const encoded = encodeAbiParameters([{ type: \"bytes\" }], [path]);\n return `0x01${encoded.slice(2)}` as Hex;\n }\n\n // Single-hop: mode 0\n const encoded = encodeAbiParameters([{ type: \"uint24\" }], [feeTier]);\n return `0x00${encoded.slice(2)}` as Hex;\n}\n\n/**\n * Auto-detect swap route for a token pair on Uniswap V3.\n * Returns { direct: true, feeTier } or { direct: false, hop } or null if no route found.\n */\nasync function detectSwapRoute(\n asset: Address,\n token: Address,\n preferredFeeTier: number,\n): Promise<{ extraData: Hex; routeDesc: string } | null> {\n const network = getNetwork();\n if (network === \"robinhood-testnet\") {\n return {\n extraData: buildSwapExtraData(network, asset, token, preferredFeeTier),\n routeDesc: `direct (fee ${preferredFeeTier})`,\n };\n }\n\n const chainId = CHAIN_REGISTRY[network].chain.id;\n\n // Check config cache first\n const cached = getCachedSwapRoute(chainId, asset, token);\n if (cached) {\n const extraData = cached.hop\n ? buildSwapExtraData(network, asset, token, 0, {\n via: cached.hop.via as Address,\n feeIn: cached.hop.feeIn,\n feeOut: cached.hop.feeOut,\n })\n : buildSwapExtraData(network, asset, token, cached.feeTier);\n const desc = cached.hop\n ? `cached multi-hop: ${cached.hop.feeIn}→WETH→${cached.hop.feeOut}`\n : `cached direct (fee ${cached.feeTier})`;\n return { extraData, routeDesc: desc };\n }\n\n const publicClient = getPublicClient();\n const quoterAddr = UNISWAP().QUOTER_V2;\n const quoterAbi = [{\n type: \"function\",\n name: \"quoteExactInputSingle\",\n inputs: [{ type: \"tuple\", components: [\n { type: \"address\", name: \"tokenIn\" },\n { type: \"address\", name: \"tokenOut\" },\n { type: \"uint256\", name: \"amountIn\" },\n { type: \"uint24\", name: \"fee\" },\n { type: \"uint160\", name: \"sqrtPriceLimitX96\" },\n ]}],\n outputs: [\n { type: \"uint256\" }, { type: \"uint160\" }, { type: \"uint32\" }, { type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n }] as const;\n\n // 1. Try direct at preferred fee tier\n const testAmount = asset.toLowerCase() === TOKENS().USDC.toLowerCase() ? 1_000_000n : 1_000_000_000_000_000n; // 1 USDC or 0.001 WETH\n const feeTiers = [preferredFeeTier, 10000, 3000, 500].filter((v, i, a) => a.indexOf(v) === i);\n\n for (const fee of feeTiers) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: asset, tokenOut: token, amountIn: testAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n cacheSwapRoute(chainId, asset, token, { mode: \"direct\", feeTier: fee, detectedAt: Math.floor(Date.now() / 1000) });\n return {\n extraData: buildSwapExtraData(network, asset, token, fee),\n routeDesc: `direct (fee ${fee})`,\n };\n } catch {\n // No pool at this fee tier\n }\n }\n\n // 2. Try multi-hop via WETH\n const weth = TOKENS().WETH;\n if (asset.toLowerCase() === weth.toLowerCase()) return null; // Already tried direct with WETH\n\n // Find best USDC→WETH fee\n let bestAssetToWethFee: number | null = null;\n for (const fee of [500, 3000, 10000]) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: asset, tokenOut: weth, amountIn: testAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n bestAssetToWethFee = fee;\n break; // 500 is cheapest, prefer it\n } catch {}\n }\n if (!bestAssetToWethFee) return null;\n\n // Find best WETH→token fee\n const wethTestAmount = 1_000_000_000_000_000n; // 0.001 WETH\n for (const fee of feeTiers) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: weth, tokenOut: token, amountIn: wethTestAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n const hop = { via: weth, feeIn: bestAssetToWethFee, feeOut: fee };\n cacheSwapRoute(chainId, asset, token, { mode: \"multi-hop\", feeTier: 0, hop, detectedAt: Math.floor(Date.now() / 1000) });\n return {\n extraData: buildSwapExtraData(network, asset, token, 0, hop),\n routeDesc: `multi-hop: ${bestAssetToWethFee}→WETH→${fee}`,\n };\n } catch {}\n }\n\n return null; // No route found\n}\n\n// ── Template definitions ──\n\ninterface TemplateDef {\n name: string;\n key: string;\n description: string;\n addressKey: keyof ReturnType<typeof STRATEGY_TEMPLATES>;\n}\n\nconst TEMPLATES: TemplateDef[] = [\n {\n name: \"Moonwell Supply\",\n key: \"moonwell-supply\",\n description: \"Supply tokens to Moonwell lending market, earn yield\",\n addressKey: \"MOONWELL_SUPPLY\",\n },\n {\n name: \"Aerodrome LP\",\n key: \"aerodrome-lp\",\n description: \"Provide liquidity on Aerodrome DEX + optional gauge staking\",\n addressKey: \"AERODROME_LP\",\n },\n {\n name: \"Venice Inference\",\n key: \"venice-inference\",\n description: \"Stake VVV for sVVV — Venice private AI inference\",\n addressKey: \"VENICE_INFERENCE\",\n },\n {\n name: \"wstETH Moonwell Yield\",\n key: \"wsteth-moonwell\",\n description: \"WETH → wstETH → Moonwell — stack Lido + lending yield\",\n addressKey: \"WSTETH_MOONWELL\",\n },\n {\n name: \"Mamo Yield\",\n key: \"mamo-yield\",\n description: \"Deposit into Mamo for optimized yield across Moonwell + Morpho vaults\",\n addressKey: \"MAMO_YIELD\",\n },\n {\n name: \"Portfolio\",\n key: \"portfolio\",\n description: \"Weighted portfolio of tokens (stock tokens, crypto) with rebalancing\",\n addressKey: \"PORTFOLIO\",\n },\n {\n name: \"Hyperliquid Perp\",\n key: \"hyperliquid-perp\",\n description: \"Leveraged perp trading on Hyperliquid via HyperEVM precompiles\",\n addressKey: \"HYPERLIQUID_PERP\",\n },\n];\n\nfunction resolveTemplate(key: string): { def: TemplateDef; address: Address } {\n const def = TEMPLATES.find((t) => t.key === key);\n if (!def) {\n console.error(chalk.red(`Unknown template: ${key}`));\n console.error(chalk.dim(`Available: ${TEMPLATES.map((t) => t.key).join(\", \")}`));\n process.exit(1);\n }\n const address = STRATEGY_TEMPLATES()[def.addressKey];\n if (address === ZERO) {\n console.error(chalk.red(`Template \"${def.name}\" not deployed on this network.`));\n process.exit(1);\n }\n return { def, address };\n}\n\n// ── Helpers for building init data per template ──\n\nasync function buildInitDataForTemplate(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n vault: Address,\n): Promise<{ initData: Hex; asset: Address; assetAmount: bigint; extraApprovals?: { token: Address; amount: bigint }[] }> {\n if (templateKey === \"moonwell-supply\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for moonwell-supply template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const mToken = resolveMToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const supplyAmount = parseUnits(opts.amount as string, decimals);\n const minRedeem = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: moonwellBuilder.buildInitData(underlying, mToken, supplyAmount, minRedeem),\n asset: underlying,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for venice-inference template\"));\n process.exit(1);\n }\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const vvv = VENICE().VVV;\n const isDirect = asset.toLowerCase() === vvv.toLowerCase();\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const assetAmount = parseUnits(opts.amount as string, decimals);\n const agent = (opts.agent as Address) || getAccount().address;\n const isSingleHop = !!opts.singleHop;\n\n // Auto-quote minVVV if not specified (non-direct paths only)\n let minVVV = 0n;\n if (!isDirect) {\n if (opts.minVvv) {\n minVVV = parseUnits(opts.minVvv as string, 18);\n } else {\n // Quote expected VVV out and apply 5% slippage\n const publicClient = getPublicClient();\n const aeroRouterAbi = [{\n name: \"getAmountsOut\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"routes\", type: \"tuple[]\", components: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"stable\", type: \"bool\" },\n { name: \"factory\", type: \"address\" },\n ]},\n ],\n outputs: [{ name: \"amounts\", type: \"uint256[]\" }],\n }] as const;\n\n const routes = isSingleHop\n ? [{ from: asset, to: vvv, stable: false, factory: AERODROME().FACTORY }]\n : [\n { from: asset, to: TOKENS().WETH, stable: false, factory: AERODROME().FACTORY },\n { from: TOKENS().WETH, to: vvv, stable: false, factory: AERODROME().FACTORY },\n ];\n\n try {\n const amounts = await publicClient.readContract({\n address: AERODROME().ROUTER,\n abi: aeroRouterAbi,\n functionName: \"getAmountsOut\",\n args: [assetAmount, routes],\n });\n const expectedVVV = amounts[amounts.length - 1];\n // 5% slippage: minVVV = expectedVVV * 95 / 100\n minVVV = (expectedVVV * 95n) / 100n;\n console.log(chalk.dim(` Auto-quoted minVVV: ${(Number(minVVV) / 1e18).toFixed(4)} VVV (5% slippage on ~${(Number(expectedVVV) / 1e18).toFixed(4)} VVV)`));\n } catch {\n console.error(chalk.red(\"Could not quote USDC→VVV price. Pass --min-vvv <amount> manually.\"));\n process.exit(1);\n }\n }\n }\n\n const params: veniceBuilder.VeniceInferenceInitParams = {\n asset,\n weth: isDirect ? ZERO : TOKENS().WETH,\n vvv,\n sVVV: VENICE().STAKING,\n aeroRouter: isDirect ? ZERO : AERODROME().ROUTER,\n aeroFactory: isDirect ? ZERO : AERODROME().FACTORY,\n agent,\n assetAmount,\n minVVV,\n deadlineOffset: 300n,\n singleHop: isSingleHop,\n };\n\n return {\n initData: veniceBuilder.buildInitData(params),\n asset,\n assetAmount,\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n for (const flag of [\"tokenA\", \"tokenB\", \"amountA\", \"amountB\", \"lpToken\"]) {\n if (!opts[flag]) {\n console.error(chalk.red(`--${flag.replace(/([A-Z])/g, \"-$1\").toLowerCase()} is required for aerodrome-lp template`));\n process.exit(1);\n }\n }\n const tokenA = opts.tokenA as Address;\n const tokenB = opts.tokenB as Address;\n const publicClient = getPublicClient();\n const [decimalsA, decimalsB] = await Promise.all([\n publicClient.readContract({ address: tokenA, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: tokenB, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n const amountA = parseUnits(opts.amountA as string, decimalsA);\n const amountB = parseUnits(opts.amountB as string, decimalsB);\n const minAOut = parseUnits((opts.minAOut as string) || \"0\", decimalsA);\n const minBOut = parseUnits((opts.minBOut as string) || \"0\", decimalsB);\n\n const params: aerodromeBuilder.AerodromeLPInitParams = {\n tokenA,\n tokenB,\n stable: !!opts.stable,\n factory: AERODROME().FACTORY,\n router: AERODROME().ROUTER,\n gauge: (opts.gauge as Address) || ZERO,\n lpToken: opts.lpToken as Address,\n amountADesired: amountA,\n amountBDesired: amountB,\n amountAMin: amountA, // use desired as min for now\n amountBMin: amountB,\n minAmountAOut: minAOut,\n minAmountBOut: minBOut,\n };\n\n return {\n initData: aerodromeBuilder.buildInitData(params),\n asset: tokenA,\n assetAmount: amountA,\n extraApprovals: [{ token: tokenB, amount: amountB }],\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n const supplyAmount = opts.amount ? parseUnits(opts.amount as string, 18) : 0n; // WETH = 18 decimals; 0 => use full vault balance at execute time\n const slippageBps = BigInt((opts.slippage as string) || \"500\"); // default 5% slippage\n // Per-unit rates (1e18-scaled) — Aerodrome wstETH/WETH stable pool trades\n // near 1:1, so default the expected rate to 1e18. Slippage cuts from that.\n // Rates scale with amountIn at execute time → dynamic-all mode is safe.\n const ONE = 10n ** 18n;\n const minWstethOutPerWeth = (ONE * (10000n - slippageBps)) / 10000n;\n const minWethOutPerWsteth = (ONE * (10000n - slippageBps)) / 10000n;\n\n const params: wstethBuilder.WstETHMoonwellInitParams = {\n weth: TOKENS().WETH,\n wsteth: TOKENS().wstETH,\n mwsteth: MOONWELL().mWstETH,\n aeroRouter: AERODROME().ROUTER,\n aeroFactory: AERODROME().FACTORY,\n supplyAmount,\n minWstethOutPerWeth,\n minWethOutPerWsteth,\n deadlineOffset: 300n,\n };\n\n return {\n initData: wstethBuilder.buildInitData(params),\n asset: TOKENS().WETH,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for mamo-yield template\"));\n process.exit(1);\n }\n if (!opts.mamoFactory) {\n console.error(chalk.red(\"--mamo-factory is required for mamo-yield template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const amount = parseUnits(opts.amount as string, decimals);\n const minRedeemAmount = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: mamoBuilder.buildInitData(underlying, opts.mamoFactory as Address, minRedeemAmount),\n asset: underlying,\n assetAmount: amount,\n };\n }\n\n if (templateKey === \"portfolio\") {\n if (!opts.amount) { console.error(chalk.red(\"--amount is required for portfolio template\")); process.exit(1); }\n if (!opts.tokens || !opts.weights) {\n console.error(chalk.red(\"--tokens and --weights are required for portfolio template\"));\n console.error(chalk.dim(\" --tokens: comma-separated token addresses or symbols\"));\n console.error(chalk.dim(\" --weights: comma-separated bps (must sum to 10000)\"));\n process.exit(1);\n }\n const tokens = TOKENS();\n const defaultAsset = getNetwork() === \"robinhood-testnet\" ? \"WETH\" : \"USDC\";\n const assetSymbol = (opts.asset as string) || defaultAsset;\n const asset = resolveToken(assetSymbol);\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const totalAmount = parseUnits(opts.amount as string, decimals);\n const maxSlippageBps = Number((opts.maxSlippage as string) || \"500\");\n const feeTier = (opts.feeTier as string) || \"3000\";\n\n const tokenAddrs = (opts.tokens as string).split(\",\").map((t) => {\n const trimmed = t.trim();\n if (isAddress(trimmed)) return trimmed as Address;\n const allTokens = tokens as Record<string, Address>;\n const resolved = allTokens[trimmed.toUpperCase()];\n if (resolved && resolved !== ZERO) return resolved;\n console.error(chalk.red(`Unknown token: ${trimmed}`)); process.exit(1);\n });\n const weightsBps = (opts.weights as string).split(\",\").map((w) => Number(w.trim()));\n if (tokenAddrs.length !== weightsBps.length) { console.error(chalk.red(\"--tokens and --weights must have same length\")); process.exit(1); }\n if (weightsBps.reduce((a, b) => a + b, 0) !== 10000) { console.error(chalk.red(`Weights must sum to 10000`)); process.exit(1); }\n\n const swapAdapter = (opts.swapAdapter as Address) || resolveSwapAdapter();\n const chainlinkVerifier = CHAINLINK().VERIFIER_PROXY;\n\n // Auto-detect swap routes for each token\n console.log(chalk.dim(\" Detecting swap routes...\"));\n const allocations: portfolioBuilder.BasketAllocation[] = [];\n for (let i = 0; i < tokenAddrs.length; i++) {\n const token = tokenAddrs[i];\n const route = await detectSwapRoute(asset, token, Number(feeTier));\n if (!route) {\n console.error(chalk.red(`No swap route found for ${token}. No Uniswap V3 pool (direct or via WETH).`));\n process.exit(1);\n }\n console.log(chalk.dim(` ${token.slice(0, 10)}... → ${route.routeDesc}`));\n allocations.push({\n token, weightBps: weightsBps[i],\n swapExtraData: route.extraData,\n });\n }\n return {\n initData: portfolioBuilder.buildInitData(asset, swapAdapter, chainlinkVerifier, allocations, totalAmount, maxSlippageBps),\n asset, assetAmount: totalAmount,\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n // Omit --amount to use the vault's full asset balance at execute time (dynamic-all mode).\n const depositAmount = opts.amount ? parseUnits(opts.amount as string, decimals) : 0n;\n // --min-return is a settlement floor: `sweepToVault` reverts on the first\n // call if `balance < minReturnAmount`. With --amount set we default to 1:1\n // (return at least the deposit). With dynamic-all we have no anchor, so\n // require --min-return explicitly — a zero floor would trivially pass the\n // settlement guard and defeat the whole check.\n if (depositAmount === 0n && !opts.minReturn) {\n console.error(chalk.red(\n \"--min-return is required when --amount is omitted (dynamic-all mode).\\n\" +\n \" The settlement floor can't be derived without a reference deposit — \" +\n \"set it explicitly to the minimum USDC you'll accept back from HyperCore.\",\n ));\n process.exit(1);\n }\n const minReturn = opts.minReturn\n ? parseUnits(opts.minReturn as string, decimals)\n : opts.amount\n ? parseUnits(opts.amount as string, decimals)\n : 0n;\n const leverage = Number((opts.leverage as string) || \"10\");\n const assetIndex = Number((opts.assetIndex as string) || \"0\");\n const maxPosition = parseUnits((opts.maxPosition as string) || \"100000\", decimals);\n const maxTradesDay = Number((opts.maxTradesPerDay as string) || \"50\");\n return {\n initData: hyperliquidPerpBuilder.buildInitData(asset, depositAmount, minReturn, assetIndex, leverage, maxPosition, maxTradesDay),\n asset, assetAmount: depositAmount,\n };\n }\n\n throw new Error(`No init builder for template: ${templateKey}`);\n}\n\nfunction buildCallsForTemplate(\n templateKey: string,\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n extraApprovals?: { token: Address; amount: bigint }[],\n): { executeCalls: BatchCall[]; settleCalls: BatchCall[] } {\n if (templateKey === \"moonwell-supply\") {\n return {\n executeCalls: moonwellBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: moonwellBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"venice-inference\") {\n return {\n executeCalls: veniceBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: veniceBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n const tokenB = extraApprovals?.[0]?.token ?? ZERO;\n const amountB = extraApprovals?.[0]?.amount ?? 0n;\n return {\n executeCalls: aerodromeBuilder.buildExecuteCalls(clone, asset, assetAmount, tokenB, amountB),\n settleCalls: aerodromeBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n return {\n executeCalls: wstethBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: wstethBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n return {\n executeCalls: mamoBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: mamoBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"portfolio\") {\n return {\n executeCalls: portfolioBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: portfolioBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n return {\n executeCalls: hyperliquidPerpBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: hyperliquidPerpBuilder.buildSettleCalls(clone),\n };\n }\n\n throw new Error(`No call builder for template: ${templateKey}`);\n}\n\n// ── Token resolution ──\n\nfunction resolveSwapAdapter(): Address {\n const network = getNetwork();\n if (network === \"robinhood-testnet\") {\n if (SYNTHRA().ROUTER === ZERO) { console.error(chalk.red(\"Synthra DEX not available\")); process.exit(1); }\n return \"0xdae81cDCfcB14c56fCeB788A147Fcd6CbEdfEeca\" as Address;\n }\n const adapterAddr = UNISWAP().SWAP_ADAPTER;\n if (adapterAddr !== ZERO) return adapterAddr;\n console.error(chalk.red(\"UniswapSwapAdapter not deployed yet. Use --swap-adapter to specify manually.\"));\n process.exit(1);\n}\n\nfunction resolveToken(symbolOrAddress: string): Address {\n if (isAddress(symbolOrAddress)) return symbolOrAddress as Address;\n const upper = symbolOrAddress.toUpperCase();\n const tokens = TOKENS();\n const tokenMap: Record<string, Address> = {\n USDC: tokens.USDC,\n WETH: tokens.WETH,\n DAI: tokens.DAI,\n AERO: tokens.AERO,\n VVV: VENICE().VVV,\n };\n const addr = tokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`Unknown token: ${symbolOrAddress}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction resolveMToken(tokenSymbol: string): Address {\n const upper = tokenSymbol.toUpperCase();\n const moonwell = MOONWELL();\n const mTokenMap: Record<string, Address> = {\n USDC: moonwell.mUSDC,\n WETH: moonwell.mWETH,\n };\n const addr = mTokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`No Moonwell market for: ${tokenSymbol}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction serializeCalls(calls: BatchCall[]): string {\n return JSON.stringify(\n calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n null,\n 2,\n );\n}\n\n// ── Commands ──\n\nexport function registerStrategyTemplateCommands(strategy: Command): void {\n // ── strategy list ──\n\n strategy\n .command(\"list\")\n .description(\"List available strategy templates\")\n .action(() => {\n const templates = STRATEGY_TEMPLATES();\n const network = getNetwork();\n\n console.log();\n console.log(chalk.bold(\"Strategy Templates\"), chalk.dim(`(${network})`));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n let availableCount = 0;\n for (const t of TEMPLATES) {\n const addr = templates[t.addressKey];\n if (addr !== ZERO) {\n availableCount++;\n console.log();\n console.log(` ${chalk.bold(t.name)} (${chalk.cyan(t.key)})`);\n console.log(` ${t.description}`);\n console.log(` Template: ${chalk.green(addr)}`);\n }\n }\n\n if (availableCount === 0) {\n console.log();\n console.log(chalk.yellow(\" No strategy templates deployed on this network.\"));\n }\n\n const unavailable = TEMPLATES.filter((t) => templates[t.addressKey] === ZERO);\n if (unavailable.length > 0) {\n console.log();\n console.log(chalk.dim(` Not available on ${network}:`));\n for (const t of unavailable) {\n console.log(chalk.dim(` ${t.name} (${t.key})`));\n }\n }\n\n console.log();\n console.log(chalk.dim(\"Clone a template: sherwood strategy clone <template> --vault <addr> ...\"));\n console.log(chalk.dim(\"Full proposal: sherwood strategy propose <template> --vault <addr> ...\"));\n console.log();\n });\n\n // ── strategy clone ──\n\n strategy\n .command(\"clone\")\n .description(\"Clone a strategy template and initialize it\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n let cloneHash: Hex;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneHash = result.hash;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(cloneHash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n const receipt = await waitForReceipt(initHash);\n if (receipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"Strategy clone ready:\"), chalk.green(clone));\n console.log(chalk.dim(\"Use this address in your proposal batch calls.\"));\n console.log();\n });\n\n // ── strategy init ──\n\n strategy\n .command(\"init\")\n .description(\"Initialize an already-deployed but uninitialized strategy clone\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--clone <address>\", \"Clone address to initialize\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const clone = opts.clone as Address;\n const vault = opts.vault as Address;\n if (!isAddress(clone)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n resolveTemplate(templateKey); // validate template exists\n\n // Check if already initialized\n const publicClient = getPublicClient();\n const currentVault = await publicClient.readContract({\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"vault\",\n }) as Address;\n\n if (currentVault !== \"0x0000000000000000000000000000000000000000\") {\n console.error(chalk.red(`Clone already initialized (vault: ${currentVault})`));\n process.exit(1);\n }\n\n const initSpinner = ora(\"Initializing strategy clone...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n const receipt = await waitForReceipt(initHash);\n if (receipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(initHash)}`));\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Verify\n const verifiedVault = await publicClient.readContract({\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"vault\",\n }) as Address;\n\n console.log();\n console.log(chalk.bold(\"Clone initialized:\"), chalk.green(clone));\n console.log(` Vault: ${chalk.green(verifiedVault)}`);\n console.log(` Proposer: ${chalk.green(getAccount().address)}`);\n console.log();\n });\n\n // ── strategy propose ──\n\n strategy\n .command(\"propose\")\n .description(\"Clone + init + build calls + submit governance proposal (all-in-one)\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .option(\"--write-calls <dir>\", \"Write execute/settle JSON to directory (skip proposal submission)\")\n // proposal metadata (required unless --write-calls)\n .option(\"--name <name>\", \"Proposal name\")\n .option(\"--description <text>\", \"Proposal description\")\n .option(\"--performance-fee <bps>\", \"Agent fee in bps\")\n .option(\"--duration <duration>\", \"Strategy duration (7d, 24h, etc.)\")\n // template-specific (same as clone)\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 0. Preflight — bail out before burning gas on clone + init for a\n // proposal the governor will refuse anyway. Two read-only checks,\n // no gas cost.\n const account = getAccount();\n const preflightSpinner = ora(\"Preflight checks...\").start();\n try {\n const publicClient = getPublicClient();\n\n // (a) Signer must be a registered active agent on this vault.\n const isRegistered = await publicClient.readContract({\n address: vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"isAgent\",\n args: [account.address],\n });\n if (!isRegistered) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(\n chalk.red(\n ` Signer ${account.address} is not a registered agent on ${vault}.\\n` +\n ` Register first via: sherwood syndicate approve --wallet ${account.address}`,\n ),\n );\n process.exit(1);\n }\n\n // (b) Vault must not be paused (deposits + governance ops would revert).\n const paused = await publicClient.readContract({\n address: vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"paused\",\n });\n if (paused) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(chalk.red(` Vault ${vault} is paused. Cannot propose.`));\n process.exit(1);\n }\n\n preflightSpinner.succeed(\"Preflight OK\");\n } catch (err) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(result.hash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n let asset: Address;\n let assetAmount: bigint;\n let extraApprovals: { token: Address; amount: bigint }[] | undefined;\n try {\n const built = await buildInitDataForTemplate(templateKey, opts, vault);\n asset = built.asset;\n assetAmount = built.assetAmount;\n extraApprovals = built.extraApprovals;\n\n // account hoisted above during preflight — reuse.\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, built.initData],\n });\n\n const initReceipt = await waitForReceipt(initHash);\n if (initReceipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 3. Build batch calls\n const { executeCalls, settleCalls } = buildCallsForTemplate(\n templateKey, clone, asset, assetAmount, extraApprovals,\n );\n\n console.log();\n console.log(chalk.bold(`Execute calls (${executeCalls.length}):`));\n console.log(formatBatch(executeCalls));\n console.log(chalk.bold(`Settle calls (${settleCalls.length}):`));\n console.log(formatBatch(settleCalls));\n\n // 4. Write files or submit proposal\n if (opts.writeCalls) {\n const dir = resolve(opts.writeCalls as string);\n mkdirSync(dir, { recursive: true });\n\n const execPath = resolve(dir, \"execute.json\");\n const settlePath = resolve(dir, \"settle.json\");\n writeFileSync(execPath, serializeCalls(executeCalls));\n writeFileSync(settlePath, serializeCalls(settleCalls));\n\n console.log();\n console.log(chalk.green(`Execute calls: ${execPath}`));\n console.log(chalk.green(`Settle calls: ${settlePath}`));\n console.log(chalk.green(`Clone address: ${clone}`));\n console.log();\n console.log(chalk.dim(\"Submit with:\"));\n console.log(chalk.dim(` sherwood proposal create \\\\`));\n console.log(chalk.dim(` --vault ${vault} \\\\`));\n console.log(chalk.dim(` --name \"...\" --description \"...\" \\\\`));\n console.log(chalk.dim(` --performance-fee 0 --duration 7d \\\\`));\n console.log(chalk.dim(` --execute-calls ${execPath} \\\\`));\n console.log(chalk.dim(` --settle-calls ${settlePath}`));\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Reminder: before settlement, agent must approve repayment:\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n console.log(chalk.yellow(\" Agent can update repayment via strategy.updateParams(newRepayment, 0, 0)\"));\n }\n\n console.log();\n return;\n }\n\n // Direct proposal submission requires metadata flags\n if (!opts.name || !opts.performanceFee || !opts.duration) {\n console.error(chalk.red(\"Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission.\"));\n process.exit(1);\n }\n\n // Lazy import governor to avoid pulling it in for --write-calls path\n const { propose } = await import(\"../lib/governor.js\");\n const { pinJSON } = await import(\"../lib/ipfs.js\");\n const { parseDuration } = await import(\"../lib/governor.js\");\n\n const performanceFeeBps = BigInt(opts.performanceFee as string);\n if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {\n console.error(chalk.red(\"--performance-fee must be 0-10000 (basis points)\"));\n process.exit(1);\n }\n const strategyDuration = parseDuration(opts.duration as string);\n // account already hoisted at preflight.\n\n const metaSpinner = ora(\"Pinning metadata to IPFS...\").start();\n let metadataURI: string;\n try {\n const metadata = {\n name: opts.name,\n description: opts.description || \"\",\n proposer: account.address,\n vault,\n strategyClone: clone,\n template: def.key,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: new Date().toISOString(),\n };\n metadataURI = await pinJSON(metadata, opts.name as string);\n metaSpinner.succeed(`Metadata pinned: ${metadataURI}`);\n } catch (err) {\n metaSpinner.fail(\"IPFS pin failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n const proposeSpinner = ora(\"Submitting proposal...\").start();\n try {\n const { hash, proposalId } = await propose(\n vault, metadataURI, performanceFeeBps, strategyDuration,\n executeCalls, settleCalls,\n );\n proposeSpinner.succeed(`Proposal #${proposalId} created`);\n console.log(`Proposal #${proposalId}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(hash)}`));\n console.log(chalk.dim(` Clone: ${clone}`));\n } catch (err) {\n proposeSpinner.fail(\"Proposal failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Next steps:\"));\n console.log(chalk.yellow(\" 1. After execution: sherwood venice provision\"));\n console.log(chalk.yellow(\" 2. Use inference: sherwood venice infer --model <id> --prompt '...'\"));\n console.log(chalk.yellow(\" 3. Before settlement: approve repayment (principal + profit):\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n }\n\n console.log();\n });\n\n // ── strategy status ──\n\n strategy\n .command(\"status\")\n .description(\"Show portfolio strategy status — allocations, balances, drift, PnL (Portfolio only)\")\n .argument(\"<clone>\", \"Strategy clone address\")\n .option(\"--json\", \"Output machine-readable JSON for agent consumption\")\n .action(async (cloneArg: string, opts) => {\n if (!isAddress(cloneArg)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n const clone = cloneArg as Address;\n const publicClient = getPublicClient();\n const network = getNetwork();\n const jsonMode = !!opts.json;\n\n const spinner = jsonMode ? null : ora(\"Reading strategy state...\").start();\n try {\n // Read strategy state + swap extra data (for fee tiers)\n const [stateRaw, vault, proposer, assetAddr, totalAmount, maxSlippage, allocations, swapExtraData] = await Promise.all([\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"state\" }),\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"vault\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"proposer\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"asset\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"totalAmount\" }) as Promise<bigint>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"maxSlippageBps\" }) as Promise<bigint>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getAllocations\" }) as Promise<readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[]>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getSwapExtraData\" }) as Promise<readonly `0x${string}`[]>,\n ]);\n\n const stateNames = [\"Pending\", \"Executed\", \"Settled\"];\n const stateStr = stateNames[Number(stateRaw)] || `Unknown(${stateRaw})`;\n\n // Read asset decimals & symbol\n const [assetDecimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n\n // Read current token balances & symbols in parallel\n const tokenReads = allocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const tokenData = await Promise.all(tokenReads);\n\n // Read asset balance held by strategy\n const assetBalance = await publicClient.readContract({\n address: assetAddr,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [clone],\n });\n\n // Extract fee tiers from swapExtraData (abi.encode(uint24 fee))\n const feeTiers = swapExtraData.map((data) => {\n try {\n const [fee] = decodeAbiParameters([{ type: \"uint24\" }], data);\n return Number(fee) > 0 && Number(fee) <= 100000 ? Number(fee) : 3000;\n } catch {\n return 3000;\n }\n });\n\n // Fetch prices (graceful — continues without if unavailable)\n let prices: (import(\"../lib/price.js\").TokenPrice | null)[] = [];\n let priceSource: \"uniswap\" | \"synthra\" | null = null;\n try {\n const { getTokenPricesInAsset } = await import(\"../lib/price.js\");\n prices = await getTokenPricesInAsset({\n tokens: allocations.map((a, i) => ({\n token: a.token,\n tokenDecimals: tokenData[i][2] as number,\n feeTier: feeTiers[i],\n })),\n asset: assetAddr,\n assetDecimals,\n });\n priceSource = prices.find((p) => p !== null)?.source ?? null;\n } catch {\n // Prices unavailable — continue with balance-only\n }\n\n const pricesAvailable = prices.some((p) => p !== null);\n\n // Compute enriched allocation data\n const assetBalanceNum = Number(formatUnits(assetBalance as bigint, assetDecimals));\n let totalPortfolioValue = assetBalanceNum;\n let totalInvested = 0n;\n\n interface AllocStatus {\n token: Address;\n symbol: string;\n decimals: number;\n targetWeightBps: number;\n balance: string;\n balanceRaw: string;\n investedAmount: string;\n currentPrice: number | null;\n currentValue: number | null;\n actualWeightBps: number | null;\n driftBps: number | null;\n pnl: number | null;\n pnlPct: number | null;\n }\n\n const allocStatuses: AllocStatus[] = allocations.map((alloc, i) => {\n const [balance, symbol, decimals] = tokenData[i];\n const balanceNum = Number(formatUnits(balance as bigint, decimals));\n const investedNum = Number(formatUnits(alloc.investedAmount, assetDecimals));\n totalInvested += alloc.investedAmount;\n\n const price = prices[i];\n let currentValue: number | null = null;\n\n if (price) {\n currentValue = balanceNum * price.price;\n totalPortfolioValue += currentValue;\n }\n\n return {\n token: alloc.token,\n symbol: symbol as string,\n decimals: decimals as number,\n targetWeightBps: Number(alloc.targetWeightBps),\n balance: formatUnits(balance as bigint, decimals),\n balanceRaw: (balance as bigint).toString(),\n investedAmount: formatUnits(alloc.investedAmount, assetDecimals),\n currentPrice: price?.price ?? null,\n currentValue,\n actualWeightBps: null, // computed after totals\n driftBps: null,\n pnl: currentValue !== null ? currentValue - investedNum : null,\n pnlPct: currentValue !== null && investedNum > 0\n ? ((currentValue - investedNum) / investedNum) * 100\n : null,\n };\n });\n\n // Second pass: compute actual weights and drift (needs totalPortfolioValue)\n let maxDriftBps = 0;\n let maxDriftToken = \"\";\n if (pricesAvailable && totalPortfolioValue > 0) {\n for (const a of allocStatuses) {\n if (a.currentValue !== null) {\n a.actualWeightBps = Math.round((a.currentValue / totalPortfolioValue) * 10000);\n a.driftBps = a.actualWeightBps - a.targetWeightBps;\n if (Math.abs(a.driftBps) > Math.abs(maxDriftBps)) {\n maxDriftBps = a.driftBps;\n maxDriftToken = a.symbol;\n }\n }\n }\n }\n\n // Total PnL\n const totalInvestedNum = Number(formatUnits(totalInvested, assetDecimals));\n const totalPnl = pricesAvailable ? totalPortfolioValue - totalInvestedNum : null;\n const totalPnlPct = totalPnl !== null && totalInvestedNum > 0\n ? (totalPnl / totalInvestedNum) * 100\n : null;\n\n spinner?.succeed(\"Strategy state loaded\");\n\n // ── JSON output ──\n if (jsonMode) {\n const result = {\n clone,\n vault,\n proposer,\n state: stateStr,\n network,\n asset: { address: assetAddr, symbol: assetSymbol as string, decimals: assetDecimals as number },\n totalDeployed: formatUnits(totalAmount, assetDecimals),\n maxSlippageBps: Number(maxSlippage),\n assetBalance: formatUnits(assetBalance as bigint, assetDecimals),\n pricesAvailable,\n priceSource,\n portfolio: {\n totalValue: pricesAvailable ? totalPortfolioValue : null,\n totalPnl,\n totalPnlPct,\n },\n allocations: allocStatuses,\n maxDriftBps: pricesAvailable ? maxDriftBps : null,\n maxDriftToken: pricesAvailable ? maxDriftToken : null,\n timestamp: new Date().toISOString(),\n };\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n return;\n }\n\n // ── Human-friendly output ──\n const stateColor = stateStr === \"Executed\" ? chalk.green : stateStr === \"Settled\" ? chalk.blue : chalk.yellow;\n\n console.log();\n console.log(chalk.bold(\"Portfolio Strategy Status\"));\n console.log(chalk.dim(\"─\".repeat(70)));\n console.log(` Clone: ${chalk.cyan(clone)}`);\n console.log(` Vault: ${chalk.cyan(vault)}`);\n console.log(` Proposer: ${chalk.cyan(proposer)}`);\n console.log(` State: ${stateColor(stateStr)}`);\n console.log(` Asset: ${assetSymbol} (${assetAddr})`);\n console.log(` Deployed: ${formatUnits(totalAmount, assetDecimals)} ${assetSymbol}`);\n console.log(` Max Slip: ${Number(maxSlippage) / 100}%`);\n console.log(` Asset held: ${formatUnits(assetBalance as bigint, assetDecimals)} ${assetSymbol}`);\n\n if (pricesAvailable) {\n const pvStr = totalPortfolioValue.toFixed(6);\n const pnlStr = totalPnl !== null ? (totalPnl >= 0 ? \"+\" : \"\") + totalPnl.toFixed(6) : \"n/a\";\n const pnlPctStr = totalPnlPct !== null ? (totalPnlPct >= 0 ? \"+\" : \"\") + totalPnlPct.toFixed(1) + \"%\" : \"\";\n const pnlColor = totalPnl !== null && totalPnl >= 0 ? chalk.green : chalk.red;\n console.log(` Value: ${pvStr} ${assetSymbol} | PnL: ${pnlColor(`${pnlStr} (${pnlPctStr})`)}`);\n console.log(` Price src: ${priceSource}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Allocations\"));\n console.log(chalk.dim(\"─\".repeat(70)));\n\n if (pricesAvailable) {\n // Price-enriched table\n console.log(\n chalk.dim(\" Token\".padEnd(10)) +\n chalk.dim(\"Target\".padEnd(9)) +\n chalk.dim(\"Actual\".padEnd(9)) +\n chalk.dim(\"Drift\".padEnd(8)) +\n chalk.dim(\"Value\".padEnd(16)) +\n chalk.dim(\"PnL\".padEnd(16)) +\n chalk.dim(\"Balance\"),\n );\n\n for (const a of allocStatuses) {\n const targetStr = (a.targetWeightBps / 100).toFixed(1) + \"%\";\n const actualStr = a.actualWeightBps !== null ? (a.actualWeightBps / 100).toFixed(1) + \"%\" : \"—\";\n const driftStr = a.driftBps !== null\n ? (a.driftBps >= 0 ? \"+\" : \"\") + a.driftBps\n : \"—\";\n const driftColor = a.driftBps !== null\n ? (Math.abs(a.driftBps) > 500 ? chalk.red : Math.abs(a.driftBps) > 200 ? chalk.yellow : chalk.dim)\n : chalk.dim;\n const valueStr = a.currentValue !== null ? a.currentValue.toFixed(6) : \"—\";\n const pnlPctStr = a.pnlPct !== null ? (a.pnlPct >= 0 ? \"+\" : \"\") + a.pnlPct.toFixed(1) + \"%\" : \"—\";\n const pnlColor = a.pnlPct !== null ? (a.pnlPct >= 0 ? chalk.green : chalk.red) : chalk.dim;\n\n console.log(\n ` ${chalk.bold(a.symbol.padEnd(8))}` +\n `${targetStr.padEnd(9)}` +\n `${actualStr.padEnd(9)}` +\n `${driftColor(driftStr.toString().padEnd(8))}` +\n `${valueStr.padEnd(16)}` +\n `${pnlColor(pnlPctStr.padEnd(16))}` +\n `${a.balance}`,\n );\n }\n } else {\n // Balance-only table (no prices available)\n console.log(chalk.dim(\" Prices unavailable — showing raw balances only.\"));\n console.log();\n console.log(\n chalk.dim(\" Token\".padEnd(12)) +\n chalk.dim(\"Weight\".padEnd(10)) +\n chalk.dim(\"Invested\".padEnd(18)) +\n chalk.dim(\"Balance\".padEnd(18)) +\n chalk.dim(\"Address\"),\n );\n\n for (const a of allocStatuses) {\n const weightPct = (a.targetWeightBps / 100).toFixed(1) + \"%\";\n console.log(\n ` ${chalk.bold(a.symbol.padEnd(10))}` +\n `${weightPct.padEnd(10)}` +\n `${a.investedAmount.padEnd(18)}` +\n `${a.balance.padEnd(18)}` +\n `${chalk.dim(a.token)}`,\n );\n }\n }\n\n console.log(chalk.dim(\"─\".repeat(70)));\n console.log(` Total invested: ${formatUnits(totalInvested, assetDecimals)} ${assetSymbol}`);\n\n if (pricesAvailable && maxDriftToken) {\n const absMaxDrift = Math.abs(maxDriftBps);\n const driftColor = absMaxDrift > 500 ? chalk.red : absMaxDrift > 200 ? chalk.yellow : chalk.green;\n console.log(` Max drift: ${driftColor(`${maxDriftBps > 0 ? \"+\" : \"\"}${maxDriftBps} bps`)} (${maxDriftToken})`);\n }\n\n if (stateStr === \"Executed\") {\n console.log();\n console.log(chalk.dim(\"Rebalance: sherwood strategy rebalance \" + clone));\n console.log(chalk.dim(\"With new weights: sherwood strategy rebalance \" + clone + \" --new-weights 2500,2500,2000,1500,1500\"));\n }\n\n console.log();\n } catch (err) {\n spinner?.fail(\"Failed to read strategy state\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── strategy rebalance ──\n\n strategy\n .command(\"rebalance\")\n .description(\"Rebalance a portfolio strategy — sell all positions, re-buy at target weights (Portfolio only)\")\n .argument(\"<clone>\", \"Strategy clone address\")\n .option(\"--new-weights <list>\", \"Comma-separated new weights in bps (must sum to 10000). Updates weights before rebalancing.\")\n .option(\"--max-slippage <bps>\", \"New max slippage bps (used with --new-weights)\")\n .option(\"--dry-run\", \"Show what would happen without executing\")\n .action(async (cloneArg: string, opts) => {\n if (!isAddress(cloneArg)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n const clone = cloneArg as Address;\n const publicClient = getPublicClient();\n const account = getAccount();\n const chain = getChain();\n\n // 1. Verify strategy state\n const verifySpinner = ora(\"Verifying strategy state...\").start();\n try {\n const [stateRaw, proposer, assetAddr, allocations] = await Promise.all([\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"state\" }),\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"proposer\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"asset\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getAllocations\" }) as Promise<readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[]>,\n ]);\n\n // Check state\n if (Number(stateRaw) !== 1) { // State.Executed = 1\n const stateNames = [\"Pending\", \"Executed\", \"Settled\"];\n verifySpinner.fail(`Strategy is ${stateNames[Number(stateRaw)] || \"Unknown\"}, must be Executed to rebalance`);\n process.exit(1);\n }\n\n // Check proposer\n if (proposer.toLowerCase() !== account.address.toLowerCase()) {\n verifySpinner.fail(`Only the proposer (${proposer}) can rebalance. Your wallet: ${account.address}`);\n process.exit(1);\n }\n\n const [assetDecimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n\n // Read current balances\n const tokenReads = allocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const tokenData = await Promise.all(tokenReads);\n\n verifySpinner.succeed(\"Strategy is Executed — ready to rebalance\");\n\n // Show current allocations\n console.log();\n console.log(chalk.bold(\"Current Allocations\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < allocations.length; i++) {\n const alloc = allocations[i];\n const [balance, symbol, decimals] = tokenData[i];\n const weightPct = (Number(alloc.targetWeightBps) / 100).toFixed(1) + \"%\";\n console.log(\n ` ${chalk.bold((symbol as string).padEnd(8))} ` +\n `${weightPct.padEnd(8)} ` +\n `bal: ${formatUnits(balance as bigint, decimals)}`,\n );\n }\n\n // Parse new weights if provided\n let newWeightsBps: number[] | undefined;\n if (opts.newWeights) {\n newWeightsBps = (opts.newWeights as string).split(\",\").map((w) => Number(w.trim()));\n if (newWeightsBps.length !== allocations.length) {\n console.error(chalk.red(`--new-weights must have ${allocations.length} values (one per token)`));\n process.exit(1);\n }\n const weightSum = newWeightsBps.reduce((a, b) => a + b, 0);\n if (weightSum !== 10000) {\n console.error(chalk.red(`Weights must sum to 10000, got ${weightSum}`));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"New Target Weights\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < allocations.length; i++) {\n const [, symbol] = tokenData[i];\n const oldPct = (Number(allocations[i].targetWeightBps) / 100).toFixed(1);\n const newPct = (newWeightsBps[i] / 100).toFixed(1);\n const arrow = oldPct !== newPct ? chalk.yellow(\"→\") : chalk.dim(\"→\");\n console.log(` ${chalk.bold((symbol as string).padEnd(8))} ${oldPct}% ${arrow} ${newPct}%`);\n }\n }\n\n if (opts.dryRun) {\n console.log();\n console.log(chalk.yellow(\"Dry run — no transactions sent.\"));\n console.log(chalk.dim(\"The rebalance would:\"));\n console.log(chalk.dim(\" 1. Sell all current token positions back to \" + assetSymbol));\n console.log(chalk.dim(\" 2. Re-buy at \" + (newWeightsBps ? \"new\" : \"current\") + \" target weights\"));\n console.log();\n return;\n }\n\n // 2. Update weights first (if specified)\n if (newWeightsBps) {\n const maxSlip = Number((opts.maxSlippage as string) || \"0\");\n const swapData = await publicClient.readContract({\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"getSwapExtraData\",\n }) as Hex[];\n\n const updateSpinner = ora(\"Updating target weights...\").start();\n try {\n const innerData = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [newWeightsBps.map((w: number) => BigInt(w)), BigInt(maxSlip), swapData],\n );\n\n const updateHash = await writeContractWithRetry({\n account,\n chain,\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"updateParams\",\n args: [innerData],\n });\n\n const receipt = await waitForReceipt(updateHash);\n if (receipt.status === \"reverted\") throw new Error(\"updateParams reverted\");\n updateSpinner.succeed(\"Target weights updated\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(updateHash)}`));\n } catch (err) {\n updateSpinner.fail(\"Failed to update weights\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n\n // 3. Execute rebalance\n const rebalanceSpinner = ora(\"Rebalancing portfolio (sell all → re-buy at targets)...\").start();\n try {\n const rebalanceHash = await writeContractWithRetry({\n account,\n chain,\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"rebalance\",\n });\n\n const receipt = await waitForReceipt(rebalanceHash);\n if (receipt.status === \"reverted\") throw new Error(\"rebalance() reverted on-chain\");\n rebalanceSpinner.succeed(\"Portfolio rebalanced\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(rebalanceHash)}`));\n } catch (err) {\n rebalanceSpinner.fail(\"Rebalance failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 4. Show updated balances\n const postSpinner = ora(\"Reading updated allocations...\").start();\n const postAllocations = await publicClient.readContract({\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"getAllocations\",\n }) as readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[];\n\n const postReads = postAllocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const postData = await Promise.all(postReads);\n postSpinner.succeed(\"Updated allocations\");\n\n console.log();\n console.log(chalk.bold(\"Post-Rebalance Allocations\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < postAllocations.length; i++) {\n const alloc = postAllocations[i];\n const [balance, symbol, decimals] = postData[i];\n const weightPct = (Number(alloc.targetWeightBps) / 100).toFixed(1) + \"%\";\n const investedStr = formatUnits(alloc.investedAmount, assetDecimals);\n console.log(\n ` ${chalk.bold((symbol as string).padEnd(8))} ` +\n `${weightPct.padEnd(8)} ` +\n `invested: ${investedStr.padEnd(14)} ` +\n `bal: ${formatUnits(balance as bigint, decimals)}`,\n );\n }\n\n console.log();\n console.log(chalk.green(\"✓ Rebalance complete\"));\n console.log();\n } catch (err: any) {\n if (err.code === \"ERR_MODULE_NOT_FOUND\" || err instanceof TypeError) throw err;\n verifySpinner.fail(\"Pre-flight check failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * ERC-1167 minimal proxy cloning from TypeScript.\n *\n * Mirrors OpenZeppelin's Clones.clone() — constructs the creation\n * bytecode for a minimal proxy and deploys via a raw transaction.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { concat } from \"viem\";\nimport { getPublicClient, getAccount, sendTxWithRetry, waitForReceipt } from \"./client.js\";\nimport { getChain } from \"./network.js\";\n\n/**\n * Deploy an ERC-1167 minimal proxy clone of a template contract.\n *\n * @param template - Address of the deployed template (implementation)\n * @returns The clone address and deployment tx hash\n */\nexport async function cloneTemplate(\n template: Address,\n): Promise<{ clone: Address; hash: Hex }> {\n // ERC-1167 creation code (matches OpenZeppelin Clones.sol):\n // Init code: 3d602d80600a3d3981f3\n // Runtime code: 363d3d373d3d3d363d73 <address> 5af43d82803e903d91602b57fd5bf3\n const creationCode = concat([\n \"0x3d602d80600a3d3981f3363d3d373d3d3d363d73\",\n template,\n \"0x5af43d82803e903d91602b57fd5bf3\",\n ]);\n\n const account = getAccount();\n const chain = getChain();\n\n const hash = await sendTxWithRetry({\n account,\n chain,\n data: creationCode as Hex,\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n\n if (!receipt.contractAddress) {\n throw new Error(`Clone deployment failed — no contract address in receipt (tx: ${hash})`);\n }\n\n return { clone: receipt.contractAddress, hash };\n}\n","/**\n * Types and helpers for batch call construction.\n *\n * Calls go directly to vault.executeBatch() — no separate executor contract.\n */\n\nimport type { Address, Hex } from \"viem\";\n\nexport interface BatchCall {\n target: Address;\n data: Hex;\n value: bigint;\n}\n\n/**\n * Format a batch for human-readable display (CLI output before simulation).\n */\nexport function formatBatch(calls: BatchCall[]): string {\n return calls\n .map((call, i) => {\n const selector = call.data.slice(0, 10);\n return ` ${i + 1}. ${call.target} :: ${selector}... (${call.value > 0n ? call.value + \" wei\" : \"no value\"})`;\n })\n .join(\"\\n\");\n}\n","/**\n * MoonwellSupplyStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mToken, uint256 supplyAmount, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mToken: Address,\n supplyAmount: bigint,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n [underlying, mToken, supplyAmount, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * VeniceInferenceStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address asset, address weth, address vvv, address sVVV,\n * address aeroRouter, address aeroFactory, address agent,\n * uint256 assetAmount, uint256 minVVV, uint256 deadlineOffset, bool singleHop\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface VeniceInferenceInitParams {\n asset: Address;\n weth: Address;\n vvv: Address;\n sVVV: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n agent: Address;\n assetAmount: bigint;\n minVVV: bigint;\n deadlineOffset: bigint;\n singleHop: boolean;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"asset\", type: \"address\" as const },\n { name: \"weth\", type: \"address\" as const },\n { name: \"vvv\", type: \"address\" as const },\n { name: \"sVVV\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"agent\", type: \"address\" as const },\n { name: \"assetAmount\", type: \"uint256\" as const },\n { name: \"minVVV\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n { name: \"singleHop\", type: \"bool\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: VeniceInferenceInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, assetAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * AerodromeLPStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address tokenA, address tokenB, bool stable,\n * address factory, address router, address gauge, address lpToken,\n * uint256 amountADesired, uint256 amountBDesired,\n * uint256 amountAMin, uint256 amountBMin,\n * uint256 minAmountAOut, uint256 minAmountBOut\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface AerodromeLPInitParams {\n tokenA: Address;\n tokenB: Address;\n stable: boolean;\n factory: Address;\n router: Address;\n gauge: Address;\n lpToken: Address;\n amountADesired: bigint;\n amountBDesired: bigint;\n amountAMin: bigint;\n amountBMin: bigint;\n minAmountAOut: bigint;\n minAmountBOut: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"tokenA\", type: \"address\" as const },\n { name: \"tokenB\", type: \"address\" as const },\n { name: \"stable\", type: \"bool\" as const },\n { name: \"factory\", type: \"address\" as const },\n { name: \"router\", type: \"address\" as const },\n { name: \"gauge\", type: \"address\" as const },\n { name: \"lpToken\", type: \"address\" as const },\n { name: \"amountADesired\", type: \"uint256\" as const },\n { name: \"amountBDesired\", type: \"uint256\" as const },\n { name: \"amountAMin\", type: \"uint256\" as const },\n { name: \"amountBMin\", type: \"uint256\" as const },\n { name: \"minAmountAOut\", type: \"uint256\" as const },\n { name: \"minAmountBOut\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: AerodromeLPInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n tokenA: Address,\n amountA: bigint,\n tokenB: Address,\n amountB: bigint,\n): BatchCall[] {\n return [\n {\n target: tokenA,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountA],\n }),\n value: 0n,\n },\n {\n target: tokenB,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountB],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * WstETHMoonwellStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address weth, address wsteth, address mwsteth,\n * address aeroRouter, address aeroFactory,\n * uint256 supplyAmount, uint256 minWstethOutPerWeth, uint256 minWethOutPerWsteth, uint256 deadlineOffset\n * supplyAmount = 0 means use the vault's full WETH balance at execute time\n * min*PerX are 1e18-scaled per-unit rates so slippage protection scales with amountIn.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface WstETHMoonwellInitParams {\n weth: Address;\n wsteth: Address;\n mwsteth: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n supplyAmount: bigint;\n minWstethOutPerWeth: bigint;\n minWethOutPerWsteth: bigint;\n deadlineOffset: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"weth\", type: \"address\" as const },\n { name: \"wsteth\", type: \"address\" as const },\n { name: \"mwsteth\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"supplyAmount\", type: \"uint256\" as const },\n { name: \"minWstethOutPerWeth\", type: \"uint256\" as const },\n { name: \"minWethOutPerWsteth\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: WstETHMoonwellInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n weth: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (supplyAmount == 0) we can't know the exact amount\n // at proposal-build time, so approve maxUint256 then revoke to 0 after\n // execute() in the same batch. This bounds the residual allowance to a\n // single atomic tx — any leftover approval is cleared before control\n // returns to the governor.\n const approveAmount = supplyAmount === 0n ? maxUint256 : supplyAmount;\n\n return [\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * MamoYieldStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mamoFactory, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mamoFactory: Address,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ],\n [underlying, mamoFactory, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n amount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}","/**\n * PortfolioStrategy call builder.\n *\n * InitParams (Solidity): (address asset, address swapAdapter, address chainlinkVerifier,\n * address[] tokens, uint256[] weightsBps, uint256 totalAmount, uint256 maxSlippageBps,\n * bytes[] swapExtraData)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface BasketAllocation {\n token: Address;\n weightBps: number; // e.g. 4000 = 40%\n swapExtraData: Hex; // adapter-specific (fee tier, path, etc.)\n}\n\nexport function buildInitData(\n asset: Address,\n swapAdapter: Address,\n chainlinkVerifier: Address,\n allocations: BasketAllocation[],\n totalAmount: bigint,\n maxSlippageBps: number,\n): Hex {\n const tokens = allocations.map((a) => a.token);\n const weightsBps = allocations.map((a) => BigInt(a.weightBps));\n const swapExtraData = allocations.map((a) => a.swapExtraData);\n\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"address\" },\n { type: \"address[]\" },\n { type: \"uint256[]\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"bytes[]\" },\n ],\n [\n asset,\n swapAdapter,\n chainlinkVerifier,\n tokens,\n weightsBps,\n totalAmount,\n BigInt(maxSlippageBps),\n swapExtraData,\n ],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n totalAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, totalAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildUpdateParamsCalls(\n clone: Address,\n newWeightsBps: number[],\n newMaxSlippageBps: number,\n newSwapExtraData: Hex[],\n): BatchCall[] {\n const data = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [\n newWeightsBps.map((w) => BigInt(w)),\n BigInt(newMaxSlippageBps),\n newSwapExtraData,\n ],\n );\n\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"updateParams\",\n inputs: [{ type: \"bytes\", name: \"data\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"updateParams\",\n args: [data],\n }),\n value: 0n,\n },\n ];\n}\n\n// ── Rebalancing ──\n\nimport { PORTFOLIO_STRATEGY_ABI } from \"../lib/abis.js\";\n\n/**\n * Encode calldata for the simple `rebalance()` call.\n * This is called directly by the proposer (not via vault batch).\n */\nexport function encodeRebalanceCalldata(): Hex {\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"rebalance\",\n });\n}\n\n/**\n * Encode calldata for `updateParams()` to change weights before rebalancing.\n */\nexport function encodeUpdateWeightsCalldata(\n newWeightsBps: number[],\n newMaxSlippageBps: number,\n newSwapExtraData: Hex[],\n): Hex {\n const data = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [\n newWeightsBps.map((w) => BigInt(w)),\n BigInt(newMaxSlippageBps),\n newSwapExtraData,\n ],\n );\n\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"updateParams\",\n args: [data],\n });\n}\n","/**\n * HyperliquidPerpStrategy call builder.\n *\n * InitParams (Solidity): (address asset, uint256 depositAmount, uint256 minReturnAmount, uint32 perpAssetIndex, uint32 leverage, uint256 maxPositionSize, uint32 maxTradesPerDay)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI, HYPERLIQUID_PERP_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n asset: Address,\n depositAmount: bigint,\n minReturnAmount: bigint,\n perpAssetIndex: number,\n leverage: number,\n maxPositionSize: bigint,\n maxTradesPerDay: number,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n { type: \"uint32\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n ],\n [asset, depositAmount, minReturnAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n amount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (amount == 0) we approve maxUint256 up front and\n // revoke to 0 after execute() in the same atomic batch — the residual\n // allowance never persists beyond the tx.\n const approveAmount = amount === 0n ? maxUint256 : amount;\n\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\n/** Phase 2: sweep USDC back to vault after async HyperCore transfer completes. */\nexport function buildSweepToVaultCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: HYPERLIQUID_PERP_STRATEGY_ABI,\n functionName: \"sweepToVault\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * Subgraph query wrapper for syndicate discovery.\n *\n * Queries The Graph's hosted/studio subgraph for indexed\n * factory + vault events. Much faster than on-chain iteration.\n *\n * Requires SUBGRAPH_URL env var pointing to the subgraph's\n * query endpoint (from The Graph Studio).\n */\n\nexport interface SubgraphSyndicate {\n id: string;\n vault: string;\n creator: string;\n metadataURI: string;\n createdAt: string;\n active: boolean;\n totalDeposits: string;\n totalWithdrawals: string;\n}\n\nexport interface SubgraphAgent {\n id: string;\n agentAddress: string;\n active: boolean;\n registeredAt: string;\n totalBatches: string;\n totalAssetAmount: string;\n}\n\nexport interface SubgraphDeposit {\n id: string;\n sender: string;\n owner: string;\n assets: string;\n shares: string;\n timestamp: string;\n txHash: string;\n}\n\nexport interface SyndicateDetails extends SubgraphSyndicate {\n agents: SubgraphAgent[];\n deposits: SubgraphDeposit[];\n}\n\nfunction getSubgraphUrl(): string {\n const url = process.env.SUBGRAPH_URL;\n if (!url) {\n throw new Error(\n \"SUBGRAPH_URL env var is required. Set it to your The Graph Studio query endpoint.\",\n );\n }\n return url;\n}\n\nasync function query<T>(graphql: string, variables?: Record<string, unknown>): Promise<T> {\n const url = getSubgraphUrl();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query: graphql, variables }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Subgraph query failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { data?: T; errors?: { message: string }[] };\n\n if (result.errors?.length) {\n throw new Error(`Subgraph query error: ${result.errors.map((e) => e.message).join(\", \")}`);\n }\n\n if (!result.data) {\n throw new Error(\"Subgraph returned no data\");\n }\n\n return result.data;\n}\n\n/**\n * Get all active syndicates, optionally filtered by creator.\n */\nexport async function getActiveSyndicates(\n creator?: string,\n): Promise<SubgraphSyndicate[]> {\n if (creator) {\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(\n `query($creator: String!) {\n syndicates(where: { active: true, creator: $creator }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }`,\n { creator: creator.toLowerCase() },\n );\n return data.syndicates;\n }\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(where: { active: true }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }\n `);\n\n return data.syndicates;\n}\n\n/**\n * Get detailed syndicate info including agents, recent deposits, and batch executions.\n */\nexport async function getSyndicateDetails(\n syndicateId: string,\n): Promise<SyndicateDetails | null> {\n const data = await query<{ syndicate: SyndicateDetails | null }>(\n `query($id: ID!) {\n syndicate(id: $id) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n agentAddress\n active\n registeredAt\n totalBatches\n totalAssetAmount\n }\n deposits(first: 10, orderBy: timestamp, orderDirection: desc) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n }`,\n { id: syndicateId },\n );\n\n return data.syndicate;\n}\n\n/**\n * Get deposit/withdrawal history for a specific depositor across all syndicates.\n */\nexport async function getDepositorHistory(\n depositorAddress: string,\n): Promise<{ deposits: SubgraphDeposit[]; withdrawals: SubgraphDeposit[] }> {\n const addr = depositorAddress.toLowerCase();\n\n const data = await query<{\n deposits: SubgraphDeposit[];\n withdrawals: SubgraphDeposit[];\n }>(\n `query($owner: String!) {\n deposits(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n withdrawals: withdrawals(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }`,\n { owner: addr },\n );\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * Venice commands — sherwood venice <subcommand>\n *\n * Manages Venice private inference: provision API keys, check status,\n * list models, run inference.\n *\n * Venice funding uses the VeniceInferenceStrategy template via the\n * proposal flow (sherwood proposal create).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { formatUnits, isAddress, parseUnits } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt, formatContractError } from \"../lib/client.js\";\nimport { getChain } from \"../lib/network.js\";\nimport { VENICE } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, VENICE_STAKING_ABI } from \"../lib/abis.js\";\nimport { provisionApiKey, checkApiKeyValid, chatCompletion, listModels } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.js\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function registerVeniceCommands(program: Command): void {\n const venice = program.command(\"venice\").description(\"Venice private inference — provision API keys, run inference\");\n\n // ── venice provision ──\n\n venice\n .command(\"provision\")\n .description(\"Self-provision a Venice API key (requires sVVV in wallet)\")\n .action(async () => {\n const account = getAccount();\n const client = getPublicClient();\n\n // Check sVVV balance\n const checkSpinner = ora(\"Checking sVVV balance...\").start();\n try {\n const sVvvBalance = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (sVvvBalance === 0n) {\n checkSpinner.fail(\"No sVVV found in wallet\");\n console.log(chalk.yellow(\" Your wallet must hold staked VVV (sVVV) to provision a Venice API key.\"));\n console.log(chalk.yellow(\" Use the VeniceInferenceStrategy via a proposal to distribute sVVV to agents.\"));\n process.exit(1);\n }\n\n checkSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n } catch (err) {\n checkSpinner.fail(\"Failed to check sVVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Provision API key\n const keySpinner = ora(\"Provisioning Venice API key...\").start();\n try {\n const apiKey = await provisionApiKey();\n keySpinner.succeed(\"Venice API key provisioned\");\n console.log(chalk.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));\n console.log(chalk.dim(\" Saved to ~/.sherwood/config.json\"));\n\n // Create EAS attestation\n try {\n const { createVeniceProvisionAttestation, getEasScanUrl } = await import(\"../lib/eas.js\");\n const { uid } = await createVeniceProvisionAttestation(account.address);\n if (uid !== \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n console.log(chalk.dim(` Attested: ${getEasScanUrl(uid)}`));\n }\n } catch {\n // Attestation is best-effort\n }\n } catch (err) {\n keySpinner.fail(\"Failed to provision API key\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice stake ──\n\n venice\n .command(\"stake\")\n .description(\"Stake VVV tokens to receive sVVV (required for API key provisioning)\")\n .requiredOption(\"--amount <n>\", \"Amount of VVV to stake (human-readable, e.g. 13)\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const chain = getChain();\n const veniceAddrs = VENICE();\n const amount = parseUnits(opts.amount, 18);\n\n // Check VVV balance\n const balSpinner = ora(\"Checking VVV balance...\").start();\n try {\n const vvvBalance = await client.readContract({\n address: veniceAddrs.VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (vvvBalance < amount) {\n balSpinner.fail(`Insufficient VVV: have ${formatUnits(vvvBalance, 18)}, need ${opts.amount}`);\n process.exit(1);\n }\n balSpinner.succeed(`VVV balance: ${formatUnits(vvvBalance, 18)}`);\n } catch (err) {\n balSpinner.fail(\"Failed to check VVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Approve VVV spend\n const approveSpinner = ora(\"Approving VVV for staking contract...\").start();\n try {\n const approveHash = await writeContractWithRetry({\n account,\n chain,\n address: veniceAddrs.VVV,\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [veniceAddrs.STAKING, amount],\n });\n await waitForReceipt(approveHash);\n approveSpinner.succeed(\"VVV approved\");\n } catch (err) {\n approveSpinner.fail(\"Approve failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Stake VVV → sVVV\n const stakeSpinner = ora(`Staking ${opts.amount} VVV...`).start();\n try {\n const stakeHash = await writeContractWithRetry({\n account,\n chain,\n address: veniceAddrs.STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"stake\",\n args: [account.address, amount],\n });\n await waitForReceipt(stakeHash);\n\n // Read new sVVV balance\n const sVvvBalance = await client.readContract({\n address: veniceAddrs.STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n stakeSpinner.succeed(`Staked ${opts.amount} VVV → ${formatUnits(sVvvBalance, 18)} sVVV`);\n console.log(chalk.dim(\" You can now run: sherwood venice provision\"));\n } catch (err) {\n stakeSpinner.fail(\"Stake failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice mint-diem ──\n\n venice\n .command(\"mint-diem\")\n .description(\"Lock sVVV to mint DIEM (Venice inference credits; ~1d cooldown)\")\n .requiredOption(\"--amount <n>\", \"Amount of sVVV to lock (human-readable, 18 decimals)\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (default 500 = 5%)\", \"500\")\n .option(\"--yes\", \"Skip the cooldown confirmation prompt\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const chain = getChain();\n const { STAKING, DIEM } = VENICE();\n\n const amount = parseUnits(opts.amount, 18);\n const slippageBps = BigInt(opts.slippage ?? \"500\");\n if (slippageBps < 0n || slippageBps > 10000n) {\n console.error(chalk.red(`Invalid slippage bps: ${opts.slippage} (must be 0–10000)`));\n process.exit(1);\n }\n\n // 1. Check sVVV balance\n const balSpinner = ora(\"Checking sVVV balance...\").start();\n let sVvvBalance: bigint;\n try {\n sVvvBalance = await client.readContract({\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n } catch (err) {\n balSpinner.fail(\"Failed to read sVVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n if (sVvvBalance < amount) {\n balSpinner.fail(\n `Insufficient sVVV: have ${formatUnits(sVvvBalance, 18)}, need ${opts.amount}`,\n );\n console.log(chalk.yellow(\" Stake VVV first (see VeniceInferenceStrategy proposal flow).\"));\n process.exit(1);\n }\n balSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n\n // 2. Quote DIEM out\n const quoteSpinner = ora(\"Quoting DIEM output...\").start();\n let expected: bigint;\n try {\n expected = await client.readContract({\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"getDiemAmountOut\",\n args: [amount],\n }) as bigint;\n } catch (err) {\n quoteSpinner.fail(\"Failed to quote DIEM output\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n if (expected === 0n) {\n quoteSpinner.fail(\"Quote returned 0 DIEM — refusing to mint\");\n process.exit(1);\n }\n const minOut = (expected * (10000n - slippageBps)) / 10000n;\n quoteSpinner.succeed(\n `Expected: ${formatUnits(expected, 18)} DIEM (minOut @ ${slippageBps}bps: ${formatUnits(minOut, 18)})`,\n );\n\n // 3. Spendability check — Venice requires >= 0.1 DIEM minimum before any\n // DIEM credit becomes spendable on inference calls. Warn the agent\n // upfront so they can size up sVVV (or switch to x402) before locking.\n const MIN_SPENDABLE_DIEM = parseUnits(\"0.1\", 18);\n let currentDiem = 0n;\n try {\n currentDiem = await client.readContract({\n address: DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n } catch {\n // best-effort\n }\n const projectedDiem = currentDiem + expected;\n if (projectedDiem < MIN_SPENDABLE_DIEM) {\n const shortfall = MIN_SPENDABLE_DIEM - projectedDiem;\n // Linear extrapolation: scale up amount by the ratio shortfall/expected\n const sVvvNeeded = (amount * shortfall + expected - 1n) / expected; // ceil-div\n console.log();\n console.log(chalk.red(\" ⚠ Venice requires ≥ 0.1 DIEM minimum before ANY DIEM credit\"));\n console.log(chalk.red(\" becomes spendable on inference calls.\"));\n console.log(chalk.red(` Projected DIEM after mint: ${formatUnits(projectedDiem, 18)} (short by ${formatUnits(shortfall, 18)})`));\n console.log(chalk.red(` Approx additional sVVV needed: ${formatUnits(sVvvNeeded, 18)}`));\n console.log(chalk.dim(\" Below threshold, this DIEM sits idle — consider acquiring\"));\n console.log(chalk.dim(\" more sVVV first, or use x402 USDC pay-per-request.\"));\n }\n\n // 4. Lockup warning + confirmation\n console.log();\n console.log(chalk.yellow(\" ⚠ Locked sVVV cannot be unstaked directly. To recover it you must\"));\n console.log(chalk.yellow(\" first call `staking.burnDiem(amount)` (burns DIEM, unlocks sVVV\"));\n console.log(chalk.yellow(\" at your average mint rate), then `initiateUnstake` + wait the\"));\n console.log(chalk.yellow(\" 7-day staking cooldown, then `finalizeUnstake`.\"));\n console.log(chalk.dim(\" x402 alternative (pay-per-request in USDC, no DIEM lock):\"));\n console.log(chalk.dim(\" https://docs.venice.ai/overview/guides/generating-api-key-agent#paying-for-inference\"));\n console.log();\n\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = (await rl.question(` Lock ${opts.amount} sVVV for DIEM credits? [y/N] `)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n console.log(chalk.dim(\" Aborted.\"));\n process.exit(0);\n }\n } finally {\n rl.close();\n }\n }\n\n // 5. Mint DIEM (reuses `currentDiem` read in step 3 as the pre-balance)\n const diemBefore = currentDiem;\n const mintSpinner = ora(`Minting DIEM from ${opts.amount} sVVV...`).start();\n try {\n const hash = await writeContractWithRetry({\n account,\n chain,\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"mintDiem\",\n args: [amount, minOut],\n });\n await waitForReceipt(hash);\n\n const diemAfter = await client.readContract({\n address: DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n const delta = diemAfter - diemBefore;\n\n mintSpinner.succeed(\n `Minted ${formatUnits(delta > 0n ? delta : diemAfter, 18)} DIEM` +\n (delta > 0n ? ` (balance: ${formatUnits(diemAfter, 18)})` : \"\"),\n );\n console.log(chalk.dim(` Tx: ${hash}`));\n console.log(chalk.yellow(\" Note: Venice requires ≥ 0.1 DIEM to spend ANY DIEM credit, and\"));\n console.log(chalk.yellow(\" refreshes daily allocation at 00:00 UTC. Below threshold,\"));\n console.log(chalk.yellow(\" inference will continue to 402.\"));\n console.log(chalk.dim(\" Once over threshold: sherwood venice infer --model <id> --prompt \\\"...\\\"\"));\n } catch (err) {\n mintSpinner.fail(\"mintDiem failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice status ──\n\n venice\n .command(\"status\")\n .description(\"Show Venice inference status: sVVV balances, DIEM, API key\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const account = getAccount();\n const spinner = ora(\"Loading Venice status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read VVV balance on vault\n const vaultVvvBalance = await client.readContract({\n address: VENICE().VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vaultAddress],\n }) as bigint;\n\n // Read per-agent sVVV balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n // Check current agent's sVVV + pending rewards + DIEM\n const [mySvvv, myPending, myDiem] = await Promise.all([\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"pendingRewards\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n ]);\n\n // Check API key\n const apiKeyValid = await checkApiKeyValid();\n const apiKey = getVeniceApiKey();\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n console.log();\n console.log(chalk.bold(\"Venice Inference Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Profit available: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` VVV (unstaked): ${formatUnits(vaultVvvBalance, 18)}`);\n\n console.log(chalk.bold(\"\\n Agent sVVV Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 18)} sVVV`);\n }\n\n console.log(chalk.bold(\"\\n Your Wallet\"));\n console.log(` sVVV: ${formatUnits(mySvvv, 18)}`);\n console.log(` Pending rewards: ${formatUnits(myPending, 18)} VVV`);\n console.log(` DIEM (credits): ${formatUnits(myDiem, 18)}`);\n console.log(chalk.dim(\" (mint via `sherwood venice mint-diem --amount <sVVV>`)\"));\n\n console.log(chalk.bold(\"\\n Venice API\"));\n console.log(` Key: ${apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : chalk.dim(\"not provisioned\")}`);\n console.log(` Status: ${apiKeyValid ? chalk.green(\"valid\") : chalk.red(\"invalid/missing\")}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice models ──\n\n venice\n .command(\"models\")\n .description(\"List available Venice inference models\")\n .action(async () => {\n const spinner = ora(\"Fetching Venice models...\").start();\n try {\n const models = await listModels();\n spinner.succeed(`${models.length} models available`);\n console.log();\n for (const model of models) {\n console.log(` ${model}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to list models\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice infer ──\n\n venice\n .command(\"infer\")\n .description(\"Run private inference via Venice chat completions\")\n .requiredOption(\"--prompt <text>\", \"User prompt\")\n .requiredOption(\"--model <id>\", \"Venice model ID (use 'venice models' to list)\")\n .option(\"--system <text>\", \"System prompt\")\n .option(\"--data <path>\", \"Path to data file — contents prepended to prompt as context\")\n .option(\"--web-search\", \"Enable Venice web search\", false)\n .option(\"--no-thinking\", \"Disable chain-of-thought reasoning\")\n .option(\"--temperature <n>\", \"Sampling temperature (0-2)\")\n .option(\"--max-tokens <n>\", \"Maximum completion tokens\")\n .option(\"--json\", \"Output raw JSON response\", false)\n .option(\"--vault <address>\", \"Vault address — attestation recipient (defaults to config vault)\")\n .action(async (opts) => {\n // Build messages\n const messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[] = [];\n\n if (opts.system) {\n messages.push({ role: \"system\", content: opts.system });\n }\n\n let userContent = opts.prompt;\n if (opts.data) {\n try {\n const data = readFileSync(opts.data, \"utf-8\");\n userContent = `Context data:\\n\\`\\`\\`\\n${data}\\n\\`\\`\\`\\n\\n${opts.prompt}`;\n } catch (err) {\n console.error(chalk.red(`Failed to read data file: ${opts.data}`));\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n messages.push({ role: \"user\", content: userContent });\n\n const spinner = ora(`Running inference (${opts.model})...`).start();\n try {\n const result = await chatCompletion({\n model: opts.model,\n messages,\n temperature: opts.temperature !== undefined ? Number(opts.temperature) : undefined,\n maxTokens: opts.maxTokens !== undefined ? Number(opts.maxTokens) : undefined,\n enableWebSearch: opts.webSearch,\n disableThinking: opts.thinking === false,\n });\n\n spinner.succeed(\"Inference complete\");\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log();\n console.log(result.content);\n console.log();\n console.log(chalk.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));\n }\n\n // Create EAS attestation (best-effort)\n try {\n const { createVeniceInferenceAttestation, getEasScanUrl } = await import(\"../lib/eas.js\");\n const { keccak256, toHex, isAddress: isAddr } = await import(\"viem\");\n const { getChainContracts } = await import(\"../lib/config.js\");\n const { getChain: getActiveChain } = await import(\"../lib/network.js\");\n const vaultRecipient = (opts.vault && isAddr(opts.vault)) ? opts.vault : getChainContracts(getActiveChain().id).vault;\n const promptHash = keccak256(toHex(userContent)).slice(0, 18); // short hash\n const { uid } = await createVeniceInferenceAttestation(\n result.model,\n result.usage.promptTokens,\n result.usage.completionTokens,\n promptHash,\n vaultRecipient as `0x${string}` | undefined,\n );\n if (uid !== \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n console.log(chalk.dim(`Attested: ${getEasScanUrl(uid)}`));\n }\n } catch {\n // Attestation is best-effort\n }\n } catch (err) {\n spinner.fail(\"Inference failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Allowance commands — sherwood allowance <subcommand>\n *\n * Disburses vault profits as USDC to agent operator wallets for\n * operational expenses (gas, x402 API payments, etc.).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI } from \"../lib/abis.js\";\nimport { getQuote, getMultiHopQuote, encodeSwapPath, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch } from \"../lib/vault.js\";\nimport { buildDisburseBatch, type AllowanceDisbursConfig } from \"../strategies/allowance-disburse.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport function registerAllowanceCommands(program: Command): void {\n const allowance = program.command(\"allowance\").description(\"Disburse vault profits to agent wallets\");\n\n // ── allowance disburse ──\n\n allowance\n .command(\"disburse\")\n .description(\"Swap vault profits → USDC → distribute to all agent operator wallets\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .requiredOption(\"--amount <amount>\", \"Deposit token amount to convert & distribute (e.g. 500)\")\n .option(\"--fee <tier>\", \"Fee tier for asset → USDC swap (500, 3000, 10000)\", \"3000\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const fee = Number(opts.fee);\n if (!VALID_FEES.includes(fee as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n const slippageBps = Number(opts.slippage);\n\n const client = getPublicClient();\n\n // ── Read vault state ──\n\n const spinner = ora(\"Reading vault state...\").start();\n let assetAddress: Address;\n let assetDecimals: number;\n let assetSymbol: string;\n let totalDeposited: bigint;\n let assetBalance: bigint;\n let agents: Address[];\n\n try {\n [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Failed to read vault state\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n if (agents.length === 0) {\n console.error(chalk.red(\"No agents registered in vault. Register agents first.\"));\n process.exit(1);\n }\n\n const requestedAmount = parseUnits(opts.amount, assetDecimals);\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n // ── Display config ──\n\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n\n console.log();\n console.log(chalk.bold(\"Allowance Disburse\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Asset: ${assetSymbol} (${assetDecimals} decimals)`);\n console.log(` Amount: ${opts.amount} ${assetSymbol}`);\n console.log(` Vault balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` Agents: ${agents.length} (USDC will be split equally)`);\n if (!isUsdc) {\n console.log(` Routing: ${isWeth ? `WETH → USDC (fee ${fee})` : `${assetSymbol} → WETH → USDC (fee ${fee})`}`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n }\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n if (requestedAmount > profit) {\n console.warn(chalk.yellow(` Warning: amount (${opts.amount}) exceeds available profit (${formatUnits(profit, assetDecimals)})`));\n console.warn(chalk.yellow(\" This will use deposited capital, not just profits.\"));\n console.log();\n }\n\n // ── Get USDC amount (quote or direct) ──\n\n let minUsdc: bigint;\n let swapPath: `0x${string}` | null = null;\n\n if (isUsdc) {\n // No swap needed — distribute the asset directly\n minUsdc = requestedAmount;\n } else {\n const quoteSpinner = ora(\"Fetching Uniswap quote...\").start();\n try {\n let amountOut: bigint;\n\n if (isWeth) {\n // Single-hop: WETH → USDC\n const quote = await getQuote({\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n amountIn: requestedAmount,\n fee,\n });\n amountOut = quote.amountOut;\n } else {\n // Multi-hop: asset → WETH → USDC\n swapPath = encodeSwapPath(\n [assetAddress, TOKENS().WETH, TOKENS().USDC],\n [fee, 500], // WETH→USDC typically uses 500 (0.05%) fee tier\n );\n const quote = await getMultiHopQuote({\n path: swapPath,\n amountIn: requestedAmount,\n });\n amountOut = quote.amountOut;\n }\n\n minUsdc = applySlippage(amountOut, slippageBps);\n\n quoteSpinner.succeed(\n `Quote: ${formatUnits(amountOut, 6)} USDC ` +\n `(min: ${formatUnits(minUsdc, 6)}, per agent: ${formatUnits(minUsdc / BigInt(agents.length), 6)})`\n );\n } catch (err) {\n quoteSpinner.fail(\"Failed to fetch quote\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n\n // ── Per-agent display ──\n\n const perAgent = minUsdc / BigInt(agents.length);\n if (isUsdc) {\n console.log(chalk.dim(` Per agent: ${formatUnits(perAgent, 6)} USDC`));\n console.log();\n }\n\n // ── Build batch ──\n\n const config: AllowanceDisbursConfig = {\n amount: opts.amount,\n fee,\n slippageBps,\n };\n\n const calls = buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath);\n\n console.log();\n console.log(chalk.bold(`Batch calls (${calls.length}):`));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Execute ──\n\n if (!opts.execute) {\n console.log();\n console.log(chalk.yellow(\"Dry run complete. Add --execute to submit on-chain.\"));\n return;\n }\n\n const execSpinner = ora(\"Executing batch via vault...\").start();\n try {\n const txHash = await executeBatch(calls);\n execSpinner.succeed(`Batch executed: ${txHash}`);\n console.log(chalk.dim(` ${getExplorerUrl(txHash)}`));\n } catch (err) {\n execSpinner.fail(\"Execution failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── allowance status ──\n\n allowance\n .command(\"status\")\n .description(\"Show vault profit and agent USDC balances\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const spinner = ora(\"Loading allowance status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read per-agent USDC balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n const account = getAccount();\n\n console.log();\n console.log(chalk.bold(\"Allowance Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Asset: ${assetSymbol}`);\n console.log(` Balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n\n console.log(chalk.bold(\"\\n Agent USDC Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 6)} USDC`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Allowance Disburse Strategy — swap vault profits to USDC and distribute to agents.\n *\n * If the vault's deposit token is already USDC, transfers directly to each agent.\n * Otherwise, swaps asset → USDC via Uniswap V3 (single-hop or multi-hop via WETH),\n * then distributes USDC equally to each agent's operator wallet.\n *\n * Agents use USDC for operational expenses: gas, x402 API payments, etc.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseUnits } from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { TOKENS, UNISWAP } from \"../lib/addresses.js\";\nimport {\n ERC20_ABI,\n SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n SWAP_ROUTER_ABI as SWAP_ROUTER_EXACT_INPUT_ABI,\n} from \"../lib/abis.js\";\n\n// ── Strategy Config ──\n\nexport interface AllowanceDisbursConfig {\n /** Deposit token amount to convert & distribute (human-readable, e.g. \"500\") */\n amount: string;\n /** Fee tier for asset → USDC swap (ignored if asset = USDC) */\n fee: number;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n}\n\n// ── Batch Builder ──\n\n/**\n * Build the allowance disburse batch.\n *\n * @param config - Strategy parameters\n * @param vaultAddress - Vault contract address (delegatecall identity)\n * @param agents - Agent operator EOA addresses to receive USDC\n * @param assetAddress - Vault's deposit token address\n * @param assetDecimals - Deposit token decimals\n * @param minUsdc - Minimum USDC output (post-slippage), or raw amount if asset IS USDC\n * @param swapPath - Encoded Uniswap V3 path for multi-hop (null if single-hop or no swap)\n */\nexport function buildDisburseBatch(\n config: AllowanceDisbursConfig,\n vaultAddress: Address,\n agents: Address[],\n assetAddress: Address,\n assetDecimals: number,\n minUsdc: bigint,\n swapPath: Hex | null,\n): BatchCall[] {\n const assetAmount = parseUnits(config.amount, assetDecimals);\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n const calls: BatchCall[] = [];\n\n if (!isUsdc) {\n // 1. Approve SwapRouter to spend vault asset\n calls.push({\n target: assetAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, assetAmount],\n }),\n value: 0n,\n });\n\n // 2. Swap asset → USDC\n if (isWeth) {\n // Single-hop: WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n });\n } else {\n // Multi-hop: asset → WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_ABI,\n functionName: \"exactInput\",\n args: [\n {\n path: swapPath!,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n },\n ],\n }),\n value: 0n,\n });\n }\n }\n\n // 3. Transfer USDC to each agent equally\n const perAgent = minUsdc / BigInt(agents.length);\n for (const agent of agents) {\n calls.push({\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [agent, perAgent],\n }),\n value: 0n,\n });\n }\n\n return calls;\n}\n","/**\n * Identity commands — sherwood identity <subcommand>\n *\n * Wraps the Agent0 SDK (@agent0-sdk) for ERC-8004 agent identity management.\n * Handles: mint (register), set metadata, check status, load existing agent.\n * Required before creating or joining syndicates.\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SDK } from \"agent0-sdk\";\nimport { getPublicClient, getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl, getChain, getRpcUrl } from \"../lib/network.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport { setAgentId, getAgentId, loadConfig } from \"../lib/config.js\";\n\n// ── ABI (minimal, for status reads without SDK) ──\n\nconst IDENTITY_REGISTRY_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n] as const;\n\n/**\n * Initialize the Agent0 SDK with the current network config.\n */\nfunction getAgent0SDK(): SDK {\n // Read key from config first, env var as fallback\n const config = loadConfig();\n const key = config.privateKey || process.env.PRIVATE_KEY;\n if (!key) {\n throw new Error(\n \"Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var.\",\n );\n }\n\n return new SDK({\n chainId: getChain().id,\n rpcUrl: getRpcUrl(),\n privateKey: key.startsWith(\"0x\") ? key : `0x${key}`,\n });\n}\n\nexport function registerIdentityCommands(program: Command): void {\n const identity = program.command(\"identity\").description(\"Manage ERC-8004 agent identity (via Agent0 SDK)\");\n\n // ── identity mint ──\n\n identity\n .command(\"mint\")\n .description(\"Register a new ERC-8004 agent identity (required before creating/joining syndicates)\")\n .requiredOption(\"--name <name>\", \"Agent name (e.g. 'Alpha Seeker Agent')\")\n .option(\"--description <desc>\", \"Agent description\", \"Sherwood syndicate agent\")\n .option(\"--image <uri>\", \"Agent image URI (IPFS recommended)\")\n .action(async (opts) => {\n const account = getAccount();\n\n // Check if wallet already has an identity\n const existingId = getAgentId();\n if (existingId) {\n console.log(chalk.yellow(`You already have an agent identity saved: #${existingId}`));\n console.log(chalk.dim(\" Minting a new one anyway. The old ID is not affected.\"));\n console.log();\n }\n\n const spinner = ora(\"Initializing Agent0 SDK...\").start();\n try {\n const sdk = getAgent0SDK();\n\n // Create agent with metadata\n spinner.text = \"Creating agent profile...\";\n const agent = sdk.createAgent(opts.name, opts.description, opts.image);\n\n // Register on-chain (mints ERC-8004 NFT)\n spinner.text = \"Registering on-chain (minting ERC-8004 identity)...\";\n const txHandle = await agent.registerOnChain();\n\n spinner.text = \"Waiting for confirmation...\";\n await txHandle.waitMined();\n\n const agentId = agent.agentId;\n if (!agentId) {\n spinner.warn(\"Identity registered but could not read agentId\");\n console.log(chalk.dim(\" Check the transaction on the explorer.\"));\n return;\n }\n\n // Agent0 agentId format is \"chainId:tokenId\" — extract the token ID\n const tokenId = Number(agentId.includes(\":\") ? agentId.split(\":\")[1] : agentId);\n\n // Save to config\n setAgentId(tokenId);\n\n spinner.succeed(`Agent identity registered: #${tokenId}`);\n console.log(chalk.dim(` Agent0 ID: ${agentId}`));\n console.log(chalk.dim(` Name: ${opts.name}`));\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n console.log();\n console.log(chalk.green(\"You can now create syndicates:\"));\n console.log(chalk.dim(` sherwood syndicate create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to register identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity load ──\n\n identity\n .command(\"load\")\n .description(\"Load an existing ERC-8004 agent identity into your config\")\n .requiredOption(\"--id <tokenId>\", \"Agent token ID to load\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const tokenId = Number(opts.id);\n\n const spinner = ora(`Verifying ownership of agent #${tokenId}...`).start();\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\n }) as Address;\n\n if (owner.toLowerCase() !== account.address.toLowerCase()) {\n spinner.fail(`Agent #${tokenId} is owned by ${owner}, not your wallet`);\n process.exit(1);\n }\n\n setAgentId(tokenId);\n spinner.succeed(`Agent #${tokenId} loaded and saved to config`);\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n } catch (err) {\n spinner.fail(\"Failed to load identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity status ──\n\n identity\n .command(\"status\")\n .description(\"Show your agent identity status\")\n .action(async () => {\n const account = getAccount();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const client = getPublicClient();\n\n const spinner = ora(\"Checking identity...\").start();\n try {\n const balance = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n spinner.stop();\n\n const savedId = getAgentId();\n\n console.log();\n console.log(chalk.bold(\"Agent Identity (ERC-8004)\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Wallet: ${account.address}`);\n console.log(` Registry: ${registry}`);\n console.log(` NFTs owned: ${balance.toString()}`);\n\n if (savedId) {\n // Verify the saved ID is still owned by this wallet\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(savedId)],\n }) as Address;\n\n const isOwner = owner.toLowerCase() === account.address.toLowerCase();\n console.log(` Saved ID: #${savedId} ${isOwner ? chalk.green(\"(verified)\") : chalk.red(\"(owned by \" + owner + \")\")}`);\n\n // Load full agent details via SDK if verified\n if (isOwner) {\n try {\n const sdk = getAgent0SDK();\n const agent = await sdk.loadAgent(`${getChain().id}:${savedId}`);\n if (agent.name) console.log(` Name: ${agent.name}`);\n if (agent.description) console.log(` Desc: ${chalk.dim(agent.description)}`);\n if (agent.walletAddress) console.log(` Wallet: ${agent.walletAddress}`);\n } catch {\n // SDK load failed — not critical, basic info already shown\n }\n }\n } catch {\n console.log(` Saved ID: #${savedId} ${chalk.red(\"(token not found)\")}`);\n }\n } else {\n console.log(` Saved ID: ${chalk.dim(\"none — run 'sherwood identity mint --name <name>'\")}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to check identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Proposal commands — sherwood proposal <subcommand>\n *\n * Manages the full proposal lifecycle: create, list, show, vote,\n * execute, settle, cancel, simulate.\n */\n\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress, encodeFunctionData } from \"viem\";\nimport { getVaultOwner, getAssetAddress } from \"../lib/vault.js\";\nimport { ERC20_ABI } from \"../lib/abis.js\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFileSync } from \"node:fs\";\nimport { getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl, getNetwork } from \"../lib/network.js\";\nimport { uploadMetadata } from \"../lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"../lib/ipfs.js\";\nimport { fetchMetadata } from \"../lib/ipfs.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getProposal,\n getProposalState,\n proposalCount,\n propose,\n vote,\n executeProposal,\n settleProposal,\n emergencySettle,\n getExecuteCalls,\n getSettlementCalls,\n cancelProposal,\n emergencyCancel,\n getVoteWeight,\n hasVoted,\n getCapitalSnapshot,\n getActiveProposal,\n parseDuration,\n PROPOSAL_STATES,\n PROPOSAL_STATE,\n VOTE_TYPE,\n} from \"../lib/governor.js\";\nimport type { BatchCall } from \"../lib/governor.js\";\nimport { formatDurationShort as formatDuration, formatShares, formatUSDC, parseBigIntArg } from \"../lib/format.js\";\nimport { simulateBatchCalls, printSimulationResult, sendSimulationAlert } from \"../lib/simulate.js\";\nimport type { RiskContext } from \"../lib/simulate.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction formatTimestamp(ts: bigint): string {\n if (ts === 0n) return \"—\";\n return new Date(Number(ts) * 1000).toLocaleString();\n}\n\nfunction parseCallsFile(path: string): BatchCall[] {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw) as { target: string; data: string; value: string }[];\n return parsed.map((c) => ({\n target: c.target as Address,\n data: c.data as Hex,\n value: BigInt(c.value || \"0\"),\n }));\n}\n\nexport function registerProposalCommands(program: Command): void {\n const proposal = program.command(\"proposal\").description(\"Governance proposals — create, vote, execute, settle\");\n\n // ── proposal create ──\n\n proposal\n .command(\"create\")\n .description(\"Submit a strategy proposal\")\n .requiredOption(\"--vault <address>\", \"Vault address the proposal targets\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .requiredOption(\"--description <text>\", \"Strategy rationale and risk summary\")\n .requiredOption(\"--performance-fee <bps>\", \"Agent fee in bps (e.g. 1500 = 15%)\")\n .requiredOption(\"--duration <duration>\", \"Strategy duration (e.g. 7d, 24h, 3600)\")\n .requiredOption(\"--execute-calls <path>\", \"Path to JSON file with execute Call[] array\")\n .requiredOption(\"--settle-calls <path>\", \"Path to JSON file with settlement Call[] array\")\n .option(\"--metadata-uri <uri>\", \"Override — skip IPFS upload and use this URI directly\")\n .option(\"--simulate\", \"Simulate calls via Tenderly before submitting\")\n .option(\"--force\", \"Submit even if simulation fails (requires --simulate)\")\n .action(async (opts) => {\n try {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const performanceFeeBps = parseBigIntArg(opts.performanceFee, \"performance-fee\");\n const strategyDuration = parseDuration(opts.duration);\n const executeCalls = parseCallsFile(opts.executeCalls);\n const settleCalls = parseCallsFile(opts.settleCalls);\n\n // ── Pin metadata ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const account = getAccount();\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/proposal/v1\",\n name: opts.name,\n description: opts.description,\n chain: getNetwork(),\n strategies: [],\n terms: {},\n links: {},\n };\n // Attach proposal-specific fields\n const proposalMeta = {\n ...metadata,\n proposer: account.address,\n vault,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: Math.floor(Date.now() / 1000),\n };\n // Use the existing upload function — it accepts SyndicateMetadata shape\n metadataURI = await uploadMetadata(proposalMeta as unknown as SyndicateMetadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(\"IPFS upload failed — using inline metadata\"));\n const json = JSON.stringify({ name: opts.name, description: opts.description, vault });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Summary ──\n console.log();\n console.log(LABEL(\" ◆ Proposal Summary\"));\n SEP();\n console.log(W(` Name: ${BOLD(opts.name)}`));\n console.log(W(` Vault: ${G(vault)}`));\n console.log(W(` Performance Fee: ${Number(performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(strategyDuration)}`));\n console.log(W(` Calls: ${executeCalls.length} execute + ${settleCalls.length} settle`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n SEP();\n\n // ── Simulate (optional) ──\n if (opts.simulate) {\n // Build risk context from the proposal parameters\n let createRiskContext: RiskContext = { vault, performanceFeeBps, strategyDuration };\n try {\n const govParams = await getGovernorParams();\n createRiskContext = { ...createRiskContext, governorParams: govParams };\n } catch { /* non-fatal — skip parameter bounds checks */ }\n\n const simSpinner = ora({ text: W(\"Simulating execute calls...\"), color: \"green\" }).start();\n const execResult = await simulateBatchCalls(vault, executeCalls, \"execute\", createRiskContext);\n simSpinner.stop();\n printSimulationResult(execResult, \"execute\");\n\n if (settleCalls.length > 0) {\n const settleSpinner = ora({ text: W(\"Simulating settlement calls...\"), color: \"green\" }).start();\n const settleResult = await simulateBatchCalls(vault, settleCalls, \"settlement\", createRiskContext);\n settleSpinner.stop();\n printSimulationResult(settleResult, \"settlement\");\n\n if (!settleResult.success && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Settlement simulation failed. Use --force to submit anyway.\"));\n process.exit(1);\n }\n }\n\n if (!execResult.success && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Execution simulation failed. Use --force to submit anyway.\"));\n process.exit(1);\n }\n\n // Block on critical risks\n const hasCriticalRisks = execResult.risks.some((r) => r.level === \"critical\");\n if (hasCriticalRisks && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Critical risks detected. Use --force to submit anyway.\"));\n process.exit(1);\n }\n }\n\n // ── Submit ──\n const spinner = ora({ text: W(\"Submitting proposal...\"), color: \"green\" }).start();\n const result = await propose(vault, metadataURI, performanceFeeBps, strategyDuration, executeCalls, settleCalls);\n spinner.succeed(G(\"Proposal submitted\"));\n\n console.log();\n console.log(LABEL(\" ◆ Proposal Created\"));\n SEP();\n console.log(W(` Proposal ID: ${G(`#${result.proposalId}`)}`));\n console.log(W(` Tx: ${DIM(getExplorerUrl(result.hash))}`));\n SEP();\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal list ──\n\n proposal\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"--vault <address>\", \"Filter by vault\")\n .option(\"--state <filter>\", \"Filter by state: draft, pending, approved, executed, settled, all\", \"all\")\n .action(async (opts) => {\n const spinner = ora(\"Loading proposals...\").start();\n try {\n const count = await proposalCount();\n if (count === 0n) {\n spinner.stop();\n console.log(DIM(\"\\n No proposals found.\\n\"));\n return;\n }\n\n const vaultFilter = opts.vault ? (opts.vault as string).toLowerCase() : null;\n const stateFilter = opts.state.toLowerCase();\n const stateIndex = PROPOSAL_STATES.findIndex((s) => s.toLowerCase() === stateFilter);\n\n // Fetch all proposals + computed states concurrently\n const ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n const results = await Promise.all(\n ids.map(async (id) => {\n const [p, state] = await Promise.all([getProposal(id), getProposalState(id)]);\n return { ...p, computedState: state };\n }),\n );\n\n const proposals = results.filter((p) => {\n if (vaultFilter && p.vault.toLowerCase() !== vaultFilter) return false;\n if (stateFilter !== \"all\" && stateIndex >= 0 && p.computedState !== stateIndex) return false;\n return true;\n });\n\n spinner.stop();\n\n if (proposals.length === 0) {\n console.log(DIM(\"\\n No matching proposals.\\n\"));\n return;\n }\n\n console.log();\n console.log(BOLD(`Proposals (${proposals.length})`));\n console.log(DIM(\"─\".repeat(90)));\n console.log(\n DIM(\" ID \") +\n DIM(\"Agent\".padEnd(14)) +\n DIM(\"State\".padEnd(12)) +\n DIM(\"Votes (For/Against)\".padEnd(22)) +\n DIM(\"Fee\".padEnd(8)) +\n DIM(\"Duration\".padEnd(10)) +\n DIM(\"Created\"),\n );\n console.log(DIM(\"─\".repeat(90)));\n\n for (const p of proposals) {\n const state = PROPOSAL_STATES[p.computedState] || \"Unknown\";\n const created = p.snapshotTimestamp > 0n\n ? new Date(Number(p.snapshotTimestamp) * 1000).toLocaleDateString()\n : \"—\";\n const agent = `${p.proposer.slice(0, 6)}...${p.proposer.slice(-4)}`;\n const fee = `${Number(p.performanceFeeBps) / 100}%`;\n const dur = formatDuration(p.strategyDuration);\n const votes = `${formatShares(p.votesFor)}/${formatShares(p.votesAgainst)}`;\n\n console.log(\n ` ${String(p.id).padEnd(4)}` +\n `${agent.padEnd(14)}` +\n `${state.padEnd(12)}` +\n `${votes.padEnd(22)}` +\n `${fee.padEnd(8)}` +\n `${dur.padEnd(10)}` +\n `${created}`,\n );\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposals\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── proposal show ──\n\n proposal\n .command(\"show\")\n .description(\"Show full proposal details\")\n .argument(\"<id>\", \"Proposal ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading proposal...\").start();\n try {\n const id = parseBigIntArg(idStr, \"proposal ID\");\n const p = await getProposal(id);\n const state = await getProposalState(id);\n const params = await getGovernorParams();\n\n spinner.stop();\n\n const stateLabel = PROPOSAL_STATES[state] || \"Unknown\";\n const totalVotes = p.votesFor + p.votesAgainst;\n const quorumNeeded = totalVotes > 0n ? `${Number(params.vetoThresholdBps) / 100}%` : \"—\";\n\n console.log();\n console.log(LABEL(` ◆ Proposal #${p.id}`));\n SEP();\n\n // Try to resolve IPFS metadata\n if (p.metadataURI && p.metadataURI.startsWith(\"ipfs://\")) {\n try {\n const meta = await fetchMetadata(p.metadataURI);\n console.log(W(` Name: ${BOLD(meta.name)}`));\n console.log(W(` Description: ${DIM(meta.description)}`));\n } catch {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n } else if (p.metadataURI) {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n\n console.log(W(` State: ${BOLD(stateLabel)}`));\n console.log(W(` Proposer: ${G(p.proposer)}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(` Performance Fee: ${Number(p.performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(p.strategyDuration)}`));\n\n console.log();\n console.log(LABEL(\" Timestamps\"));\n console.log(W(` Snapshot: ${formatTimestamp(p.snapshotTimestamp)}`));\n console.log(W(` Vote End: ${formatTimestamp(p.voteEnd)}`));\n console.log(W(` Execute By: ${formatTimestamp(p.executeBy)}`));\n console.log(W(` Executed At: ${formatTimestamp(p.executedAt)}`));\n\n console.log();\n console.log(LABEL(\" Votes\"));\n console.log(W(` For: ${formatShares(p.votesFor)}`));\n console.log(W(` Against: ${formatShares(p.votesAgainst)}`));\n console.log(W(` Abstain: ${formatShares(p.votesAbstain)}`));\n console.log(W(` Veto Threshold: ${quorumNeeded}`));\n\n if (state === PROPOSAL_STATE.Executed || state === PROPOSAL_STATE.Settled) {\n try {\n const cap = await getCapitalSnapshot(id);\n console.log();\n console.log(LABEL(\" Capital\"));\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(W(` Snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot */ }\n }\n\n const execCalls = await getExecuteCalls(id);\n const settlCalls = await getSettlementCalls(id);\n\n console.log();\n console.log(LABEL(` Execute Calls (${execCalls.length})`));\n for (let i = 0; i < execCalls.length; i++) {\n console.log(DIM(` [${i}] target=${execCalls[i].target}`));\n console.log(DIM(` data=${execCalls[i].data.slice(0, 20)}... value=${execCalls[i].value}`));\n }\n console.log(LABEL(` Settlement Calls (${settlCalls.length})`));\n for (let i = 0; i < settlCalls.length; i++) {\n console.log(DIM(` [${i}] target=${settlCalls[i].target}`));\n console.log(DIM(` data=${settlCalls[i].data.slice(0, 20)}... value=${settlCalls[i].value}`));\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposal\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── proposal vote ──\n\n proposal\n .command(\"vote\")\n .description(\"Cast a vote on a pending proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .requiredOption(\"--support <for|against|abstain>\", \"Vote direction: for, against, or abstain\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const supportRaw = String(opts.support).toLowerCase();\n const support = supportRaw === \"yes\" || supportRaw === \"for\"\n ? VOTE_TYPE.For\n : supportRaw === \"no\" || supportRaw === \"against\"\n ? VOTE_TYPE.Against\n : supportRaw === \"abstain\"\n ? VOTE_TYPE.Abstain\n : null;\n if (support === null) {\n console.error(chalk.red(`Invalid support value \"${opts.support}\". Use for|against|abstain.`));\n process.exit(1);\n }\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Pending`);\n process.exit(1);\n }\n\n const alreadyVoted = await hasVoted(proposalId, account.address);\n if (alreadyVoted) {\n spinner.fail(\"You have already voted on this proposal\");\n process.exit(1);\n }\n\n const weight = await getVoteWeight(proposalId, account.address);\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Cast Vote\"));\n SEP();\n console.log(W(` Proposal: #${proposalId}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(\n ` Support: ${\n support === VOTE_TYPE.For ? G(\"FOR\")\n : support === VOTE_TYPE.Against ? chalk.red(\"AGAINST\")\n : DIM(\"ABSTAIN\")\n }`,\n ));\n console.log(W(` Weight: ${formatShares(weight)} shares`));\n SEP();\n\n const voteSpinner = ora({ text: W(\"Submitting vote...\"), color: \"green\" }).start();\n const hash = await vote(proposalId, support);\n voteSpinner.succeed(G(\"Vote cast\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal execute ──\n\n proposal\n .command(\"execute\")\n .description(\"Execute an approved proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--dry-run\", \"Simulate execution without sending a transaction\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Approved) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Approved`);\n process.exit(1);\n }\n\n // Dry run — simulate instead of executing\n if (opts.dryRun) {\n const p = await getProposal(proposalId);\n const execCalls = await getExecuteCalls(proposalId);\n const dryRunContext: RiskContext = {\n vault: p.vault,\n performanceFeeBps: p.performanceFeeBps,\n strategyDuration: p.strategyDuration,\n };\n spinner.text = W(\"Simulating execution...\");\n const result = await simulateBatchCalls(p.vault, execCalls, \"execute\", dryRunContext);\n spinner.stop();\n printSimulationResult(result, \"execute\");\n const hasCritical = result.risks.some((r) => r.level === \"critical\");\n process.exit(result.success && !hasCritical ? 0 : 1);\n }\n\n spinner.text = W(\"Executing proposal...\");\n const hash = await executeProposal(proposalId);\n spinner.succeed(G(\"Proposal executed\"));\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n try {\n const cap = await getCapitalSnapshot(proposalId);\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(DIM(` Capital snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot yet */ }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal settle ──\n\n proposal\n .command(\"settle\")\n .description(\"Settle an executed proposal (auto-routes settlement path)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--calls <path>\", \"Path to JSON file with settle Call[] (for agent/emergency settle)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Executed`);\n process.exit(1);\n }\n\n const isProposer = account.address.toLowerCase() === p.proposer.toLowerCase();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const durationElapsed = p.executedAt > 0n && now >= p.executedAt + p.strategyDuration;\n\n let hash: Hex;\n\n if (isProposer && !durationElapsed) {\n // Proposer can settle anytime\n spinner.text = W(\"Settling (proposer)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled by proposer\"));\n } else if (durationElapsed && !opts.calls) {\n // Permissionless settle after duration\n spinner.text = W(\"Settling (permissionless)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled (permissionless)\"));\n } else if (durationElapsed && opts.calls) {\n // Emergency settle — owner with custom calls\n spinner.text = W(\"Emergency settling...\");\n const calls = parseCallsFile(opts.calls);\n hash = await emergencySettle(proposalId, calls);\n spinner.succeed(G(\"Emergency settled\"));\n } else {\n spinner.fail(\"Cannot settle: duration not elapsed and you are not the proposer.\");\n process.exit(1);\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal unstick ──\n // Guardian-only recovery path. Hidden from `--help` on purpose: this is a\n // last-resort command used by the syndicate-owner skill when an Executed\n // proposal's pre-committed settlement calls revert, leaving the vault\n // locked (`redemptionsLocked() == true`, `getActiveProposal(vault) != 0`).\n //\n // It calls `emergencySettle(id, [noopCall])` where `noopCall` is a\n // harmless `asset.balanceOf(vault)` view-call on the vault's underlying\n // asset. The governor's `_tryPrecommittedThenFallback` catches the\n // pre-committed revert and runs this no-op fallback, causing\n // `_finishSettlement` to mark the proposal `Settled` and clear\n // `_activeProposal[vault]`. LPs can redeem afterwards.\n //\n // Docs: skill/skills/syndicate-owner/SKILL.md § \"Recovering a stuck proposal\"\n\n proposal\n .command(\"unstick\", { hidden: true })\n .description(\n \"Guardian-only: unstick a vault whose Executed proposal cannot settle (no funds moved)\",\n )\n .requiredOption(\"--id <proposalId>\", \"Proposal ID to unstick\")\n .option(\"--yes\", \"Skip the interactive confirmation\")\n .option(\n \"--dry-run\",\n \"Check preconditions and print the fallback call without broadcasting\",\n )\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n // 1. State must be Executed\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(\n `Proposal ${proposalId} is ${PROPOSAL_STATES[state] || \"Unknown\"} — unstick only applies to Executed proposals.`,\n );\n console.error(\n DIM(\n \"\\n Other states have their own recovery path:\\n\" +\n \" Draft/Pending → sherwood proposal cancel --id <id>\\n\" +\n \" Approved → sherwood proposal veto <id>\\n\" +\n \" Expired → vault is not locked, nothing to do\\n\" +\n \" Settled → already settled\\n\" +\n \" Cancelled → governor upgrade required (issue #177)\\n\",\n ),\n );\n process.exit(1);\n }\n\n // 2. Strategy duration must have elapsed (emergencySettle requires it)\n const now = BigInt(Math.floor(Date.now() / 1000));\n const expiresAt = p.executedAt + p.strategyDuration;\n if (p.executedAt === 0n || now < expiresAt) {\n spinner.fail(\"Strategy duration has not elapsed yet.\");\n const remaining = expiresAt - now;\n console.error(\n DIM(\n `\\n Can unstick after: ${new Date(Number(expiresAt) * 1000).toLocaleString()} (in ~${formatDuration(remaining)})\\n`,\n ),\n );\n process.exit(1);\n }\n\n // 3. Vault must actually be locked by this proposal\n const vault = p.vault as Address;\n const active = await getActiveProposal(vault);\n if (active !== proposalId) {\n spinner.fail(\n `Vault ${vault} active proposal is ${active}, not ${proposalId} — nothing to unstick for this proposal.`,\n );\n process.exit(1);\n }\n\n // 4. Caller must be vault owner\n const vaultOwner = await getVaultOwner(vault);\n if (account.address.toLowerCase() !== vaultOwner.toLowerCase()) {\n spinner.fail(\"Only the vault owner can unstick a proposal.\");\n console.error(\n DIM(`\\n Vault owner: ${vaultOwner}\\n Your wallet: ${account.address}\\n`),\n );\n process.exit(1);\n }\n\n // 5. Craft the no-op fallback call: asset.balanceOf(vault)\n // Cannot revert, costs ~2.5k gas, satisfies fallbackCalls.length > 0\n // requirement in _tryPrecommittedThenFallback.\n const asset = await getAssetAddress();\n const noopCalldata = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vault],\n });\n const fallbackCalls: BatchCall[] = [\n { target: asset, data: noopCalldata, value: 0n },\n ];\n\n spinner.stop();\n\n // Print plan\n console.log();\n console.log(BOLD(\"Unstick plan\"));\n SEP();\n console.log(` Proposal: ${proposalId}`);\n console.log(` Vault: ${vault}`);\n console.log(` Asset: ${asset}`);\n console.log(` State: ${PROPOSAL_STATES[state]} (duration elapsed)`);\n console.log(` Caller: ${account.address} (vault owner ✓)`);\n console.log();\n console.log(LABEL(\" Fallback call (no-op, cannot revert):\"));\n console.log(DIM(` target: ${asset}`));\n console.log(DIM(` data: ${noopCalldata} // balanceOf(${vault})`));\n console.log(DIM(\" value: 0\"));\n console.log();\n console.log(\n DIM(\n \" This calls emergencySettle(id, [noop]). The governor catches any revert\\n\" +\n \" from the pre-committed settlement calls and runs the no-op instead. No\\n\" +\n \" funds move. The proposal transitions to Settled and the vault unlocks.\\n\" +\n \" LPs can then redeem via `sherwood vault redeem`.\",\n ),\n );\n console.log();\n\n if (opts.dryRun) {\n console.log(G(\" (dry-run) Preconditions OK — not broadcasting.\\n\"));\n return;\n }\n\n if (!opts.yes) {\n process.stdout.write(chalk.yellow(\" Proceed? [y/N] \"));\n const answer = await new Promise<string>((resolve) => {\n process.stdin.resume();\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.once(\"data\", (d) => resolve(String(d).trim().toLowerCase()));\n });\n process.stdin.pause();\n if (answer !== \"y\" && answer !== \"yes\") {\n console.log(DIM(\" Cancelled.\\n\"));\n return;\n }\n }\n\n const send = ora(\"Broadcasting emergencySettle...\").start();\n const hash = await emergencySettle(proposalId, fallbackCalls);\n send.succeed(G(\"Vault unstuck — proposal Settled\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n // Verify unlock\n const stillActive = await getActiveProposal(vault);\n if (stillActive === 0n) {\n console.log(G(\" redemptionsLocked cleared ✓\"));\n } else {\n console.log(\n chalk.yellow(\n ` ⚠ getActiveProposal(vault) still returns ${stillActive} — check manually.`,\n ),\n );\n }\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal cancel ──\n\n proposal\n .command(\"cancel\")\n .description(\"Cancel a proposal (proposer or vault owner)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--emergency\", \"Emergency cancel (vault owner only, any non-settled state)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state === PROPOSAL_STATE.Settled || state === PROPOSAL_STATE.Cancelled) {\n spinner.fail(`Proposal is already ${PROPOSAL_STATES[state]}`);\n process.exit(1);\n }\n\n let hash: Hex;\n\n if (opts.emergency) {\n spinner.text = W(\"Emergency cancelling...\");\n hash = await emergencyCancel(proposalId);\n spinner.succeed(G(\"Emergency cancelled\"));\n } else {\n if (state !== PROPOSAL_STATE.Draft && state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"} — use --emergency for non-pending/approved`);\n process.exit(1);\n }\n spinner.text = W(\"Cancelling proposal...\");\n hash = await cancelProposal(proposalId);\n spinner.succeed(G(\"Proposal cancelled\"));\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal simulate ──\n\n proposal\n .command(\"simulate\")\n .description(\"Simulate proposal calls via Tenderly (or eth_call fallback)\")\n .option(\"--id <proposalId>\", \"Proposal ID to simulate\")\n .option(\"--vault <address>\", \"Vault address (required with --execute-calls)\")\n .option(\"--execute-calls <path>\", \"Path to JSON execute calls file\")\n .option(\"--settle-calls <path>\", \"Path to JSON settlement calls file\")\n .option(\"--notify <subdomain>\", \"Send results to syndicate XMTP chat\")\n .action(async (opts) => {\n try {\n let vault: Address;\n let executeCalls: BatchCall[];\n let settlementCalls: BatchCall[] = [];\n let riskContext: RiskContext = {};\n let proposalId: bigint | undefined;\n\n if (opts.id) {\n // By proposal ID — fetch calls and build full risk context\n proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const spinner = ora(\"Loading proposal...\").start();\n\n const p = await getProposal(proposalId);\n vault = p.vault;\n executeCalls = await getExecuteCalls(proposalId);\n settlementCalls = await getSettlementCalls(proposalId);\n\n riskContext = {\n vault,\n performanceFeeBps: p.performanceFeeBps,\n strategyDuration: p.strategyDuration,\n };\n\n try {\n const govParams = await getGovernorParams();\n riskContext.governorParams = govParams;\n } catch { /* non-fatal */ }\n\n spinner.stop();\n console.log(DIM(`\\n Simulating proposal #${proposalId} on vault ${vault.slice(0, 10)}...`));\n } else if (opts.executeCalls) {\n // By call files — minimal risk context (no proposal params)\n if (!opts.vault || !isAddress(opts.vault)) {\n console.error(chalk.red(\"\\n ✖ --vault is required when using --execute-calls\"));\n process.exit(1);\n }\n vault = opts.vault as Address;\n executeCalls = parseCallsFile(opts.executeCalls);\n if (opts.settleCalls) {\n settlementCalls = parseCallsFile(opts.settleCalls);\n }\n riskContext = { vault };\n } else {\n console.error(chalk.red(\"\\n ✖ Provide --id <proposalId> or --execute-calls <path>\"));\n process.exit(1);\n }\n\n // Simulate execute calls\n const spinner = ora({ text: W(\"Simulating execute calls...\"), color: \"green\" }).start();\n const execResult = await simulateBatchCalls(vault, executeCalls, \"execute\", riskContext);\n spinner.stop();\n printSimulationResult(execResult, \"execute\");\n\n // Simulate settlement calls if present\n let settleResult;\n if (settlementCalls.length > 0) {\n const settleSpinner = ora({ text: W(\"Simulating settlement calls...\"), color: \"green\" }).start();\n settleResult = await simulateBatchCalls(vault, settlementCalls, \"settlement\", riskContext);\n settleSpinner.stop();\n printSimulationResult(settleResult, \"settlement\");\n }\n\n // Send XMTP notification if requested\n if (opts.notify && proposalId !== undefined) {\n const notifySpinner = ora({ text: W(\"Sending XMTP alert...\"), color: \"green\" }).start();\n await sendSimulationAlert(opts.notify, proposalId, vault, execResult, settleResult);\n notifySpinner.succeed(G(\"Risk report sent to chat\"));\n }\n\n // Exit with failure code if simulation or risks are critical\n const hasCritical = execResult.risks.some((r) => r.level === \"critical\")\n || (settleResult?.risks.some((r) => r.level === \"critical\") ?? false);\n\n if (!execResult.success || (settleResult && !settleResult.success) || hasCritical) {\n process.exit(1);\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * Shared formatting helpers for CLI output.\n */\n\n/** Compact duration: \"3d\", \"2.5h\", \"15m\", \"30s\" */\nexport function formatDurationShort(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)}d`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)}h`;\n if (s >= 60) return `${(s / 60).toFixed(0)}m`;\n return `${s}s`;\n}\n\n/** Verbose duration: \"3 days\", \"2.5 hours\", \"15 min\", \"30s\" */\nexport function formatDurationLong(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)} day${s >= 172800 ? \"s\" : \"\"}`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)} hour${s >= 7200 ? \"s\" : \"\"}`;\n if (s >= 60) return `${(s / 60).toFixed(0)} min`;\n return `${s}s`;\n}\n\n/** Format raw share amounts to human-readable (e.g. 124000000000 → \"124,000\") */\nexport function formatShares(raw: bigint, decimals: number = 6): string {\n const num = Number(raw) / 10 ** decimals;\n return num.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n}\n\n/** Format USDC amount (6 decimals) to human-readable (e.g. 50000000000 → \"$50,000.00\") */\nexport function formatUSDC(raw: bigint): string {\n const num = Number(raw) / 1e6;\n return `$${num.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/** Validate string as BigInt, throw user-friendly error */\nexport function parseBigIntArg(value: string, name: string): bigint {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Invalid ${name}: \"${value}\" is not a valid integer`);\n }\n return BigInt(value);\n}\n","/**\n * Proposal simulation — Tenderly API client, eth_call fallback,\n * calldata decoder, and CLI output formatter.\n *\n * The Tenderly integration is proxied through the Sherwood app API\n * (/api/simulate) so credentials stay server-side.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { decodeFunctionData, encodeFunctionData } from \"viem\";\nimport chalk from \"chalk\";\nimport { getPublicClient } from \"./client.js\";\nimport { getChain } from \"./network.js\";\nimport { getGovernorAddress } from \"./governor.js\";\nimport type { GovernorParams } from \"./governor.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, SWAP_ROUTER_ABI } from \"./abis.js\";\nimport { TOKENS, MOONWELL, UNISWAP, SHERWOOD, AERODROME, VENICE, STRATEGY_TEMPLATES } from \"./addresses.js\";\nimport type { BatchCall } from \"./batch.js\";\n\n// ── Styling (matches proposal.ts conventions) ────────────\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\n// ── Types ────────────────────────────────────────────────\n\nexport interface SimulationCallResult {\n index: number;\n target: Address;\n decodedFunction: string | null;\n selector: Hex;\n success: boolean;\n gasUsed: number;\n}\n\nexport interface SimulationResult {\n success: boolean;\n totalGasUsed: number;\n callResults: SimulationCallResult[];\n warnings: string[];\n risks: RiskFlag[];\n source: \"api\" | \"eth_call\";\n errorMessage?: string;\n}\n\n// ── Risk analysis types ─────────────────────────────────\n\nexport type RiskLevel = \"critical\" | \"warning\" | \"info\";\n\nexport interface RiskFlag {\n level: RiskLevel;\n code: string;\n message: string;\n callIndex?: number;\n}\n\nexport interface RiskContext {\n vault?: Address;\n performanceFeeBps?: bigint;\n strategyDuration?: bigint;\n governorParams?: GovernorParams;\n}\n\n// ── Moonwell cToken ABI fragment (not in main abis.ts) ───\n\nconst MOONWELL_CTOKEN_ABI = [\n {\n name: \"mint\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mintAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeem\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"redeemTokens\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeemUnderlying\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"redeemAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"borrow\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"borrowAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"repayBorrow\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"repayAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Moonwell Comptroller ABI fragment ────────────────────\n\nconst MOONWELL_COMPTROLLER_ABI = [\n {\n name: \"enterMarkets\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mTokens\", type: \"address[]\" }],\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n },\n {\n name: \"exitMarket\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mToken\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Uniswap SwapRouter exactInputSingle ABI fragment ─────\n\nconst SWAP_ROUTER_SINGLE_ABI = [\n {\n name: \"exactInputSingle\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Address label registry ───────────────────────────────\n\nfunction buildLabelMap(): Map<string, string> {\n const map = new Map<string, string>();\n const add = (addr: Address, label: string) => {\n if (addr !== \"0x0000000000000000000000000000000000000000\") {\n map.set(addr.toLowerCase(), label);\n }\n };\n\n try {\n const tokens = TOKENS();\n add(tokens.USDC, \"USDC\");\n add(tokens.WETH, \"WETH\");\n add(tokens.cbETH, \"cbETH\");\n add(tokens.wstETH, \"wstETH\");\n add(tokens.cbBTC, \"cbBTC\");\n add(tokens.DAI, \"DAI\");\n add(tokens.AERO, \"AERO\");\n\n const mw = MOONWELL();\n add(mw.COMPTROLLER, \"Moonwell Comptroller\");\n add(mw.mUSDC, \"mUSDC\");\n add(mw.mWETH, \"mWETH\");\n add(mw.mCbETH, \"mCbETH\");\n add(mw.mWstETH, \"mWstETH\");\n add(mw.mCbBTC, \"mCbBTC\");\n add(mw.mDAI, \"mDAI\");\n add(mw.mAERO, \"mAERO\");\n\n const uni = UNISWAP();\n add(uni.SWAP_ROUTER, \"SwapRouter\");\n add(uni.QUOTER_V2, \"QuoterV2\");\n\n const sw = SHERWOOD();\n add(sw.FACTORY, \"SyndicateFactory\");\n add(sw.GOVERNOR, \"SyndicateGovernor\");\n\n const aero = AERODROME();\n add(aero.ROUTER, \"Aerodrome Router\");\n add(aero.FACTORY, \"Aerodrome Factory\");\n\n const venice = VENICE();\n add(venice.VVV, \"VVV\");\n add(venice.STAKING, \"sVVV Staking\");\n add(venice.DIEM, \"DIEM\");\n\n const strats = STRATEGY_TEMPLATES();\n add(strats.MOONWELL_SUPPLY, \"MoonwellSupplyStrategy\");\n add(strats.AERODROME_LP, \"AerodromeLPStrategy\");\n add(strats.VENICE_INFERENCE, \"VeniceInferenceStrategy\");\n add(strats.WSTETH_MOONWELL, \"WstETHMoonwellStrategy\");\n } catch {\n // Network not set yet — return partial map\n }\n\n return map;\n}\n\n/** Known token decimals for human-readable formatting */\nfunction buildDecimalsMap(): Map<string, { decimals: number; symbol: string }> {\n const map = new Map<string, { decimals: number; symbol: string }>();\n try {\n const tokens = TOKENS();\n map.set(tokens.USDC.toLowerCase(), { decimals: 6, symbol: \"USDC\" });\n map.set(tokens.WETH.toLowerCase(), { decimals: 18, symbol: \"WETH\" });\n map.set(tokens.cbETH.toLowerCase(), { decimals: 18, symbol: \"cbETH\" });\n map.set(tokens.wstETH.toLowerCase(), { decimals: 18, symbol: \"wstETH\" });\n map.set(tokens.cbBTC.toLowerCase(), { decimals: 8, symbol: \"cbBTC\" });\n map.set(tokens.DAI.toLowerCase(), { decimals: 18, symbol: \"DAI\" });\n map.set(tokens.AERO.toLowerCase(), { decimals: 18, symbol: \"AERO\" });\n } catch {\n // Network not set\n }\n return map;\n}\n\n/** Moonwell mToken → underlying token address mapping */\nfunction buildMTokenToUnderlying(): Map<string, string> {\n const map = new Map<string, string>();\n try {\n const mw = MOONWELL();\n const tokens = TOKENS();\n map.set(mw.mUSDC.toLowerCase(), tokens.USDC.toLowerCase());\n map.set(mw.mWETH.toLowerCase(), tokens.WETH.toLowerCase());\n map.set(mw.mCbETH.toLowerCase(), tokens.cbETH.toLowerCase());\n map.set(mw.mWstETH.toLowerCase(), tokens.wstETH.toLowerCase());\n map.set(mw.mCbBTC.toLowerCase(), tokens.cbBTC.toLowerCase());\n map.set(mw.mDAI.toLowerCase(), tokens.DAI.toLowerCase());\n map.set(mw.mAERO.toLowerCase(), tokens.AERO.toLowerCase());\n } catch {\n // Network not set\n }\n return map;\n}\n\nexport function getAddressLabel(addr: Address): string | null {\n const labels = buildLabelMap();\n return labels.get(addr.toLowerCase()) ?? null;\n}\n\n// ── Human-readable formatting helpers ────────────────────\n\nfunction truncAddr(addr: string): string {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n}\n\nfunction labeledAddr(addr: string): string {\n const label = buildLabelMap().get(addr.toLowerCase());\n const short = truncAddr(addr);\n return label ? `${short} (${label})` : short;\n}\n\nfunction formatTokenAmount(amount: bigint, target: string): string {\n const decimalsMap = buildDecimalsMap();\n\n // Direct match: target is a token\n const tokenInfo = decimalsMap.get(target.toLowerCase());\n if (tokenInfo) {\n return formatWithDecimals(amount, tokenInfo.decimals, tokenInfo.symbol);\n }\n\n // mToken: use underlying token's decimals\n const mTokenMap = buildMTokenToUnderlying();\n const underlying = mTokenMap.get(target.toLowerCase());\n if (underlying) {\n const underlyingInfo = decimalsMap.get(underlying);\n if (underlyingInfo) {\n return formatWithDecimals(amount, underlyingInfo.decimals, underlyingInfo.symbol);\n }\n }\n\n // Unknown — return raw\n return amount.toString();\n}\n\nfunction formatWithDecimals(amount: bigint, decimals: number, symbol: string): string {\n const num = Number(amount) / 10 ** decimals;\n const formatted = num.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: decimals <= 8 ? 2 : 4,\n });\n return `${formatted} ${symbol}`;\n}\n\n// ── Calldata decoder ─────────────────────────────────────\n\n/**\n * Decode calldata into a human-readable function call string.\n * Returns null for unknown selectors.\n */\nexport function decodeCallData(target: Address, data: Hex): string | null {\n if (data.length < 10) return null;\n\n const labels = buildLabelMap();\n const targetLower = target.toLowerCase();\n\n // Build a list of (abi, contextLabel) pairs to try, ordered by target match\n type AbiEntry = { abi: readonly unknown[]; context: string };\n const candidates: AbiEntry[] = [];\n\n // Moonwell mTokens\n const mw = safeCall(() => MOONWELL());\n if (mw) {\n const isMToken = [mw.mUSDC, mw.mWETH, mw.mCbETH, mw.mWstETH, mw.mCbBTC, mw.mDAI, mw.mAERO]\n .some((a) => a.toLowerCase() === targetLower);\n if (isMToken) {\n candidates.push({ abi: MOONWELL_CTOKEN_ABI, context: labels.get(targetLower) || \"mToken\" });\n }\n\n if (mw.COMPTROLLER.toLowerCase() === targetLower) {\n candidates.push({ abi: MOONWELL_COMPTROLLER_ABI, context: \"Comptroller\" });\n }\n }\n\n // Uniswap SwapRouter\n const uni = safeCall(() => UNISWAP());\n if (uni && uni.SWAP_ROUTER.toLowerCase() === targetLower) {\n candidates.push({ abi: SWAP_ROUTER_ABI, context: \"SwapRouter\" });\n candidates.push({ abi: SWAP_ROUTER_SINGLE_ABI, context: \"SwapRouter\" });\n }\n\n // ERC20 as generic fallback (always try last)\n candidates.push({ abi: ERC20_ABI, context: labels.get(targetLower) || \"ERC20\" });\n\n for (const { abi, context } of candidates) {\n try {\n const decoded = decodeFunctionData({\n abi: abi as readonly unknown[],\n data,\n });\n\n const args = formatArgs(decoded.args as readonly unknown[], decoded.functionName, target);\n return `${decoded.functionName}(${args})`;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nfunction formatArgs(args: readonly unknown[], functionName: string, target: Address): string {\n if (!args || args.length === 0) return \"\";\n\n const parts: string[] = [];\n\n for (const arg of args) {\n if (typeof arg === \"bigint\") {\n parts.push(formatTokenAmount(arg, target));\n } else if (typeof arg === \"string\" && arg.startsWith(\"0x\") && arg.length === 42) {\n parts.push(labeledAddr(arg));\n } else if (typeof arg === \"object\" && arg !== null && !Array.isArray(arg)) {\n // Struct (e.g. exactInput params)\n const entries = Object.entries(arg as Record<string, unknown>);\n const structParts: string[] = [];\n for (const [key, val] of entries) {\n if (typeof val === \"bigint\") {\n structParts.push(`${key}: ${formatTokenAmount(val, target)}`);\n } else if (typeof val === \"string\" && val.startsWith(\"0x\") && val.length === 42) {\n structParts.push(`${key}: ${labeledAddr(val)}`);\n } else if (typeof val === \"string\" && val.startsWith(\"0x\") && key === \"path\") {\n structParts.push(`path: ${decodeUniswapPath(val)}`);\n } else {\n structParts.push(`${key}: ${String(val)}`);\n }\n }\n parts.push(`{${structParts.join(\", \")}}`);\n } else if (Array.isArray(arg)) {\n const arrParts = (arg as unknown[]).map((item) => {\n if (typeof item === \"string\" && item.startsWith(\"0x\") && item.length === 42) {\n return labeledAddr(item);\n }\n return String(item);\n });\n parts.push(`[${arrParts.join(\", \")}]`);\n } else {\n parts.push(String(arg));\n }\n }\n\n return parts.join(\", \");\n}\n\n/** Decode a Uniswap V3 packed path (address + fee + address + ...) */\nfunction decodeUniswapPath(pathHex: string): string {\n const labels = buildLabelMap();\n const path = pathHex.startsWith(\"0x\") ? pathHex.slice(2) : pathHex;\n const tokens: string[] = [];\n\n // Path format: 20 bytes address, 3 bytes fee, 20 bytes address, ...\n let offset = 0;\n while (offset + 40 <= path.length) {\n const addr = `0x${path.slice(offset, offset + 40)}`;\n const label = labels.get(addr.toLowerCase());\n tokens.push(label || truncAddr(addr));\n offset += 40;\n if (offset + 6 <= path.length) {\n offset += 6; // skip 3-byte fee\n } else {\n break;\n }\n }\n\n return tokens.join(\" → \");\n}\n\nfunction safeCall<T>(fn: () => T): T | null {\n try {\n return fn();\n } catch {\n return null;\n }\n}\n\n// ── Raw calldata decoder (for risk analysis) ─────────────\n\ninterface DecodedCall {\n functionName: string;\n args: readonly unknown[];\n}\n\n/**\n * Decode calldata into raw { functionName, args } for risk inspection.\n * Same ABI candidate logic as decodeCallData(), but returns typed values\n * instead of a formatted display string.\n */\nfunction decodeCallArgs(target: Address, data: Hex): DecodedCall | null {\n if (data.length < 10) return null;\n\n const targetLower = target.toLowerCase();\n type AbiEntry = { abi: readonly unknown[] };\n const candidates: AbiEntry[] = [];\n\n const mw = safeCall(() => MOONWELL());\n if (mw) {\n const isMToken = [mw.mUSDC, mw.mWETH, mw.mCbETH, mw.mWstETH, mw.mCbBTC, mw.mDAI, mw.mAERO]\n .some((a) => a.toLowerCase() === targetLower);\n if (isMToken) candidates.push({ abi: MOONWELL_CTOKEN_ABI });\n if (mw.COMPTROLLER.toLowerCase() === targetLower) candidates.push({ abi: MOONWELL_COMPTROLLER_ABI });\n }\n\n const uni = safeCall(() => UNISWAP());\n if (uni && uni.SWAP_ROUTER.toLowerCase() === targetLower) {\n candidates.push({ abi: SWAP_ROUTER_ABI });\n candidates.push({ abi: SWAP_ROUTER_SINGLE_ABI });\n }\n\n candidates.push({ abi: ERC20_ABI });\n\n for (const { abi } of candidates) {\n try {\n const decoded = decodeFunctionData({ abi: abi as readonly unknown[], data });\n return { functionName: decoded.functionName, args: decoded.args as readonly unknown[] };\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n// ── Risk analysis engine ─────────────────────────────────\n\n/**\n * Analyze simulation results for semantic risks.\n * Pure function — no chain calls. Checks each call against the known\n * address registry and flags dangerous patterns.\n */\nexport function analyzeRisk(\n calls: BatchCall[],\n callResults: SimulationCallResult[],\n context?: RiskContext,\n): RiskFlag[] {\n const risks: RiskFlag[] = [];\n const labels = buildLabelMap();\n const vaultLower = context?.vault?.toLowerCase();\n\n const isKnown = (addr: string): boolean => {\n const lower = addr.toLowerCase();\n return labels.has(lower) || lower === vaultLower;\n };\n\n // ── Per-call checks ──\n\n let allTargetsVerified = true;\n let allCallsDecoded = true;\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const result = callResults[i];\n const callNum = i + 1;\n\n // Simulation failure\n if (result && !result.success) {\n risks.push({\n level: \"critical\",\n code: \"SIMULATION_FAILED\",\n message: `Call #${callNum} to ${labeledAddr(call.target)} reverted during simulation`,\n callIndex: i,\n });\n }\n\n // Unknown target\n const targetKnown = isKnown(call.target);\n if (!targetKnown) {\n allTargetsVerified = false;\n risks.push({\n level: \"critical\",\n code: \"UNKNOWN_TARGET\",\n message: `Call #${callNum} targets ${labeledAddr(call.target)} which is not in the known address registry`,\n callIndex: i,\n });\n }\n\n // Decode calldata for inspection\n const decoded = decodeCallArgs(call.target, call.data);\n\n if (!decoded) {\n allCallsDecoded = false;\n if (!targetKnown) {\n risks.push({\n level: \"critical\",\n code: \"UNDECODED_CALLDATA\",\n message: `Call #${callNum} has unrecognized calldata (selector ${call.data.slice(0, 10)}) targeting unknown contract`,\n callIndex: i,\n });\n }\n continue;\n }\n\n // transfer(to, amount) → check 'to'\n if (decoded.functionName === \"transfer\" && decoded.args.length >= 2) {\n const to = decoded.args[0] as string;\n if (typeof to === \"string\" && to.startsWith(\"0x\") && !isKnown(to)) {\n risks.push({\n level: \"critical\",\n code: \"TRANSFER_TO_UNKNOWN\",\n message: `Call #${callNum} transfer() sends funds to ${truncAddr(to)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n\n // transferFrom(from, to, amount) → check 'to'\n if (decoded.functionName === \"transferFrom\" && decoded.args.length >= 3) {\n const to = decoded.args[1] as string;\n if (typeof to === \"string\" && to.startsWith(\"0x\") && !isKnown(to)) {\n risks.push({\n level: \"critical\",\n code: \"TRANSFER_FROM_TO_UNKNOWN\",\n message: `Call #${callNum} transferFrom() sends funds to ${truncAddr(to)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n\n // approve(spender, amount) → check 'spender'\n if (decoded.functionName === \"approve\" && decoded.args.length >= 2) {\n const spender = decoded.args[0] as string;\n if (typeof spender === \"string\" && spender.startsWith(\"0x\") && !isKnown(spender)) {\n risks.push({\n level: \"critical\",\n code: \"APPROVE_TO_UNKNOWN\",\n message: `Call #${callNum} approve() grants allowance to ${truncAddr(spender)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n }\n\n // ── Proposal parameter checks ──\n\n if (context?.performanceFeeBps !== undefined) {\n const fee = context.performanceFeeBps;\n const maxFee = context.governorParams?.maxPerformanceFeeBps;\n\n if (maxFee && fee > (maxFee * 80n) / 100n) {\n risks.push({\n level: \"critical\",\n code: \"EXCESSIVE_PERFORMANCE_FEE\",\n message: `Performance fee ${Number(fee) / 100}% is within 20% of the hard cap (${Number(maxFee) / 100}%)`,\n });\n } else if (fee > 2000n) {\n risks.push({\n level: \"warning\",\n code: \"HIGH_PERFORMANCE_FEE\",\n message: `Performance fee ${Number(fee) / 100}% exceeds 20% threshold`,\n });\n }\n }\n\n if (context?.strategyDuration !== undefined) {\n const dur = context.strategyDuration;\n if (dur < 3600n) {\n risks.push({\n level: \"warning\",\n code: \"SHORT_STRATEGY_DURATION\",\n message: `Strategy duration ${Number(dur)}s is under 1 hour — flash-loan-style risk`,\n });\n }\n if (dur > 2_592_000n) {\n risks.push({\n level: \"warning\",\n code: \"LONG_STRATEGY_DURATION\",\n message: `Strategy duration ${Number(dur) / 86400} days exceeds 30-day threshold`,\n });\n }\n }\n\n // ── Summary flags ──\n\n const hasCritical = risks.some((r) => r.level === \"critical\");\n const hasWarning = risks.some((r) => r.level === \"warning\");\n\n if (!hasCritical && !hasWarning) {\n if (allTargetsVerified) {\n risks.push({\n level: \"info\",\n code: \"ALL_TARGETS_VERIFIED\",\n message: \"All call targets are verified protocol addresses\",\n });\n }\n if (allCallsDecoded) {\n risks.push({\n level: \"info\",\n code: \"ALL_CALLS_DECODED\",\n message: \"All calldata successfully decoded\",\n });\n }\n }\n\n return risks;\n}\n\n// ── API simulation ───────────────────────────────────────\n\nconst API_URLS: Record<string, string> = {\n \"base\": \"https://app.sherwood.sh\",\n \"base-sepolia\": \"https://testnet.app.sherwood.sh\",\n};\n\nfunction getApiBaseUrl(): string {\n // Allow override for local development\n if (process.env.SHERWOOD_API_URL) return process.env.SHERWOOD_API_URL;\n\n const chain = getChain();\n return API_URLS[chain.testnet ? \"base-sepolia\" : \"base\"] || API_URLS[\"base\"];\n}\n\nasync function simulateViaApi(\n vault: Address,\n calls: BatchCall[],\n): Promise<SimulationResult> {\n const baseUrl = getApiBaseUrl();\n const chainId = getChain().id;\n\n const response = await fetch(`${baseUrl}/api/simulate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n vault,\n chainId,\n calls: calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({ error: \"Unknown error\" })) as { error?: string; details?: string };\n throw new Error(body.error || `Simulation API returned ${response.status}`);\n }\n\n const result = await response.json() as {\n success: boolean;\n totalGasUsed: number;\n errorMessage: string | null;\n calls: Array<{\n index: number;\n target: string;\n success: boolean;\n gasUsed: number;\n returnData: string;\n }>;\n };\n\n const callResults: SimulationCallResult[] = result.calls.map((c, i) => ({\n index: c.index,\n target: (calls[i]?.target || c.target) as Address,\n decodedFunction: calls[i] ? decodeCallData(calls[i].target, calls[i].data) : null,\n selector: (calls[i]?.data.slice(0, 10) || \"0x\") as Hex,\n success: c.success,\n gasUsed: c.gasUsed,\n }));\n\n // Add decoded functions for any calls the API returned that weren't in our original list\n // (shouldn't happen, but defensive)\n for (const cr of callResults) {\n if (!cr.decodedFunction) {\n const matchingCall = calls[cr.index];\n if (matchingCall) {\n cr.decodedFunction = decodeCallData(matchingCall.target, matchingCall.data);\n }\n }\n }\n\n const warnings: string[] = [];\n for (const cr of callResults) {\n if (!cr.success) {\n warnings.push(`Call #${cr.index + 1} to ${labeledAddr(cr.target)} failed`);\n }\n }\n\n return {\n success: result.success,\n totalGasUsed: result.totalGasUsed,\n callResults,\n warnings,\n risks: [],\n source: \"api\",\n errorMessage: result.errorMessage ?? undefined,\n };\n}\n\n// ── eth_call fallback ────────────────────────────────────\n\nasync function simulateViaEthCall(\n vault: Address,\n calls: BatchCall[],\n): Promise<SimulationResult> {\n const governor = getGovernorAddress();\n const client = getPublicClient();\n\n const input = encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"executeGovernorBatch\",\n args: [calls.map((c) => ({ target: c.target, data: c.data, value: c.value }))],\n });\n\n // Decode calldata for display regardless of simulation result\n const callResults: SimulationCallResult[] = calls.map((c, i) => ({\n index: i,\n target: c.target,\n decodedFunction: decodeCallData(c.target, c.data),\n selector: c.data.slice(0, 10) as Hex,\n success: true, // will be set after simulation\n gasUsed: 0,\n }));\n\n try {\n await client.call({\n account: governor,\n to: vault,\n data: input,\n });\n\n return {\n success: true,\n totalGasUsed: 0,\n callResults,\n warnings: [],\n risks: [],\n source: \"eth_call\",\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // Mark all calls as potentially failed (no per-call granularity)\n for (const cr of callResults) {\n cr.success = false;\n }\n\n return {\n success: false,\n totalGasUsed: 0,\n callResults,\n warnings: [`Batch reverted: ${message.slice(0, 200)}`],\n risks: [],\n source: \"eth_call\",\n errorMessage: message,\n };\n }\n}\n\n// ── Public API ───────────────────────────────────────────\n\nexport async function simulateBatchCalls(\n vault: Address,\n calls: BatchCall[],\n callType: \"execute\" | \"settlement\",\n riskContext?: RiskContext,\n): Promise<SimulationResult> {\n let result: SimulationResult;\n\n try {\n result = await simulateViaApi(vault, calls);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(DIM(` Simulation API unavailable (${message}), falling back to eth_call...`));\n\n result = await simulateViaEthCall(vault, calls);\n }\n\n // Run risk analysis on the results\n const ctx: RiskContext = { vault, ...riskContext };\n result.risks = analyzeRisk(calls, result.callResults, ctx);\n\n return result;\n}\n\n// ── Output formatter ─────────────────────────────────────\n\nexport function printSimulationResult(result: SimulationResult, callType: string): void {\n console.log();\n console.log(LABEL(` ◆ Simulation — ${callType} calls`));\n SEP();\n\n const sourceLabel = result.source === \"api\"\n ? \"Tenderly (via API)\"\n : `eth_call ${DIM(\"(configure Tenderly for detailed results)\")}`;\n console.log(W(` Source: ${sourceLabel}`));\n\n const statusIcon = result.success ? G(\"✓ PASS\") : chalk.red(\"✖ FAIL\");\n console.log(W(` Status: ${statusIcon}`));\n\n if (result.totalGasUsed > 0) {\n console.log(W(` Total Gas: ${result.totalGasUsed.toLocaleString()}`));\n }\n\n if (result.errorMessage && !result.success) {\n console.log(chalk.red(` Error: ${result.errorMessage.slice(0, 120)}`));\n }\n\n console.log();\n\n for (const cr of result.callResults) {\n const icon = cr.success ? G(\"✓\") : chalk.red(\"✖\");\n const funcName = cr.decodedFunction || `${cr.selector}... ${DIM(\"(unknown)\")}`;\n console.log(W(` [${cr.index + 1}] ${icon} ${funcName}`));\n\n const label = getAddressLabel(cr.target);\n const targetDisplay = label ? `${cr.target} (${label})` : cr.target;\n console.log(DIM(` Target: ${targetDisplay}`));\n\n if (cr.gasUsed > 0) {\n console.log(DIM(` Gas: ${cr.gasUsed.toLocaleString()}`));\n }\n\n console.log();\n }\n\n // ── Risk assessment ──\n if (result.risks.length > 0) {\n const criticals = result.risks.filter((r) => r.level === \"critical\");\n const warnings = result.risks.filter((r) => r.level === \"warning\");\n const infos = result.risks.filter((r) => r.level === \"info\");\n\n if (criticals.length > 0) {\n console.log(chalk.red.bold(` ✖ CRITICAL RISKS (${criticals.length})`));\n for (const r of criticals) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n console.log(chalk.red(` ✖${ref} ${r.code} — ${r.message}`));\n }\n console.log();\n }\n\n if (warnings.length > 0) {\n console.log(chalk.yellow.bold(` ⚠ WARNINGS (${warnings.length})`));\n for (const r of warnings) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n console.log(chalk.yellow(` ⚠${ref} ${r.code} — ${r.message}`));\n }\n console.log();\n }\n\n if (criticals.length === 0 && warnings.length === 0 && infos.length > 0) {\n console.log(G.bold(` ✓ RISK ASSESSMENT: CLEAN`));\n for (const r of infos) {\n console.log(G(` ✓ ${r.message}`));\n }\n console.log();\n }\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(` ⚠ Simulation Warnings`));\n for (const w of result.warnings) {\n console.log(chalk.yellow(` - ${w}`));\n }\n console.log();\n }\n\n SEP();\n}\n\n// ── XMTP escalation ─────────────────────────────────────\n\n/**\n * Send a simulation risk report to the syndicate's XMTP chat.\n * Uses RISK_ALERT message type for critical findings, POSITION_UPDATE otherwise.\n * Fails silently if XMTP is not configured.\n */\nexport async function sendSimulationAlert(\n subdomain: string,\n proposalId: bigint,\n vault: Address,\n execResult: SimulationResult,\n settleResult?: SimulationResult,\n): Promise<void> {\n try {\n const xmtp = await import(\"./xmtp.js\");\n const { getAccount } = await import(\"./client.js\");\n\n const group = await xmtp.getGroup(\"\", subdomain);\n\n // Collect all risks across both results\n const allRisks = [...execResult.risks, ...(settleResult?.risks ?? [])];\n const criticals = allRisks.filter((r) => r.level === \"critical\");\n const warnings = allRisks.filter((r) => r.level === \"warning\");\n\n const highestLevel: RiskLevel = criticals.length > 0 ? \"critical\" : warnings.length > 0 ? \"warning\" : \"info\";\n\n // Build markdown report\n const lines: string[] = [];\n const statusEmoji = highestLevel === \"critical\" ? \"🚨\" : highestLevel === \"warning\" ? \"⚠️\" : \"✅\";\n const statusText = highestLevel === \"critical\" ? \"RISKS DETECTED\" : highestLevel === \"warning\" ? \"WARNINGS\" : \"CLEAN\";\n\n lines.push(`## ${statusEmoji} Proposal #${proposalId} — Simulation Report`);\n lines.push(`**Vault**: \\`${truncAddr(vault)}\\``);\n lines.push(`**Status**: ${statusText}`);\n lines.push(`**Source**: ${execResult.source === \"api\" ? \"Tenderly\" : \"eth_call\"}`);\n lines.push(\"\");\n\n // Execute calls summary\n lines.push(`### Execute Calls ${execResult.success ? \"✓\" : \"✖\"}`);\n for (const cr of execResult.callResults) {\n const icon = cr.success ? \"✓\" : \"✖\";\n const fn = cr.decodedFunction || `${cr.selector}...`;\n const flag = allRisks.find((r) => r.callIndex === cr.index);\n const suffix = flag && flag.level === \"critical\" ? \" ← **\" + flag.code + \"**\" : \"\";\n lines.push(`${cr.index + 1}. ${icon} \\`${fn}\\`${suffix}`);\n }\n lines.push(\"\");\n\n // Settlement calls summary (if present)\n if (settleResult && settleResult.callResults.length > 0) {\n lines.push(`### Settlement Calls ${settleResult.success ? \"✓\" : \"✖\"}`);\n for (const cr of settleResult.callResults) {\n const icon = cr.success ? \"✓\" : \"✖\";\n const fn = cr.decodedFunction || `${cr.selector}...`;\n lines.push(`${cr.index + 1}. ${icon} \\`${fn}\\``);\n }\n lines.push(\"\");\n }\n\n // Risk flags\n if (criticals.length > 0) {\n lines.push(`### 🚨 Critical Risks`);\n for (const r of criticals) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n lines.push(`- **${r.code}**${ref}: ${r.message}`);\n }\n lines.push(\"\");\n }\n\n if (warnings.length > 0) {\n lines.push(`### ⚠️ Warnings`);\n for (const r of warnings) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n lines.push(`- **${r.code}**${ref}: ${r.message}`);\n }\n lines.push(\"\");\n }\n\n // Action recommendation\n if (highestLevel === \"critical\") {\n lines.push(`### Action Required`);\n lines.push(`Recommend **VETO** — critical risks detected.`);\n } else if (highestLevel === \"warning\") {\n lines.push(`### Review Required`);\n lines.push(`Warnings detected — manual review recommended before execution.`);\n } else {\n lines.push(`### ✅ No Risks Detected`);\n lines.push(`All call targets verified. All calldata decoded. Safe to proceed.`);\n }\n\n const markdown = lines.join(\"\\n\");\n const messageType = highestLevel === \"critical\" ? \"RISK_ALERT\" as const : \"POSITION_UPDATE\" as const;\n\n await xmtp.sendEnvelope(group, {\n type: messageType,\n from: getAccount().address,\n text: markdown,\n data: {\n format: \"markdown\",\n proposalId: Number(proposalId),\n vault,\n riskLevel: highestLevel,\n riskCodes: allRisks.filter((r) => r.level !== \"info\").map((r) => r.code),\n simulationSuccess: execResult.success && (settleResult?.success ?? true),\n },\n timestamp: Math.floor(Date.now() / 1000),\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.yellow(` ⚠ Failed to send XMTP alert: ${message.slice(0, 100)}`));\n }\n}\n","/**\n * Governor commands — sherwood governor <subcommand>\n *\n * View and manage SyndicateGovernor parameters (owner-only setters).\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { formatContractError } from \"../lib/errors.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getRegisteredVaults,\n setVotingPeriod,\n setExecutionWindow,\n setVetoThresholdBps,\n setProtocolFeeBps,\n setMaxPerformanceFeeBps,\n setMaxStrategyDuration,\n setCooldownPeriod,\n} from \"../lib/governor.js\";\nimport { formatDurationLong as formatDuration, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nexport function registerGovernorCommands(program: Command): void {\n const governor = program.command(\"governor\").description(\"Governor parameters and vault management\");\n\n // ── governor info ──\n\n governor\n .command(\"info\")\n .description(\"Display current governor parameters and registered vaults\")\n .action(async () => {\n const spinner = ora(\"Loading governor info...\").start();\n try {\n const [params, vaults] = await Promise.all([\n getGovernorParams(),\n getRegisteredVaults(),\n ]);\n\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Governor Parameters\"));\n SEP();\n console.log(W(` Address: ${G(getGovernorAddress())}`));\n console.log(W(` Voting Period: ${BOLD(formatDuration(params.votingPeriod))}`));\n console.log(W(` Execution Window: ${BOLD(formatDuration(params.executionWindow))}`));\n console.log(W(` Veto Threshold: ${BOLD(`${Number(params.vetoThresholdBps) / 100}%`)}`));\n console.log(W(` Max Performance Fee: ${BOLD(`${Number(params.maxPerformanceFeeBps) / 100}%`)}`));\n console.log(W(` Max Strategy Duration:${BOLD(` ${formatDuration(params.maxStrategyDuration)}`)}`));\n console.log(W(` Cooldown Period: ${BOLD(formatDuration(params.cooldownPeriod))}`));\n\n console.log();\n console.log(LABEL(` Registered Vaults (${vaults.length})`));\n if (vaults.length === 0) {\n console.log(DIM(\" (none)\"));\n } else {\n for (const v of vaults) {\n console.log(W(` ${G(v)}`));\n }\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load governor info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-voting-period ──\n\n governor\n .command(\"set-voting-period\")\n .description(\"Set the voting period (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New voting period in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting voting period...\").start();\n try {\n const hash = await setVotingPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Voting period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set voting period\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-execution-window ──\n\n governor\n .command(\"set-execution-window\")\n .description(\"Set the execution window (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New execution window in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting execution window...\").start();\n try {\n const hash = await setExecutionWindow(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Execution window change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set execution window\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-veto-threshold ──\n\n governor\n .command(\"set-veto-threshold\")\n .description(\"Set the veto threshold in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New veto threshold in bps (e.g. 4000 = 40%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting veto threshold...\").start();\n try {\n const hash = await setVetoThresholdBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Veto threshold change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set veto threshold\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-fee ──\n\n governor\n .command(\"set-max-fee\")\n .description(\"Set the max performance fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New max fee in bps (e.g. 3000 = 30%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max fee...\").start();\n try {\n const hash = await setMaxPerformanceFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Max performance fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max fee\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-duration ──\n\n governor\n .command(\"set-max-duration\")\n .description(\"Set the max strategy duration in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New max duration in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max duration...\").start();\n try {\n const hash = await setMaxStrategyDuration(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Max strategy duration change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max duration\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-cooldown ──\n\n governor\n .command(\"set-cooldown\")\n .description(\"Set the cooldown period in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New cooldown in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting cooldown...\").start();\n try {\n const hash = await setCooldownPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Cooldown period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set cooldown\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-protocol-fee ──\n\n governor\n .command(\"set-protocol-fee\")\n .description(\"Set the protocol fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New protocol fee in bps (e.g. 500 = 5%, max 1000 = 10%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting protocol fee...\").start();\n try {\n const hash = await setProtocolFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Protocol fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set protocol fee\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Guardian delegation commands — sherwood guardian <subcommand>\n *\n * V1.5: stake-pool delegation into GuardianRegistry, DPoS commission\n * configuration, and Merkl reward-claim navigation. Rewards claim itself\n * happens on merkl.xyz; this CLI prints a deep link + pending-reward\n * summary when the API key is configured.\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { Address } from \"viem\";\nimport { formatUnits, isAddress, parseUnits } from \"viem\";\nimport { getPublicClient, getWalletClient } from \"../lib/client.js\";\nimport { getNetwork } from \"../lib/network.js\";\nimport { SHERWOOD } from \"../lib/addresses.js\";\nimport { formatContractError } from \"../lib/errors.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst WARN = chalk.yellow;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\n// Minimal ABI fragments — only what this command set touches.\nconst GUARDIAN_REGISTRY_ABI = [\n // Guardian stake\n { type: \"function\", name: \"stakeAsGuardian\", inputs: [{ type: \"uint256\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"requestUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"cancelUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n // Delegation\n { type: \"function\", name: \"delegateStake\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"requestUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"cancelUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n // Commission\n { type: \"function\", name: \"setCommission\", inputs: [{ type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n // Views\n { type: \"function\", name: \"guardianStake\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"isActiveGuardian\", inputs: [{ type: \"address\" }], outputs: [{ type: \"bool\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"commissionOf\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"delegationOf\", inputs: [{ type: \"address\" }, { type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"delegatedInbound\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n // Guardian-fee claim (vault asset)\n { type: \"function\", name: \"claimProposalReward\", inputs: [{ type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimDelegatorProposalReward\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n] as const;\n\nconst ERC20_ABI = [\n { type: \"function\", name: \"approve\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [{ type: \"bool\" }], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"balanceOf\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"decimals\", inputs: [], outputs: [{ type: \"uint8\" }], stateMutability: \"view\" },\n] as const;\n\nfunction requireAddress(name: string, addr: Address): Address {\n if (addr === \"0x0000000000000000000000000000000000000000\") {\n console.error(chalk.red(`${name} is not deployed on ${getNetwork()}. Update cli/src/lib/addresses.ts after deploy.`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction registry(): Address {\n return requireAddress(\"GUARDIAN_REGISTRY\", SHERWOOD().GUARDIAN_REGISTRY);\n}\n\nfunction wood(): Address {\n return requireAddress(\"WOOD_TOKEN\", SHERWOOD().WOOD_TOKEN);\n}\n\nasync function ensureWoodAllowance(amount: bigint): Promise<void> {\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const addr = wallet.account!.address;\n const current = (await pc.readContract({\n address: wood(),\n abi: [{ type: \"function\", name: \"allowance\", inputs: [{ type: \"address\" }, { type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" }] as const,\n functionName: \"allowance\",\n args: [addr, registry()],\n })) as bigint;\n if (current >= amount) return;\n const spinner = ora(\"Approving WOOD...\").start();\n try {\n const hash = await wallet.writeContract({\n address: wood(), abi: ERC20_ABI, functionName: \"approve\", args: [registry(), 2n ** 256n - 1n], chain: null, account: wallet.account!,\n });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(\"WOOD approval granted\");\n } catch (err) {\n spinner.fail(\"WOOD approval failed\");\n throw err;\n }\n}\n\nexport function registerGuardianCommands(program: Command): void {\n const guardian = program.command(\"guardian\").description(\"Guardian staking, delegation, and rewards (V1.5)\");\n\n // ── status ──\n\n guardian\n .command(\"status [address]\")\n .description(\"Show guardian stake + commission + active status for an address (default: caller)\")\n .action(async (addressArg?: string) => {\n const pc = getPublicClient();\n let target: Address;\n if (addressArg) {\n if (!isAddress(addressArg)) {\n console.error(chalk.red(\"Invalid address\"));\n process.exit(1);\n }\n target = addressArg;\n } else {\n const wallet = getWalletClient();\n target = wallet.account!.address;\n }\n\n const spinner = ora(\"Loading...\").start();\n try {\n const [stake, active, commission] = await Promise.all([\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"guardianStake\", args: [target] }) as Promise<bigint>,\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"isActiveGuardian\", args: [target] }) as Promise<boolean>,\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"commissionOf\", args: [target] }) as Promise<bigint>,\n ]);\n const delegatedIn = (await pc.readContract({\n address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"delegatedInbound\", args: [target],\n })) as bigint;\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Guardian Status\"));\n SEP();\n console.log(W(` Address: ${G(target)}`));\n console.log(W(` Active guardian: ${active ? G(\"yes\") : DIM(\"no\")}`));\n console.log(W(` Own stake: ${BOLD(formatUnits(stake, 18))} WOOD`));\n console.log(W(` Delegated inbound: ${BOLD(formatUnits(delegatedIn, 18))} WOOD`));\n console.log(W(` Commission: ${BOLD(`${Number(commission) / 100}%`)}`));\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── stake ──\n\n guardian\n .command(\"stake <amount>\")\n .description(\"Stake as a guardian. Amount in WOOD (min = registry.minGuardianStake).\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent ID to associate (first-stake only)\", \"0\")\n .action(async (amountStr: string, opts: { agentId: string }) => {\n const amount = parseUnits(amountStr, 18);\n const agentId = BigInt(opts.agentId);\n await ensureWoodAllowance(amount);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Staking ${amountStr} WOOD...`).start();\n try {\n const hash = await wallet.writeContract({\n address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"stakeAsGuardian\", args: [amount, agentId], chain: null, account: wallet.account!,\n });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Staked. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Stake failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── unstake (request / cancel / claim) ──\n\n guardian\n .command(\"unstake <action>\")\n .description(\"Unstake flow: 'request' | 'cancel' | 'claim' (7d cooldown)\")\n .action(async (action: string) => {\n const fn = { request: \"requestUnstakeGuardian\", cancel: \"cancelUnstakeGuardian\", claim: \"claimUnstakeGuardian\" }[action];\n if (!fn) {\n console.error(chalk.red(`Unknown action '${action}'. Use request | cancel | claim.`));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`${action}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: fn as any, args: [], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`${action} confirmed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(`${action} failed`);\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── delegate ──\n\n guardian\n .command(\"delegate <delegate> <amount>\")\n .description(\"Delegate WOOD stake to a guardian. Amount in WOOD.\")\n .action(async (delegate: string, amountStr: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const amount = parseUnits(amountStr, 18);\n await ensureWoodAllowance(amount);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Delegating ${amountStr} WOOD to ${delegate}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"delegateStake\", args: [delegate, amount], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Delegated. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Delegation failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n guardian\n .command(\"undelegate <delegate> <action>\")\n .description(\"Unstake-delegation flow: 'request' | 'cancel' | 'claim'\")\n .action(async (delegate: string, action: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const fn = { request: \"requestUnstakeDelegation\", cancel: \"cancelUnstakeDelegation\", claim: \"claimUnstakeDelegation\" }[action];\n if (!fn) {\n console.error(chalk.red(`Unknown action '${action}'. Use request | cancel | claim.`));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`${action}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: fn as any, args: [delegate], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`${action} confirmed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(`${action} failed`);\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── commission ──\n\n guardian\n .command(\"set-commission <bps>\")\n .description(\"Set your commission rate in bps (0-5000 = 0-50%). Raises capped cumulatively at 500 bps/epoch.\")\n .action(async (bpsStr: string) => {\n const bps = BigInt(bpsStr);\n if (bps > 5000n) {\n console.error(chalk.red(\"Commission cannot exceed 5000 bps (50%)\"));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Setting commission to ${Number(bps) / 100}%...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"setCommission\", args: [bps], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Commission set. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"setCommission failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── reward claims ──\n\n guardian\n .command(\"claim-proposal <proposalId>\")\n .description(\"Claim guardian-fee commission for a settled proposal you voted Approve on (vault asset).\")\n .action(async (pidStr: string) => {\n const pid = BigInt(pidStr);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(\"Claiming...\").start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"claimProposalReward\", args: [pid], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Claimed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Claim failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n guardian\n .command(\"claim-delegator <delegate> <proposalId>\")\n .description(\"Claim your delegator share of a delegate's guardian-fee pool for a specific proposal.\")\n .action(async (delegate: string, pidStr: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const pid = BigInt(pidStr);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(\"Claiming delegator share...\").start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"claimDelegatorProposalReward\", args: [delegate, pid], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Claimed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Claim failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── WOOD epoch rewards — Merkl ──\n\n guardian\n .command(\"claim-wood\")\n .description(\"Open merkl.xyz to claim WOOD epoch block-rewards (off-chain distribution).\")\n .action(async () => {\n const wallet = getWalletClient();\n const addr = wallet.account!.address;\n const url = `https://merkl.angle.money/user/${addr}`;\n console.log();\n console.log(LABEL(\" ◆ Merkl Reward Claim\"));\n SEP();\n console.log(W(\" WOOD epoch block-rewards are distributed off-chain via Merkl.\"));\n console.log(W(\" Open this URL in your browser to view + claim pending rewards:\"));\n console.log();\n console.log(G(` ${url}`));\n console.log();\n console.log(WARN(\" Note: guardian-fee rewards (vault assets) are claimed on-chain\"));\n console.log(WARN(\" via `sherwood guardian claim-proposal <pid>`.\"));\n SEP();\n console.log();\n });\n}\n"],"mappings":"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","names":["parseUnits","formatUnits","isAddress","chalk","ora","encodeAbiParameters","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","maxUint256","buildInitData","encodeAbiParameters","buildExecuteCalls","maxUint256","encodeFunctionData","buildSettleCalls","concat","encodeAbiParameters","encoded","buildInitData","buildExecuteCalls","buildSettleCalls","strategy","propose","parseDuration","getActiveSyndicates","data","formatUnits","isAddress","parseUnits","chalk","ora","program","ora","chalk","formatUnits","getEasScanUrl","parseUnits","isAddress","getChainContracts","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","parseUnits","parseUnits","encodeFunctionData","program","isAddress","chalk","ora","parseUnits","formatUnits","chalk","ora","program","chalk","ora","registry","isAddress","encodeFunctionData","chalk","ora","readFileSync","encodeFunctionData","chalk","chalk","input","encodeFunctionData","getAccount","G","chalk","W","DIM","BOLD","LABEL","SEP","readFileSync","program","isAddress","spinner","ora","encodeFunctionData","resolve","chalk","ora","G","chalk","W","DIM","BOLD","LABEL","SEP","program","ora","chalk","ora","formatUnits","isAddress","parseUnits","G","chalk","W","DIM","BOLD","LABEL","SEP","ERC20_ABI","ora","program","isAddress","formatUnits","parseUnits","require","G","chalk","W","DIM","BOLD","LABEL","SEP","isAddress","spinner","ora","chainId","refParam","getActiveSyndicates","AGENT_REGISTRY","registry","syndicate","parseUnits","formatUnits"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/providers/moonwell.ts","../src/commands/strategy-template.ts","../src/lib/clone.ts","../src/lib/batch.ts","../src/strategies/moonwell-supply-template.ts","../src/strategies/venice-inference-template.ts","../src/strategies/aerodrome-lp-template.ts","../src/strategies/wsteth-moonwell-template.ts","../src/strategies/mamo-yield-template.ts","../src/strategies/portfolio-template.ts","../src/strategies/hyperliquid-perp-template.ts","../src/lib/subgraph.ts","../src/commands/venice.ts","../src/commands/allowance.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/commands/proposal.ts","../src/lib/format.ts","../src/lib/simulate.ts","../src/commands/governor.ts","../src/commands/guardian-delegate.ts"],"sourcesContent":["#!/usr/bin/env node\n// Load .env if present (dev convenience — production uses ~/.sherwood/config.json)\nimport { config as loadDotenv } from \"dotenv\";\ntry { loadDotenv(); } catch {};\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require(\"../package.json\");\nimport { Command, Option } from \"commander\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork, getNetwork, VALID_NETWORKS, withNetwork } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } from \"./lib/network.js\";\nimport type { Network } from \"./lib/network.js\";\nimport { TOKENS } from \"./lib/addresses.js\";\nimport { getPublicClient, getAccount, formatContractError } from \"./lib/client.js\";\nimport { ERC20_ABI } from \"./lib/abis.js\";\nimport { MoonwellProvider } from \"./providers/moonwell.js\";\nimport { UniswapProvider } from \"./providers/uniswap.js\";\nimport { registerStrategyTemplateCommands } from \"./commands/strategy-template.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\n// registryLib removed — strategy registry is deprecated, replaced by template commands\nimport { uploadMetadata } from \"./lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"./lib/ipfs.js\";\nimport { registerVeniceCommands } from \"./commands/venice.js\";\nimport { registerAllowanceCommands } from \"./commands/allowance.js\";\nimport { registerIdentityCommands } from \"./commands/identity.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { registerGovernorCommands } from \"./commands/governor.js\";\nimport { registerGuardianCommands } from \"./commands/guardian-delegate.js\";\nimport { setTextRecord, getTextRecord, resolveVaultSyndicate, resolveSyndicate, searchSyndicateAcrossChains } from \"./lib/ens.js\";\nimport * as easLib from \"./lib/eas.js\";\nimport { EAS_SCHEMAS } from \"./lib/addresses.js\";\n\n// XMTP shells out to @xmtp/cli binary — lazy-load to avoid breaking\n// non-chat commands if the CLI is not installed.\nasync function loadXmtp() {\n return import(\"./lib/xmtp.js\");\n}\n// Lazy-load cron module (only needed for openclaw agents)\nasync function loadCron() {\n return import(\"./lib/cron.js\");\n}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId, setConfigRpcUrl, getNotifyTo, setNotifyTo, setUniswapApiKey, getUniswapApiKey, setVeniceApiKey, getVeniceApiKey, addSyndicate, getSyndicates, setPrimarySyndicate, getPrimarySyndicate } from \"./lib/config.js\";\nimport { isTestnet } from \"./lib/network.js\";\n\n// ── Theme ──\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction validateAddress(value: string, name: string): Address {\n if (!isAddress(value)) {\n console.error(chalk.red(`Invalid ${name} address: ${value}`));\n process.exit(1);\n }\n return value as Address;\n}\n\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(validateAddress(opts.vault, \"vault\"));\n }\n // If no --vault flag, getVaultAddress() in vault.ts reads from config\n}\n\nconst program = new Command();\n\nprogram\n .name(\"sherwood\")\n .description(\"CLI for agent-managed investment syndicates\")\n .version(CLI_VERSION)\n .addOption(\n new Option(\"--chain <network>\", \"Target network\")\n .choices(VALID_NETWORKS)\n .default(\"base\"),\n )\n .option(\"--testnet\", \"Alias for --chain base-sepolia (deprecated)\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n let network: string = opts.chain;\n if (opts.testnet) {\n process.env.ENABLE_TESTNET = \"true\";\n if (network !== \"base\") {\n console.warn(\n chalk.yellow(\"[warn] --testnet ignored, --chain takes precedence\"),\n );\n } else {\n network = \"base-sepolia\";\n }\n }\n setNetwork(network as Network);\n if (getNetwork() !== \"base\") {\n console.log(chalk.yellow(`[${getNetwork()}]`));\n }\n });\n\n// ── Syndicate commands ──\nconst syndicate = program.command(\"syndicate\");\n\nsyndicate\n .command(\"create\")\n .description(\"Create a new syndicate via the factory (interactive)\")\n .option(\"--subdomain <name>\", \"ENS subdomain (skip prompt)\")\n .option(\"--name <name>\", \"Syndicate name (skip prompt)\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent identity token ID (skip prompt)\")\n .option(\"--asset <symbol-or-address>\", \"Vault asset: USDC, WETH, or a token address\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--metadata-uri <uri>\", \"Override metadata URI (skip IPFS upload)\")\n .option(\"--open-deposits\", \"Allow anyone to deposit (no whitelist)\")\n .option(\"--public-chat\", \"Enable dashboard spectator mode\", false)\n .option(\"-y, --yes\", \"Skip confirmation prompt (non-interactive mode)\", false)\n .action(async (opts) => {\n try {\n // ── Header ──\n console.log();\n console.log(LABEL(\" ◆ Create Syndicate\"));\n SEP();\n\n const wallet = getAccount();\n console.log(DIM(` Wallet: ${wallet.address}`));\n console.log(DIM(` Network: ${getChain().name}`));\n SEP();\n\n // ── Gather inputs (prompt if not provided via flags) ──\n\n const savedAgentId = getAgentId();\n\n const nonInteractive = opts.yes;\n\n const name = opts.name || (nonInteractive\n ? (() => { throw new Error(\"--name is required in non-interactive mode (-y)\"); })()\n : await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n }));\n\n const subdomain = opts.subdomain || (nonInteractive\n ? name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\")\n : await input({\n message: G(\"ENS subdomain\"),\n default: name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\"),\n validate: (v: string) => v.length >= 3 || \"Must be at least 3 characters\",\n }));\n\n const description = opts.description || (nonInteractive\n ? `${name} — a Sherwood syndicate`\n : await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n }));\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? (nonInteractive\n ? String(savedAgentId)\n : await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) }))\n : (nonInteractive\n ? \"0\"\n : await input({ message: G(\"Agent ID (ERC-8004)\"), validate: (v: string) => /^\\d+$/.test(v) || \"Must be a number\" }))\n );\n\n const openDeposits = opts.openDeposits !== undefined ? opts.openDeposits : (nonInteractive\n ? true\n : await confirm({\n message: G(\"Open deposits? (anyone can deposit)\"),\n default: true,\n }));\n\n // ── Resolve asset ──\n // Supported symbols (testnet + mainnet). Will expand on mainnet launch.\n const ASSET_SYMBOLS: Record<string, Address> = {\n USDC: TOKENS().USDC,\n WETH: TOKENS().WETH,\n };\n\n let asset: Address;\n if (opts.asset) {\n const upper = opts.asset.toUpperCase();\n if (ASSET_SYMBOLS[upper]) {\n asset = ASSET_SYMBOLS[upper];\n } else if (opts.asset.startsWith(\"0x\") && opts.asset.length === 42) {\n asset = opts.asset as Address;\n } else {\n const supported = Object.keys(ASSET_SYMBOLS).join(\", \");\n console.error(chalk.red(` Unknown asset \"${opts.asset}\". Use a symbol (${supported}) or a 0x address.`));\n process.exit(1);\n }\n } else if (nonInteractive) {\n // Default to WETH on chains without USDC, otherwise USDC\n asset = TOKENS().USDC !== \"0x0000000000000000000000000000000000000000\"\n ? ASSET_SYMBOLS.USDC\n : ASSET_SYMBOLS.WETH;\n } else {\n // Interactive prompt\n const assetChoice = await select({\n message: G(\"Vault asset (what token do depositors provide?)\"),\n choices: [\n { name: \"USDC\", value: \"USDC\", description: \"USD Coin (6 decimals)\" },\n { name: \"WETH\", value: \"WETH\", description: \"Wrapped Ether (18 decimals)\" },\n ],\n });\n asset = ASSET_SYMBOLS[assetChoice];\n }\n\n const publicClient = getPublicClient();\n const [decimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n ]);\n const symbol = `sw${assetSymbol}`;\n\n // ── Confirmation ──\n console.log();\n console.log(LABEL(\" ◆ Review\"));\n SEP();\n console.log(W(` Name: ${BOLD(name)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Description: ${DIM(description)}`));\n console.log(W(` Agent ID: #${agentIdStr}`));\n console.log(W(` Asset: ${assetSymbol} (${asset.slice(0, 10)}...)`));\n console.log(W(` Share token: ${symbol}`));\n console.log(W(` Open deposits: ${openDeposits ? G(\"yes\") : chalk.red(\"no (whitelist)\")}`));\n SEP();\n\n if (!nonInteractive) {\n const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\n }\n }\n\n // ── Upload metadata to IPFS ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {\n feeModel: \"none\",\n },\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(`IPFS upload failed — using inline metadata`));\n const json = JSON.stringify({ name, description, subdomain, asset: assetSymbol, openDeposits, createdBy: \"@sherwoodagent/cli\" });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Idempotent check: resume if subdomain already exists ──\n const existingId = await factoryLib.subdomainExists(subdomain);\n if (existingId !== null) {\n const existingInfo = await factoryLib.getSyndicate(existingId);\n const callerAddress = getAccount().address.toLowerCase();\n\n if (existingInfo.creator.toLowerCase() !== callerAddress) {\n console.error(chalk.red(`\\n ✖ Subdomain '${subdomain}' is already taken by another syndicate.\\n`));\n process.exit(1);\n }\n\n // Partial completion — creator already deployed, resume post-deploy steps\n console.log(chalk.yellow(`\\n ⚠ Syndicate '${subdomain}' already exists — resuming setup...\\n`));\n\n const spinner = ora({ text: W(\"Resuming setup...\"), color: \"green\" }).start();\n\n // Save to config\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", existingInfo.vault);\n addSyndicate(chainId, { subdomain, vault: existingInfo.vault, role: \"creator\" });\n setPrimarySyndicate(chainId, subdomain);\n\n // Register creator as agent (if not already)\n spinner.text = W(\"Checking agent registration...\");\n try {\n vaultLib.setVaultAddress(existingInfo.vault);\n const isAlreadyAgent = await vaultLib.isAgent(getAccount().address);\n if (!isAlreadyAgent) {\n spinner.text = W(\"Registering creator as agent...\");\n await vaultLib.registerAgent(BigInt(agentIdStr), getAccount().address);\n }\n } catch { /* non-fatal */ }\n\n // Create XMTP group (if not already)\n spinner.text = W(\"Checking chat group...\");\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n try {\n await xmtp.getGroup(xmtpClient, subdomain);\n // Group exists, skip\n } catch {\n // No group — create one\n spinner.text = W(\"Creating chat group...\");\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, existingInfo.vault as Address);\n cacheGroupId(subdomain, groupId);\n }\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not set up XMTP chat group\"));\n }\n\n // Register crons\n try {\n const cron = await loadCron();\n cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n } catch { /* non-fatal */ }\n\n spinner.stop();\n console.log();\n console.log(LABEL(\" ◆ Syndicate Setup Resumed\"));\n SEP();\n console.log(W(` ID: ${G(`#${existingId}`)}`));\n console.log(W(` Vault: ${G(existingInfo.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n const refParam = getAgentId() ? `?ref=${getAgentId()}` : \"\";\n console.log(W(` Share: ${G(`https://sherwood.sh/syndicate/${subdomain}${refParam}`)}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log();\n return;\n }\n\n // ── Deploy (fresh syndicate) ──\n const spinner = ora({ text: W(\"Deploying vault via factory...\"), color: \"green\" }).start();\n\n const result = await factoryLib.createSyndicate({\n creatorAgentId: BigInt(agentIdStr),\n metadataURI,\n asset,\n name,\n symbol,\n openDeposits,\n subdomain,\n });\n\n // Auto-save vault address + syndicate membership to config\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", result.vault);\n addSyndicate(chainId, { subdomain, vault: result.vault, role: \"creator\" });\n setPrimarySyndicate(chainId, subdomain);\n\n // ── Register creator as agent on the vault ──\n // Brief delay to let the RPC node sync its nonce after createSyndicate tx\n await new Promise((r) => setTimeout(r, 2000));\n spinner.text = W(\"Registering creator as agent...\");\n try {\n vaultLib.setVaultAddress(result.vault);\n const creatorAddress = getAccount().address;\n await vaultLib.registerAgent(\n BigInt(agentIdStr),\n creatorAddress, // agentAddress = creator EOA (direct execution)\n );\n } catch (regErr) {\n // Non-fatal — creator can register later via `syndicate add`\n console.warn(chalk.yellow(\"\\n ⚠ Could not auto-register creator as agent — register manually with `syndicate add`\"));\n }\n\n spinner.text = W(\"Setting up chat...\");\n\n // Create XMTP group for syndicate chat\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n cacheGroupId(subdomain, groupId);\n try {\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, result.vault as Address);\n } catch { /* ENS not available on all chains */ }\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not create XMTP chat group\"));\n console.warn(chalk.dim(` Recover later with: sherwood chat ${subdomain} init`));\n }\n\n // ── Auto-register participation crons ──\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (15m check + hourly summary)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n spinner.stop();\n\n // ── Success ──\n console.log();\n console.log(LABEL(\" ◆ Syndicate Created\"));\n SEP();\n console.log(W(` ID: ${G(`#${result.syndicateId}`)}`));\n console.log(W(` Vault: ${G(result.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(result.hash))}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n const refParam = getAgentId() ? `?ref=${getAgentId()}` : \"\";\n console.log(W(` Share: ${G(`https://sherwood.sh/syndicate/${subdomain}${refParam}`)}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"list\")\n .description(\"List active syndicates (queries subgraph, falls back to on-chain)\")\n .option(\"--creator <address>\", \"Filter by creator address\")\n .option(\"--all-chains\", \"Aggregate active syndicates across all supported chains (on-chain only)\")\n .action(async (opts) => {\n const spinner = ora(\"Loading syndicates...\").start();\n try {\n // Each row carries an optional `chain` so the --all-chains output can\n // tell users which network a syndicate lives on.\n type Row = {\n id: string | bigint;\n vault: string;\n creator: string;\n metadataURI: string;\n createdAt: string | bigint;\n totalDeposits?: string;\n totalWithdrawals?: string;\n subdomain?: string;\n chain?: Network;\n };\n let syndicates: Row[] = [];\n\n if (opts.allChains) {\n // Subgraph is single-chain; on-chain only when iterating networks.\n const includeTestnets = process.env.ENABLE_TESTNET === \"true\";\n const targets = VALID_NETWORKS.filter((n) => includeTestnets || ![\"base-sepolia\", \"robinhood-testnet\", \"hyperevm-testnet\"].includes(n));\n for (const net of targets) {\n spinner.text = `Loading from ${net}...`;\n try {\n const rows = await withNetwork(net, () => factoryLib.getActiveSyndicates());\n for (const s of rows) {\n syndicates.push({\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n subdomain: s.subdomain,\n chain: net,\n });\n }\n } catch {\n // Skip flaky chain RPCs rather than failing the whole listing.\n }\n }\n if (opts.creator) {\n const c = String(opts.creator).toLowerCase();\n syndicates = syndicates.filter((s) => s.creator.toLowerCase() === c);\n }\n } else if (process.env.SUBGRAPH_URL) {\n const result = await subgraphLib.getActiveSyndicates(opts.creator);\n syndicates = result;\n } else {\n const result = await factoryLib.getActiveSyndicates();\n syndicates = result.map((s) => ({\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n subdomain: s.subdomain,\n }));\n }\n\n spinner.stop();\n\n if (syndicates.length === 0) {\n console.log(chalk.dim(\"No active syndicates found.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Active Syndicates (${syndicates.length})`));\n if (!process.env.SUBGRAPH_URL && !opts.allChains) {\n console.log(chalk.dim(\" (Set SUBGRAPH_URL for faster indexed queries)\"));\n }\n if (opts.allChains) {\n console.log(chalk.dim(\" (Aggregated across chains via on-chain factory calls; SUBGRAPH_URL is single-chain only)\"));\n }\n console.log(chalk.dim(\"─\".repeat(70)));\n\n for (const s of syndicates) {\n const ts = typeof s.createdAt === \"string\" ? Number(s.createdAt) : Number(s.createdAt);\n const date = new Date(ts * 1000).toLocaleDateString();\n const ensName = s.subdomain ? `${s.subdomain}.sherwoodagent.eth` : \"\";\n const chainTag = s.chain ? chalk.dim(`[${s.chain}] `) : \"\";\n console.log(` ${chainTag}#${s.id} ${chalk.bold(ensName || String(s.vault))}`);\n if (ensName) console.log(` Vault: ${chalk.cyan(String(s.vault))}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Created: ${date}`);\n if (s.totalDeposits) {\n console.log(` Deposits: ${s.totalDeposits} USDC`);\n }\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n }\n } catch (err) {\n spinner.fail(\"Failed to load syndicates\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"info\")\n .description(\"Display syndicate details by ID or subdomain\")\n .argument(\"<id>\", \"Syndicate ID or subdomain name\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading syndicate info...\").start();\n try {\n let id: bigint;\n let crossChainHint: { network: Network; others: Network[] } | null = null;\n let infoOverride: factoryLib.SyndicateInfo | null = null;\n\n if (/^\\d+$/.test(idStr)) {\n id = BigInt(idStr);\n } else {\n // Try active chain first; on miss, scan all enabled chains so users\n // who default to base can still inspect a HyperEVM syndicate.\n try {\n const resolved = await resolveSyndicate(idStr);\n id = resolved.id;\n } catch {\n spinner.text = `Searching across chains...`;\n const hits = await searchSyndicateAcrossChains(idStr);\n if (hits.length === 0) {\n spinner.fail(`Syndicate \"${idStr}\" not found on any supported chain`);\n process.exit(1);\n }\n // Prefer active chain hit, else first hit.\n const active = getNetwork();\n const primary = hits.find((h) => h.network === active) ?? hits[0];\n id = primary.result.id;\n // Read the syndicate from the chain it actually lives on (NOT the\n // active chain) so vault stats etc. don't blow up trying to read a\n // non-existent vault on the active chain.\n infoOverride = await withNetwork(primary.network, () =>\n factoryLib.getSyndicate(primary.result.id),\n );\n crossChainHint = {\n network: primary.network,\n others: hits.filter((h) => h.network !== primary.network).map((h) => h.network),\n };\n }\n }\n const info = infoOverride ?? (await factoryLib.getSyndicate(id));\n spinner.stop();\n if (crossChainHint) {\n const others = crossChainHint.others.length > 0\n ? ` (also on: ${crossChainHint.others.join(\", \")})`\n : \"\";\n console.log(chalk.yellow(` Found on chain: ${chalk.bold(crossChainHint.network)}${others}`));\n console.log(chalk.dim(` Re-run with --chain ${crossChainHint.network} to interact with this syndicate.`));\n console.log();\n }\n\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n console.log(chalk.red(`Syndicate #${id} not found.`));\n process.exit(1);\n }\n\n const date = new Date(Number(info.createdAt) * 1000).toLocaleDateString();\n console.log();\n console.log(chalk.bold(`Syndicate #${info.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n if (info.subdomain) {\n console.log(` ENS: ${chalk.bold(`${info.subdomain}.sherwoodagent.eth`)}`);\n }\n console.log(` Vault: ${chalk.cyan(info.vault)}`);\n console.log(` Creator: ${info.creator}`);\n console.log(` Created: ${date}`);\n console.log(` Active: ${info.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n if (info.metadataURI) {\n console.log(` Metadata: ${chalk.dim(info.metadataURI)}`);\n }\n\n // Show XMTP group ID if cached\n if (info.subdomain) {\n const xmtpGroupId = getCachedGroupId(info.subdomain);\n if (xmtpGroupId) {\n console.log(` XMTP Group: ${chalk.cyan(xmtpGroupId)}`);\n }\n }\n\n // Also show vault info — when the syndicate lives on a different\n // chain than the active one, read the vault on its actual chain.\n vaultLib.setVaultAddress(info.vault);\n const vaultInfo = crossChainHint\n ? await withNetwork(crossChainHint.network, () => vaultLib.getVaultInfo())\n : await vaultLib.getVaultInfo();\n console.log();\n console.log(chalk.bold(\" Vault Stats\"));\n console.log(` Total Assets: ${vaultInfo.totalAssets}`);\n console.log(` Agent Count: ${vaultInfo.agentCount}`);\n console.log(` Redemptions Locked: ${vaultInfo.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(vaultInfo.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load syndicate info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"update-metadata\")\n .description(\"Update syndicate metadata (creator only)\")\n .requiredOption(\"--id <id>\", \"Syndicate ID\")\n .option(\"--name <name>\", \"Syndicate name\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--uri <uri>\", \"Direct metadata URI (skips IPFS upload)\")\n .action(async (opts) => {\n const spinner = ora({ text: W(\"Loading syndicate...\"), color: \"green\" }).start();\n try {\n const syndicateId = BigInt(opts.id);\n let metadataURI = opts.uri;\n\n if (!metadataURI) {\n const info = await factoryLib.getSyndicate(syndicateId);\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n spinner.fail(`Syndicate #${opts.id} not found.`);\n process.exit(1);\n }\n\n const name = opts.name || info.subdomain;\n const description = opts.description || `${name} — a Sherwood syndicate on ${info.subdomain}.sherwoodagent.eth`;\n\n spinner.text = W(\"Uploading metadata to IPFS...\");\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {},\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.text = W(\"Updating on-chain metadata...\");\n }\n\n const hash = await factoryLib.updateMetadata(syndicateId, metadataURI);\n spinner.succeed(G(`Metadata updated`));\n console.log(DIM(` IPFS: ${metadataURI}`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Metadata update failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve-depositor\")\n .description(\"Approve an address to deposit (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to approve\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Approving depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.approveDepositor(depositor);\n spinner.succeed(`Depositor approved: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"remove-depositor\")\n .description(\"Remove an address from the depositor whitelist (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to remove\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Removing depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.removeDepositor(depositor);\n spinner.succeed(`Depositor removed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Removal failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"add\")\n .description(\"Register an agent on a syndicate vault (creator only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID (resolved from wallet if omitted)\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault address from --vault flag or config\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n\n // Verify caller is the syndicate creator\n const { creator, subdomain } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can add agents\");\n process.exit(1);\n }\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Resolve agent ID: use --agent-id if provided, otherwise look up from wallet\n let agentId: bigint;\n if (opts.agentId) {\n agentId = BigInt(opts.agentId);\n } else {\n const { AGENT_REGISTRY } = await import(\"./lib/addresses.js\");\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n\n // Chains without ERC-8004 (e.g. HyperEVM) — contract skips identity check\n if (registry === \"0x0000000000000000000000000000000000000000\") {\n agentId = 0n;\n } else {\n spinner.text = \"Looking up ERC-8004 identity from wallet...\";\n const client = getPublicClient();\n\n const balance = await client.readContract({\n address: registry,\n abi: [{\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n }] as const,\n functionName: \"balanceOf\",\n args: [agentWallet],\n }) as bigint;\n\n if (balance === 0n) {\n spinner.fail(\"Agent wallet does not own an ERC-8004 identity NFT\");\n console.error(chalk.dim(\" Mint one first: sherwood identity mint --name <name>\"));\n process.exit(1);\n }\n\n const tokenId = await client.readContract({\n address: registry,\n abi: [{\n name: \"tokenOfOwnerByIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }, { name: \"index\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n }] as const,\n functionName: \"tokenOfOwnerByIndex\",\n args: [agentWallet, 0n],\n }) as bigint;\n\n agentId = tokenId;\n console.log(chalk.dim(` Resolved agent ID: #${agentId}`));\n }\n }\n\n spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(agentId, agentWallet);\n spinner.succeed(`Agent registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n\n // Auto-add agent to XMTP chat group\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(chalk.dim(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n } catch (err) {\n spinner.fail(\"Registration failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"share\")\n .description(\"Print the shareable dashboard URL for your syndicate\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (default: primary)\")\n .action(async (opts) => {\n try {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n console.error(chalk.red(\" No syndicate configured. Pass --subdomain <name> or run 'syndicate create/join' first.\"));\n process.exit(1);\n }\n\n // Verify syndicate exists on-chain\n const syndicateInfo = await resolveSyndicate(subdomain);\n\n const agentId = getAgentId();\n const refParam = agentId ? `?ref=${agentId}` : \"\";\n const dashboardUrl = `https://sherwood.sh/syndicate/${subdomain}${refParam}`;\n\n console.log();\n console.log(LABEL(\" ◆ Share Your Syndicate\"));\n SEP();\n console.log(W(` Dashboard: ${G(dashboardUrl)}`));\n console.log(W(` ENS: ${DIM(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Vault: ${DIM(syndicateInfo.vault)}`));\n console.log(W(` Join CLI: ${DIM(`sherwood syndicate join --subdomain ${subdomain}`)}`));\n SEP();\n\n // Try to copy to clipboard (optional — uses pbcopy/xclip if available)\n try {\n const { exec } = await import(\"node:child_process\");\n const platform = (await import(\"node:os\")).platform();\n const cmd = platform === \"darwin\" ? \"pbcopy\" : \"xclip -selection clipboard\";\n const proc = exec(cmd);\n proc.stdin?.write(dashboardUrl);\n proc.stdin?.end();\n console.log(G(\" ✓ Dashboard URL copied to clipboard\"));\n } catch {\n // clipboard not available — no problem\n }\n console.log();\n } catch (err) {\n console.error(chalk.red(` ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n// ── EAS Join Request / Approval Commands ──\n\nsyndicate\n .command(\"join\")\n .description(\"Request to join a syndicate (creates an EAS attestation)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain to join\")\n .option(\"--ref <agentId>\", \"Referrer agent ID (from invite link)\")\n .option(\"--message <text>\", \"Message to the creator\", \"Requesting to join your syndicate\")\n .action(async (opts) => {\n const spinner = ora(\"Resolving syndicate...\").start();\n try {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n spinner.fail(\"No syndicate configured. Pass --subdomain <name> or run 'syndicate create' first.\");\n process.exit(1);\n }\n\n const agentId = getAgentId();\n if (!agentId) {\n spinner.fail(\"No agent identity found. Run 'sherwood identity mint' first.\");\n process.exit(1);\n }\n\n let syndicate: Awaited<ReturnType<typeof resolveSyndicate>>;\n try {\n syndicate = await resolveSyndicate(subdomain);\n } catch {\n // Active chain doesn't have it — see if it lives elsewhere.\n spinner.text = \"Searching across chains...\";\n const hits = await searchSyndicateAcrossChains(subdomain);\n spinner.fail(`Syndicate \"${subdomain}\" not found on ${getNetwork()}`);\n if (hits.length === 0) {\n console.error(chalk.red(` Not found on any supported chain.`));\n } else if (hits.length === 1) {\n console.error(chalk.yellow(` Found on chain: ${chalk.bold(hits[0].network)}`));\n console.error(chalk.dim(` Re-run: sherwood --chain ${hits[0].network} syndicate join --subdomain ${subdomain}`));\n } else {\n const chains = hits.map((h) => h.network).join(\", \");\n console.error(chalk.yellow(` Found on chains: ${chalk.bold(chains)}`));\n console.error(chalk.dim(` Specify which chain to join with --chain <network>.`));\n }\n process.exit(1);\n }\n const callerAddress = getAccount().address;\n\n // Check if already registered as an agent on this vault\n spinner.text = \"Checking membership...\";\n vaultLib.setVaultAddress(syndicate.vault);\n const alreadyAgent = await vaultLib.isAgent(callerAddress);\n if (alreadyAgent) {\n spinner.succeed(\"You are already a registered agent on this syndicate\");\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n // Auto-register participation crons (idempotent)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(chalk.green(\" ✓ Participation crons registered\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(chalk.dim(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n return;\n }\n\n // Check for existing pending join request\n spinner.text = \"Checking pending requests...\";\n const pendingRequests = await easLib.queryJoinRequests(syndicate.creator);\n const existingRequest = pendingRequests.find(\n (r) => r.attester.toLowerCase() === callerAddress.toLowerCase()\n && r.decoded.vault.toLowerCase() === syndicate.vault.toLowerCase(),\n );\n if (existingRequest) {\n spinner.succeed(\"You already have a pending join request for this syndicate\");\n console.log(chalk.dim(` Attestation: ${existingRequest.uid}`));\n console.log(chalk.dim(` Submitted: ${new Date(existingRequest.time * 1000).toLocaleString()}`));\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n return;\n }\n\n spinner.text = \"Creating join request attestation...\";\n const referrerAgentId = opts.ref ? parseInt(opts.ref, 10) : undefined;\n const { uid, hash } = await easLib.createJoinRequest(\n syndicate.id,\n BigInt(agentId),\n syndicate.vault,\n syndicate.creator,\n opts.message,\n referrerAgentId,\n );\n\n // Pre-register XMTP identity so the creator can add us to the group on approval\n try {\n spinner.text = \"Registering XMTP identity...\";\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n spinner.succeed(\"Join request created (XMTP identity ready)\");\n } catch {\n spinner.succeed(\"Join request created\");\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity — creator may not be able to auto-add you to chat\"));\n }\n\n // Save syndicate membership + set as primary\n addSyndicate(getChain().id, { subdomain, vault: syndicate.vault, role: \"agent\" });\n setPrimarySyndicate(getChain().id, subdomain);\n\n // Auto-register participation crons (will HEARTBEAT_OK until approved)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (will activate after approval)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n console.log();\n console.log(LABEL(\" ◆ Join Request Submitted\"));\n SEP();\n console.log(W(` Syndicate: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Agent ID: #${agentId}`));\n console.log(W(` Creator: ${DIM(syndicate.creator)}`));\n console.log(W(` Attestation: ${DIM(uid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(uid))}`));\n // EAS tx ran on Base (Base-Sepolia for testnet) regardless of --chain.\n console.log(W(` Explorer: ${DIM(easLib.getEasExplorerUrl(hash))}`));\n SEP();\n console.log(G(\" ✓ Syndicate saved to ~/.sherwood/config.json (set as primary)\"));\n console.log(G(\" ✓ The creator can review with:\"));\n console.log(DIM(` sherwood syndicate requests --subdomain ${subdomain}`));\n console.log();\n } catch (err) {\n spinner.fail(\"Join request failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"requests\")\n .description(\"View pending join requests for a syndicate (creator only)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n const spinner = ora(\"Loading join requests...\").start();\n try {\n let creatorAddress: Address;\n let subdomain: string;\n let syndicateVault: Address;\n\n // Resolve syndicate: --subdomain > primary syndicate > --vault > config vault\n const resolvedSubdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (resolvedSubdomain) {\n const syndicateInfo = await resolveSyndicate(resolvedSubdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = resolvedSubdomain;\n syndicateVault = syndicateInfo.vault as Address;\n } else {\n resolveVault(opts);\n syndicateVault = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(syndicateVault);\n creatorAddress = syndicateInfo.creator;\n subdomain = syndicateInfo.subdomain;\n }\n\n // Verify caller is creator\n const callerAddress = getAccount().address.toLowerCase();\n if (creatorAddress.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can view join requests\");\n process.exit(1);\n }\n\n spinner.text = \"Querying EAS attestations...\";\n const [allRequests, approvals] = await Promise.all([\n easLib.queryJoinRequests(creatorAddress),\n easLib.queryApprovals(creatorAddress),\n ]);\n\n // Filter out agents that have already been approved for the same vault\n const approvedKeys = new Set(\n approvals\n .filter((a) => a.decoded.vault.toLowerCase() === syndicateVault.toLowerCase())\n .map((a) => a.decoded.agentId.toString()),\n );\n const requests = allRequests.filter(\n (r) => !approvedKeys.has(r.decoded.agentId.toString())\n && r.decoded.vault.toLowerCase() === syndicateVault.toLowerCase(),\n );\n\n spinner.stop();\n\n if (requests.length === 0) {\n console.log(DIM(\"\\n No pending join requests.\\n\"));\n return;\n }\n\n console.log();\n console.log(LABEL(` ◆ Pending Join Requests (${requests.length})`));\n SEP();\n\n for (let i = 0; i < requests.length; i++) {\n const req = requests[i];\n const date = new Date(req.time * 1000).toLocaleString();\n const referrer = easLib.parseReferrer(req.decoded.message);\n const cleanMessage = easLib.stripReferrerPrefix(req.decoded.message);\n console.log(W(` ${i + 1}. Agent #${req.decoded.agentId} ${DIM(`(${req.attester})`)}`));\n console.log(DIM(` Message: \"${cleanMessage}\"`));\n if (referrer !== null) {\n console.log(G(` Referred by: Agent #${referrer}`));\n }\n console.log(DIM(` Requested: ${date}`));\n console.log(DIM(` Attestation: ${req.uid}`));\n console.log();\n }\n\n console.log(G(\" To approve:\"));\n console.log(DIM(` sherwood syndicate approve --agent-id <id> --wallet <addr>`));\n console.log(G(\" To reject:\"));\n console.log(DIM(` sherwood syndicate reject --attestation <uid>`));\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load requests\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve\")\n .description(\"Approve an agent join request (registers agent + creates EAS approval)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (alternative to --vault)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault: --subdomain > primary syndicate > --vault > config vault\n const approveSubdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (approveSubdomain && !opts.vault) {\n const syndicateInfo = await resolveSyndicate(approveSubdomain);\n vaultLib.setVaultAddress(syndicateInfo.vault);\n } else {\n resolveVault(opts);\n }\n const vaultAddress = vaultLib.getVaultAddress();\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Verify caller is creator\n const { creator, subdomain, id: syndicateId } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can approve agents\");\n process.exit(1);\n }\n\n // 1. Register agent on-chain (same as syndicate add)\n spinner.text = \"Registering agent on vault...\";\n let agentWasRegistered = false;\n try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n agentWasRegistered = true;\n console.log(DIM(` Agent registered: ${getExplorerUrl(regHash)}`));\n } catch (regErr) {\n const msg = regErr instanceof Error ? regErr.message : String(regErr);\n if (msg.includes(\"0xe098d3ee\") || msg.includes(\"AgentAlreadyRegistered\")) {\n console.log(DIM(\" Agent already registered on vault — skipping\"));\n } else {\n throw regErr;\n }\n }\n\n // Brief delay after on-chain registration to let the RPC node sync its nonce\n if (agentWasRegistered) {\n await new Promise((r) => setTimeout(r, 2000));\n }\n\n // 2. Create AGENT_APPROVED attestation (skip if one already exists)\n spinner.text = \"Checking for existing approval...\";\n const existingApprovals = await easLib.queryApprovals(getAccount().address);\n const alreadyApproved = existingApprovals.find(\n (a) => a.decoded.agentId === BigInt(opts.agentId) && a.decoded.vault.toLowerCase() === vaultAddress.toLowerCase(),\n );\n\n let approvalUid: `0x${string}`;\n if (alreadyApproved) {\n approvalUid = alreadyApproved.uid;\n console.log(DIM(` Approval attestation already exists — skipping`));\n } else {\n spinner.text = \"Creating approval attestation...\";\n const result = await easLib.createApproval(\n syndicateId,\n BigInt(opts.agentId),\n vaultAddress,\n agentWallet,\n );\n approvalUid = result.uid;\n }\n\n // 3. Auto-add agent to XMTP chat group\n try {\n spinner.text = \"Adding to chat...\";\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(DIM(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n\n spinner.succeed(\"Agent approved and registered\");\n console.log();\n console.log(LABEL(\" ◆ Agent Approved\"));\n SEP();\n console.log(W(` Agent ID: #${opts.agentId}`));\n console.log(W(` Wallet: ${G(opts.wallet)}`));\n console.log(W(` Approval: ${DIM(approvalUid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(approvalUid))}`));\n SEP();\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"reject\")\n .description(\"Reject a join request by revoking its attestation\")\n .requiredOption(\"--attestation <uid>\", \"Join request attestation UID to revoke\")\n .action(async (opts) => {\n const spinner = ora(\"Revoking attestation...\").start();\n try {\n // Revoke on Base / Base-Sepolia regardless of --chain — syndicate\n // join attestations always live on the EAS chain, not the syndicate's\n // chain.\n const hash = await easLib.revokeJoinRequest(opts.attestation as `0x${string}`);\n spinner.succeed(\"Join request rejected\");\n console.log(DIM(` ${easLib.getEasExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Rejection failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"leave\")\n .description(\"Leave a syndicate — removes participation crons and session state\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain to leave\")\n .action(async (opts) => {\n const subdomain = opts.subdomain || getPrimarySyndicate(getChain().id)?.subdomain;\n if (!subdomain) {\n console.error(chalk.red(\" No syndicate configured. Pass --subdomain <name>.\"));\n process.exit(1);\n }\n const spinner = ora(\"Cleaning up...\").start();\n try {\n // 1. Remove participation crons (if OpenClaw)\n let cronsRemoved = false;\n try {\n const cron = await loadCron();\n const result = cron.unregisterSyndicateCrons(subdomain, isTestnet());\n cronsRemoved = result.removed;\n } catch { /* non-fatal */ }\n\n // 2. Reset session state\n const { resetSession } = await import(\"./lib/session.js\");\n resetSession(subdomain);\n\n spinner.succeed(\"Left syndicate\");\n if (cronsRemoved) {\n console.log(G(\" ✓ Participation crons removed\"));\n }\n console.log(G(\" ✓ Session state cleared\"));\n console.log();\n console.log(chalk.dim(\" Note: This does not remove you on-chain. To exit your position:\"));\n console.log(chalk.dim(\" sherwood vault balance — check your LP share balance\"));\n console.log(chalk.dim(\" Redeem shares via the vault contract or dashboard\"));\n console.log();\n } catch (err) {\n spinner.fail(\"Leave failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"set-primary\")\n .description(\"Set the active syndicate for CLI commands (auto-used when --subdomain is omitted)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n try {\n const chainId = getChain().id;\n const memberships = getSyndicates(chainId);\n\n if (!opts.subdomain && !opts.vault) {\n // List syndicates and show which is primary\n const primary = getPrimarySyndicate(chainId);\n if (memberships.length === 0) {\n console.log(DIM(\"\\n No syndicates saved. Create or join one first.\\n\"));\n return;\n }\n console.log();\n console.log(LABEL(\" ◆ Your Syndicates\"));\n SEP();\n for (const m of memberships) {\n const isPrimary = primary?.subdomain === m.subdomain;\n const marker = isPrimary ? G(\" ★\") : \"\";\n console.log(W(` ${m.subdomain}.sherwoodagent.eth${marker} ${DIM(`(${m.role})`)}`));\n console.log(DIM(` vault: ${m.vault}`));\n }\n SEP();\n if (memberships.length > 1) {\n console.log(DIM(\" Switch with: sherwood syndicate set-primary --subdomain <name>\"));\n }\n console.log();\n return;\n }\n\n let target: string | undefined;\n\n if (opts.subdomain) {\n // Verify it's in our list\n const found = memberships.find((m) => m.subdomain === opts.subdomain);\n if (!found) {\n // Resolve on-chain to verify it exists, then add it\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n addSyndicate(chainId, { subdomain: opts.subdomain, vault: syndicateInfo.vault, role: \"agent\" });\n }\n target = opts.subdomain;\n } else if (opts.vault) {\n // Find by vault address\n const found = memberships.find(\n (m) => m.vault.toLowerCase() === opts.vault.toLowerCase(),\n );\n if (found) {\n target = found.subdomain;\n } else {\n // Resolve on-chain\n const syndicateInfo = await resolveVaultSyndicate(validateAddress(opts.vault, \"vault\"));\n addSyndicate(chainId, { subdomain: syndicateInfo.subdomain, vault: opts.vault, role: \"agent\" });\n target = syndicateInfo.subdomain;\n }\n }\n\n if (!target) {\n console.error(chalk.red(\" Could not resolve syndicate. Pass --subdomain or --vault.\"));\n process.exit(1);\n }\n\n setPrimarySyndicate(chainId, target);\n console.log(G(`\\n ✓ Primary syndicate set to ${target}.sherwoodagent.eth\\n`));\n } catch (err) {\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n// ── Vault commands ──\nconst vaultCmd = program.command(\"vault\");\n\nvaultCmd\n .command(\"deposit\")\n .description(\"Deposit into a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--amount <amount>\", \"Amount to deposit (in asset units)\")\n .option(\"--use-eth\", \"Auto-wrap ETH → WETH before depositing (for WETH vaults)\")\n .action(async (opts) => {\n resolveVault(opts);\n const decimals = await vaultLib.getAssetDecimals();\n const amount = parseUnits(opts.amount, decimals);\n\n // Pre-flight checks — catch issues before submitting transactions\n try {\n if (!opts.useEth) {\n await vaultLib.preflightDeposit(amount);\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n const spinner = ora(`Depositing ${opts.amount}...`).start();\n try {\n let hash;\n if (opts.useEth) {\n spinner.text = `Wrapping ETH + depositing ${opts.amount}...`;\n hash = await vaultLib.depositWithEthWrap(amount);\n } else {\n hash = await vaultLib.deposit(amount);\n }\n spinner.succeed(`Deposited: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Deposit failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"info\")\n .description(\"Display vault state\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading vault info...\").start();\n try {\n const info = await vaultLib.getVaultInfo();\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"Vault Info\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Address: ${info.address}`);\n console.log(` Total Assets: ${info.totalAssets}`);\n console.log(` Agent Count: ${info.agentCount}`);\n console.log(` Redemptions Locked: ${info.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(info.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load vault info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"balance\")\n .description(\"Show LP share balance and asset value\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--address <address>\", \"Address to check (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading balance...\").start();\n try {\n const balance = await vaultLib.getBalance(opts.address as Address | undefined);\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"LP Position\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Shares: ${balance.shares.toString()}`);\n console.log(` Asset Value: ${balance.assetsValue}`);\n console.log(` % of Vault: ${balance.percentOfVault}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"redeem\")\n .description(\"Redeem vault shares for the underlying asset (ERC-4626)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--shares <amount>\", \"Shares to redeem in whole-share units (default: all)\")\n .option(\"--receiver <address>\", \"Receiver of the underlying asset (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n\n // Vault shares use (assetDecimals + _decimalsOffset) where offset = assetDecimals.\n // For USDC (6) this is 12. Treat --shares as whole-share units and scale by decimals * 2.\n const assetDecimals = await vaultLib.getAssetDecimals();\n const shareDecimals = assetDecimals * 2;\n\n let shares: bigint;\n try {\n if (opts.shares) {\n shares = parseUnits(opts.shares, shareDecimals);\n } else {\n shares = await vaultLib.getShareBalance();\n if (shares === 0n) {\n console.error(chalk.red(\"\\n ✖ No shares to redeem.\\n\"));\n process.exit(1);\n }\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n if (opts.receiver && !isAddress(opts.receiver)) {\n console.error(chalk.red(`\\n ✖ Invalid receiver address: ${opts.receiver}\\n`));\n process.exit(1);\n }\n\n try {\n await vaultLib.preflightRedeem(shares);\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}\\n`));\n process.exit(1);\n }\n\n const sharesDisplay = formatUnits(shares, shareDecimals);\n const spinner = ora(`Redeeming ${sharesDisplay} shares...`).start();\n try {\n const { hash, assetsOut } = await vaultLib.redeem(\n shares,\n opts.receiver as Address | undefined,\n );\n spinner.succeed(`Redeemed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n console.log(` Assets received: ${formatUnits(assetsOut, assetDecimals)}`);\n } catch (err) {\n spinner.fail(\"Redeem failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n// ── Strategy commands ──\nconst strategy = program.command(\"strategy\").description(\"Strategy templates — list, clone, propose\");\nregisterStrategyTemplateCommands(strategy);\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(async () => {\n const { MessariProvider, NansenProvider } = await import(\"./providers/research/index.js\");\n const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];\n for (const p of providers) {\n const info = p.info();\n console.log(`\\n${info.name} (${info.type})`);\n console.log(` Capabilities: ${info.capabilities.join(\", \")}`);\n console.log(` Chains: ${info.supportedChains.map((c) => c.name).join(\", \")}`);\n }\n });\n\n// ── Chat commands (lazy-loaded — requires @xmtp/cli binary) ──\ntry {\n const { registerChatCommands } = await import(\"./commands/chat.js\");\n registerChatCommands(program);\n} catch {\n program\n .command(\"chat <name> [action] [actionArgs...]\")\n .description(\"Syndicate chat (XMTP) — requires @xmtp/cli\")\n .action(() => {\n console.error(chalk.red(\"XMTP CLI not available.\"));\n console.error(chalk.dim(\"Install with: npm install -g @xmtp/cli\"));\n console.error(chalk.dim(\"Or reinstall: npm i -g @sherwoodagent/cli\"));\n process.exit(1);\n });\n}\n\n// ── Session commands ──\nconst { registerSessionCommands } = await import(\"./commands/session.js\");\nregisterSessionCommands(program);\n\n// ── Venice commands ──\nregisterVeniceCommands(program);\n\n// ── Allowance commands ──\nregisterAllowanceCommands(program);\n\n// ── Identity commands ──\nregisterIdentityCommands(program);\n\n// ── Proposal commands ──\nregisterProposalCommands(program);\n\n// ── Governor commands ──\nregisterGovernorCommands(program);\n\n// ── Guardian delegation commands (V1.5) ──\nregisterGuardianCommands(program);\n\n// ── Research commands ──\nconst { registerResearchCommands } = await import(\"./commands/research.js\");\nregisterResearchCommands(program);\n\n// ── Agent commands ──\nconst { registerAgentCommands } = await import(\"./commands/agent.js\");\nregisterAgentCommands(program);\n\n// ── Trade commands ──\nconst { registerTradeCommands } = await import(\"./commands/trade.js\");\nregisterTradeCommands(program);\n\n// ── Config commands ──\nconst configCmd = program.command(\"config\");\n\nconfigCmd\n .command(\"set\")\n .description(\"Save settings to ~/.sherwood/config.json (persists across sessions)\")\n .option(\"--private-key <key>\", \"Wallet private key (0x-prefixed)\")\n .option(\"--vault <address>\", \"Default SyndicateVault address\")\n .option(\"--rpc <url>\", \"Custom RPC URL for the active --chain network\")\n .option(\"--notify-to <id>\", \"Destination for cron summaries (Telegram chat ID, phone, etc.)\")\n .option(\"--uniswap-api-key <key>\", \"Uniswap Trading API key (from developers.uniswap.org)\")\n .option(\"--venice-api-key <key>\", \"Venice AI inference API key\")\n .option(\"--xmtp-group <subdomain:groupId>\", \"Cache an XMTP group ID for a syndicate (e.g. my-fund:abc123)\")\n .action((opts) => {\n let saved = false;\n\n if (opts.privateKey) {\n setPrivateKey(opts.privateKey);\n const account = getAccount();\n console.log(chalk.green(\"Private key saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Wallet: ${account.address}`));\n saved = true;\n }\n\n if (opts.vault) {\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", opts.vault);\n console.log(chalk.green(`Vault saved to ~/.sherwood/config.json (chain ${chainId})`));\n console.log(chalk.dim(` Vault: ${opts.vault}`));\n saved = true;\n }\n\n if (opts.rpc) {\n const network = getNetwork();\n setConfigRpcUrl(network, opts.rpc);\n console.log(chalk.green(`RPC URL saved for ${network}`));\n console.log(chalk.dim(` RPC: ${opts.rpc}`));\n saved = true;\n }\n\n if (opts.notifyTo) {\n setNotifyTo(opts.notifyTo);\n console.log(chalk.green(\"Notify destination saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Notify to: ${opts.notifyTo}`));\n saved = true;\n }\n\n if (opts.uniswapApiKey) {\n setUniswapApiKey(opts.uniswapApiKey);\n console.log(chalk.green(\"Uniswap API key saved to ~/.sherwood/config.json\"));\n saved = true;\n }\n\n if (opts.veniceApiKey) {\n setVeniceApiKey(opts.veniceApiKey);\n console.log(chalk.green(\"Venice API key saved to ~/.sherwood/config.json\"));\n saved = true;\n }\n\n if (opts.xmtpGroup) {\n const parts = opts.xmtpGroup.split(\":\");\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n console.log(chalk.red(\"Format: --xmtp-group <subdomain>:<groupId>\"));\n process.exit(1);\n }\n cacheGroupId(parts[0], parts[1]);\n console.log(chalk.green(`XMTP group ID cached for ${parts[0]}`));\n console.log(chalk.dim(` Group ID: ${parts[1]}`));\n saved = true;\n }\n\n if (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault, --rpc, --notify-to, --uniswap-api-key, --venice-api-key, --xmtp-group\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const network = getNetwork();\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n const customRpc = config.rpc?.[network];\n\n console.log();\n console.log(chalk.bold(`Sherwood Config`));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(` Network: ${chalk.cyan(network)} (chain ${chainId})`);\n console.log(` RPC: ${customRpc ? chalk.green(customRpc) : chalk.dim(\"default\")}`);\n console.log(` Wallet: ${config.privateKey ? chalk.green(\"configured\") : chalk.dim(\"not set\")}`);\n console.log(` Agent ID: ${config.agentId ?? chalk.dim(\"not set\")}`);\n console.log(` Vault: ${contracts.vault ?? chalk.dim(\"not set\")}`);\n console.log(` Uniswap: ${getUniswapApiKey() ? chalk.green(\"API key configured\") : chalk.dim(\"not set\")}`);\n console.log(` Venice: ${getVeniceApiKey() ? chalk.green(\"API key configured\") : chalk.dim(\"not set\")}`);\n\n // Show XMTP group IDs\n const groupEntries = Object.entries(config.groupCache || {}).filter(([, v]) => v);\n if (groupEntries.length > 0) {\n console.log();\n console.log(chalk.bold(\" XMTP Groups\"));\n for (const [sub, gid] of groupEntries) {\n console.log(` ${sub}: ${chalk.cyan(gid)}`);\n }\n }\n\n console.log();\n console.log(chalk.dim(\" Config file: ~/.sherwood/config.json\"));\n console.log();\n });\n\nprogram.parse();\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address, Chain } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { LendingProvider, ProviderInfo, DepositParams, BorrowParams, RepayParams, WithdrawParams, TxResult, LendingPosition } from \"../types.js\";\nimport { MOONWELL as getMoonwell } from \"../lib/addresses.js\";\n\nexport class MoonwellProvider implements LendingProvider {\n info(): ProviderInfo {\n return {\n name: \"moonwell\",\n type: \"lending\",\n capabilities: [\n \"lend.deposit\",\n \"lend.borrow\",\n \"lend.repay\",\n \"lend.withdraw\",\n \"lend.positions\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async depositCollateral(params: DepositParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async borrow(params: BorrowParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async repay(params: RepayParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async withdrawCollateral(params: WithdrawParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async getPosition(account: Address): Promise<LendingPosition> {\n throw new Error(\"Not implemented\");\n }\n}\n","/**\n * Strategy template commands — clone, build calls, propose, rebalance, status.\n *\n * Replaces the old strategy registry commands with template-based workflow:\n * sherwood strategy list — show available templates\n * sherwood strategy clone — clone + initialize a template\n * sherwood strategy propose — clone + init + build calls + submit proposal (all-in-one)\n * sherwood strategy status — read portfolio allocations + state\n * sherwood strategy rebalance — sell-all/re-buy at current target weights (Portfolio only)\n */\n\nimport type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, formatUnits, isAddress, erc20Abi, encodeAbiParameters, decodeAbiParameters } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt, formatContractError } from \"../lib/client.js\";\nimport { getChain, getExplorerUrl, getNetwork, CHAIN_REGISTRY } from \"../lib/network.js\";\nimport { getCachedSwapRoute, cacheSwapRoute, type SwapRoute } from \"../lib/config.js\";\nimport { TOKENS, MOONWELL, VENICE, AERODROME, UNISWAP, STRATEGY_TEMPLATES, SYNTHRA, CHAINLINK } from \"../lib/addresses.js\";\nimport { BASE_STRATEGY_ABI, PORTFOLIO_STRATEGY_ABI, SYNDICATE_VAULT_ABI } from \"../lib/abis.js\";\nimport { cloneTemplate } from \"../lib/clone.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { formatBatch } from \"../lib/batch.js\";\n\nimport * as moonwellBuilder from \"../strategies/moonwell-supply-template.js\";\nimport * as veniceBuilder from \"../strategies/venice-inference-template.js\";\nimport * as aerodromeBuilder from \"../strategies/aerodrome-lp-template.js\";\nimport * as wstethBuilder from \"../strategies/wsteth-moonwell-template.js\";\nimport * as mamoBuilder from \"../strategies/mamo-yield-template.js\";\nimport * as portfolioBuilder from \"../strategies/portfolio-template.js\";\nimport * as hyperliquidPerpBuilder from \"../strategies/hyperliquid-perp-template.js\";\n\nimport { concat, numberToHex, size } from \"viem\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Uniswap V3 swap routing helpers ──\n\n/**\n * Encode Uniswap V3 packed path: token (20 bytes) + fee (3 bytes) + token (20 bytes) [+ fee + token ...]\n */\nfunction encodeV3Path(tokens: Address[], fees: number[]): Hex {\n if (tokens.length !== fees.length + 1) throw new Error(\"tokens.length must be fees.length + 1\");\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // fee as 3 bytes (uint24)\n parts.push(numberToHex(fees[i], { size: 3 }));\n }\n }\n return concat(parts);\n}\n\n/**\n * Build swapExtraData for the UniswapSwapAdapter.\n *\n * Mode 0 — single-hop: 0x00 + abi.encode(uint24 fee)\n * Mode 1 — multi-hop: 0x01 + abi.encode(bytes path)\n *\n * For Synthra (Robinhood), extraData is just abi.encode(uint24 fee) with no mode prefix.\n */\nfunction buildSwapExtraData(\n network: string,\n tokenIn: Address,\n tokenOut: Address,\n feeTier: number,\n hop?: { via: Address; feeIn: number; feeOut: number },\n): Hex {\n if (network === \"robinhood-testnet\") {\n // SynthraDirectAdapter: plain abi.encode(uint24 fee)\n return encodeAbiParameters([{ type: \"uint24\" }], [feeTier]);\n }\n\n if (hop) {\n // Multi-hop: tokenIn → hop.via → tokenOut\n const path = encodeV3Path([tokenIn, hop.via, tokenOut], [hop.feeIn, hop.feeOut]);\n const encoded = encodeAbiParameters([{ type: \"bytes\" }], [path]);\n return `0x01${encoded.slice(2)}` as Hex;\n }\n\n // Single-hop: mode 0\n const encoded = encodeAbiParameters([{ type: \"uint24\" }], [feeTier]);\n return `0x00${encoded.slice(2)}` as Hex;\n}\n\n/**\n * Auto-detect swap route for a token pair on Uniswap V3.\n * Returns { direct: true, feeTier } or { direct: false, hop } or null if no route found.\n */\nasync function detectSwapRoute(\n asset: Address,\n token: Address,\n preferredFeeTier: number,\n): Promise<{ extraData: Hex; routeDesc: string } | null> {\n const network = getNetwork();\n if (network === \"robinhood-testnet\") {\n return {\n extraData: buildSwapExtraData(network, asset, token, preferredFeeTier),\n routeDesc: `direct (fee ${preferredFeeTier})`,\n };\n }\n\n const chainId = CHAIN_REGISTRY[network].chain.id;\n\n // Check config cache first\n const cached = getCachedSwapRoute(chainId, asset, token);\n if (cached) {\n const extraData = cached.hop\n ? buildSwapExtraData(network, asset, token, 0, {\n via: cached.hop.via as Address,\n feeIn: cached.hop.feeIn,\n feeOut: cached.hop.feeOut,\n })\n : buildSwapExtraData(network, asset, token, cached.feeTier);\n const desc = cached.hop\n ? `cached multi-hop: ${cached.hop.feeIn}→WETH→${cached.hop.feeOut}`\n : `cached direct (fee ${cached.feeTier})`;\n return { extraData, routeDesc: desc };\n }\n\n const publicClient = getPublicClient();\n const quoterAddr = UNISWAP().QUOTER_V2;\n const quoterAbi = [{\n type: \"function\",\n name: \"quoteExactInputSingle\",\n inputs: [{ type: \"tuple\", components: [\n { type: \"address\", name: \"tokenIn\" },\n { type: \"address\", name: \"tokenOut\" },\n { type: \"uint256\", name: \"amountIn\" },\n { type: \"uint24\", name: \"fee\" },\n { type: \"uint160\", name: \"sqrtPriceLimitX96\" },\n ]}],\n outputs: [\n { type: \"uint256\" }, { type: \"uint160\" }, { type: \"uint32\" }, { type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n }] as const;\n\n // 1. Try direct at preferred fee tier\n const testAmount = asset.toLowerCase() === TOKENS().USDC.toLowerCase() ? 1_000_000n : 1_000_000_000_000_000n; // 1 USDC or 0.001 WETH\n const feeTiers = [preferredFeeTier, 10000, 3000, 500].filter((v, i, a) => a.indexOf(v) === i);\n\n for (const fee of feeTiers) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: asset, tokenOut: token, amountIn: testAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n cacheSwapRoute(chainId, asset, token, { mode: \"direct\", feeTier: fee, detectedAt: Math.floor(Date.now() / 1000) });\n return {\n extraData: buildSwapExtraData(network, asset, token, fee),\n routeDesc: `direct (fee ${fee})`,\n };\n } catch {\n // No pool at this fee tier\n }\n }\n\n // 2. Try multi-hop via WETH\n const weth = TOKENS().WETH;\n if (asset.toLowerCase() === weth.toLowerCase()) return null; // Already tried direct with WETH\n\n // Find best USDC→WETH fee\n let bestAssetToWethFee: number | null = null;\n for (const fee of [500, 3000, 10000]) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: asset, tokenOut: weth, amountIn: testAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n bestAssetToWethFee = fee;\n break; // 500 is cheapest, prefer it\n } catch {}\n }\n if (!bestAssetToWethFee) return null;\n\n // Find best WETH→token fee\n const wethTestAmount = 1_000_000_000_000_000n; // 0.001 WETH\n for (const fee of feeTiers) {\n try {\n await publicClient.simulateContract({\n address: quoterAddr,\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [{ tokenIn: weth, tokenOut: token, amountIn: wethTestAmount, fee, sqrtPriceLimitX96: 0n }],\n });\n const hop = { via: weth, feeIn: bestAssetToWethFee, feeOut: fee };\n cacheSwapRoute(chainId, asset, token, { mode: \"multi-hop\", feeTier: 0, hop, detectedAt: Math.floor(Date.now() / 1000) });\n return {\n extraData: buildSwapExtraData(network, asset, token, 0, hop),\n routeDesc: `multi-hop: ${bestAssetToWethFee}→WETH→${fee}`,\n };\n } catch {}\n }\n\n return null; // No route found\n}\n\n// ── Template definitions ──\n\ninterface TemplateDef {\n name: string;\n key: string;\n description: string;\n addressKey: keyof ReturnType<typeof STRATEGY_TEMPLATES>;\n}\n\nconst TEMPLATES: TemplateDef[] = [\n {\n name: \"Moonwell Supply\",\n key: \"moonwell-supply\",\n description: \"Supply tokens to Moonwell lending market, earn yield\",\n addressKey: \"MOONWELL_SUPPLY\",\n },\n {\n name: \"Aerodrome LP\",\n key: \"aerodrome-lp\",\n description: \"Provide liquidity on Aerodrome DEX + optional gauge staking\",\n addressKey: \"AERODROME_LP\",\n },\n {\n name: \"Venice Inference\",\n key: \"venice-inference\",\n description: \"Stake VVV for sVVV — Venice private AI inference\",\n addressKey: \"VENICE_INFERENCE\",\n },\n {\n name: \"wstETH Moonwell Yield\",\n key: \"wsteth-moonwell\",\n description: \"WETH → wstETH → Moonwell — stack Lido + lending yield\",\n addressKey: \"WSTETH_MOONWELL\",\n },\n {\n name: \"Mamo Yield\",\n key: \"mamo-yield\",\n description: \"Deposit into Mamo for optimized yield across Moonwell + Morpho vaults\",\n addressKey: \"MAMO_YIELD\",\n },\n {\n name: \"Portfolio\",\n key: \"portfolio\",\n description: \"Weighted portfolio of tokens (stock tokens, crypto) with rebalancing\",\n addressKey: \"PORTFOLIO\",\n },\n {\n name: \"Hyperliquid Perp\",\n key: \"hyperliquid-perp\",\n description: \"Leveraged perp trading on Hyperliquid via HyperEVM precompiles\",\n addressKey: \"HYPERLIQUID_PERP\",\n },\n];\n\nfunction resolveTemplate(key: string): { def: TemplateDef; address: Address } {\n const def = TEMPLATES.find((t) => t.key === key);\n if (!def) {\n console.error(chalk.red(`Unknown template: ${key}`));\n console.error(chalk.dim(`Available: ${TEMPLATES.map((t) => t.key).join(\", \")}`));\n process.exit(1);\n }\n const address = STRATEGY_TEMPLATES()[def.addressKey];\n if (address === ZERO) {\n console.error(chalk.red(`Template \"${def.name}\" not deployed on this network.`));\n process.exit(1);\n }\n return { def, address };\n}\n\n// ── Helpers for building init data per template ──\n\nasync function buildInitDataForTemplate(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n vault: Address,\n): Promise<{ initData: Hex; asset: Address; assetAmount: bigint; extraApprovals?: { token: Address; amount: bigint }[] }> {\n if (templateKey === \"moonwell-supply\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for moonwell-supply template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const mToken = resolveMToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const supplyAmount = parseUnits(opts.amount as string, decimals);\n const minRedeem = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: moonwellBuilder.buildInitData(underlying, mToken, supplyAmount, minRedeem),\n asset: underlying,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for venice-inference template\"));\n process.exit(1);\n }\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const vvv = VENICE().VVV;\n const isDirect = asset.toLowerCase() === vvv.toLowerCase();\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const assetAmount = parseUnits(opts.amount as string, decimals);\n const agent = (opts.agent as Address) || getAccount().address;\n const isSingleHop = !!opts.singleHop;\n\n // Auto-quote minVVV if not specified (non-direct paths only)\n let minVVV = 0n;\n if (!isDirect) {\n if (opts.minVvv) {\n minVVV = parseUnits(opts.minVvv as string, 18);\n } else {\n // Quote expected VVV out and apply 5% slippage\n const publicClient = getPublicClient();\n const aeroRouterAbi = [{\n name: \"getAmountsOut\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"routes\", type: \"tuple[]\", components: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"stable\", type: \"bool\" },\n { name: \"factory\", type: \"address\" },\n ]},\n ],\n outputs: [{ name: \"amounts\", type: \"uint256[]\" }],\n }] as const;\n\n const routes = isSingleHop\n ? [{ from: asset, to: vvv, stable: false, factory: AERODROME().FACTORY }]\n : [\n { from: asset, to: TOKENS().WETH, stable: false, factory: AERODROME().FACTORY },\n { from: TOKENS().WETH, to: vvv, stable: false, factory: AERODROME().FACTORY },\n ];\n\n try {\n const amounts = await publicClient.readContract({\n address: AERODROME().ROUTER,\n abi: aeroRouterAbi,\n functionName: \"getAmountsOut\",\n args: [assetAmount, routes],\n });\n const expectedVVV = amounts[amounts.length - 1];\n // 5% slippage: minVVV = expectedVVV * 95 / 100\n minVVV = (expectedVVV * 95n) / 100n;\n console.log(chalk.dim(` Auto-quoted minVVV: ${(Number(minVVV) / 1e18).toFixed(4)} VVV (5% slippage on ~${(Number(expectedVVV) / 1e18).toFixed(4)} VVV)`));\n } catch {\n console.error(chalk.red(\"Could not quote USDC→VVV price. Pass --min-vvv <amount> manually.\"));\n process.exit(1);\n }\n }\n }\n\n const params: veniceBuilder.VeniceInferenceInitParams = {\n asset,\n weth: isDirect ? ZERO : TOKENS().WETH,\n vvv,\n sVVV: VENICE().STAKING,\n aeroRouter: isDirect ? ZERO : AERODROME().ROUTER,\n aeroFactory: isDirect ? ZERO : AERODROME().FACTORY,\n agent,\n assetAmount,\n minVVV,\n deadlineOffset: 300n,\n singleHop: isSingleHop,\n };\n\n return {\n initData: veniceBuilder.buildInitData(params),\n asset,\n assetAmount,\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n for (const flag of [\"tokenA\", \"tokenB\", \"amountA\", \"amountB\", \"lpToken\"]) {\n if (!opts[flag]) {\n console.error(chalk.red(`--${flag.replace(/([A-Z])/g, \"-$1\").toLowerCase()} is required for aerodrome-lp template`));\n process.exit(1);\n }\n }\n const tokenA = opts.tokenA as Address;\n const tokenB = opts.tokenB as Address;\n const publicClient = getPublicClient();\n const [decimalsA, decimalsB] = await Promise.all([\n publicClient.readContract({ address: tokenA, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: tokenB, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n const amountA = parseUnits(opts.amountA as string, decimalsA);\n const amountB = parseUnits(opts.amountB as string, decimalsB);\n const minAOut = parseUnits((opts.minAOut as string) || \"0\", decimalsA);\n const minBOut = parseUnits((opts.minBOut as string) || \"0\", decimalsB);\n\n const params: aerodromeBuilder.AerodromeLPInitParams = {\n tokenA,\n tokenB,\n stable: !!opts.stable,\n factory: AERODROME().FACTORY,\n router: AERODROME().ROUTER,\n gauge: (opts.gauge as Address) || ZERO,\n lpToken: opts.lpToken as Address,\n amountADesired: amountA,\n amountBDesired: amountB,\n amountAMin: amountA, // use desired as min for now\n amountBMin: amountB,\n minAmountAOut: minAOut,\n minAmountBOut: minBOut,\n };\n\n return {\n initData: aerodromeBuilder.buildInitData(params),\n asset: tokenA,\n assetAmount: amountA,\n extraApprovals: [{ token: tokenB, amount: amountB }],\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n const supplyAmount = opts.amount ? parseUnits(opts.amount as string, 18) : 0n; // WETH = 18 decimals; 0 => use full vault balance at execute time\n const slippageBps = BigInt((opts.slippage as string) || \"500\"); // default 5% slippage\n // Per-unit rates (1e18-scaled) — Aerodrome wstETH/WETH stable pool trades\n // near 1:1, so default the expected rate to 1e18. Slippage cuts from that.\n // Rates scale with amountIn at execute time → dynamic-all mode is safe.\n const ONE = 10n ** 18n;\n const minWstethOutPerWeth = (ONE * (10000n - slippageBps)) / 10000n;\n const minWethOutPerWsteth = (ONE * (10000n - slippageBps)) / 10000n;\n\n const params: wstethBuilder.WstETHMoonwellInitParams = {\n weth: TOKENS().WETH,\n wsteth: TOKENS().wstETH,\n mwsteth: MOONWELL().mWstETH,\n aeroRouter: AERODROME().ROUTER,\n aeroFactory: AERODROME().FACTORY,\n supplyAmount,\n minWstethOutPerWeth,\n minWethOutPerWsteth,\n deadlineOffset: 300n,\n };\n\n return {\n initData: wstethBuilder.buildInitData(params),\n asset: TOKENS().WETH,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for mamo-yield template\"));\n process.exit(1);\n }\n if (!opts.mamoFactory) {\n console.error(chalk.red(\"--mamo-factory is required for mamo-yield template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const amount = parseUnits(opts.amount as string, decimals);\n const minRedeemAmount = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: mamoBuilder.buildInitData(underlying, opts.mamoFactory as Address, minRedeemAmount),\n asset: underlying,\n assetAmount: amount,\n };\n }\n\n if (templateKey === \"portfolio\") {\n if (!opts.amount) { console.error(chalk.red(\"--amount is required for portfolio template\")); process.exit(1); }\n if (!opts.tokens || !opts.weights) {\n console.error(chalk.red(\"--tokens and --weights are required for portfolio template\"));\n console.error(chalk.dim(\" --tokens: comma-separated token addresses or symbols\"));\n console.error(chalk.dim(\" --weights: comma-separated bps (must sum to 10000)\"));\n process.exit(1);\n }\n const tokens = TOKENS();\n const defaultAsset = getNetwork() === \"robinhood-testnet\" ? \"WETH\" : \"USDC\";\n const assetSymbol = (opts.asset as string) || defaultAsset;\n const asset = resolveToken(assetSymbol);\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const totalAmount = parseUnits(opts.amount as string, decimals);\n const maxSlippageBps = Number((opts.maxSlippage as string) || \"500\");\n const feeTier = (opts.feeTier as string) || \"3000\";\n\n const tokenAddrs = (opts.tokens as string).split(\",\").map((t) => {\n const trimmed = t.trim();\n if (isAddress(trimmed)) return trimmed as Address;\n const allTokens = tokens as Record<string, Address>;\n const resolved = allTokens[trimmed.toUpperCase()];\n if (resolved && resolved !== ZERO) return resolved;\n console.error(chalk.red(`Unknown token: ${trimmed}`)); process.exit(1);\n });\n const weightsBps = (opts.weights as string).split(\",\").map((w) => Number(w.trim()));\n if (tokenAddrs.length !== weightsBps.length) { console.error(chalk.red(\"--tokens and --weights must have same length\")); process.exit(1); }\n if (weightsBps.reduce((a, b) => a + b, 0) !== 10000) { console.error(chalk.red(`Weights must sum to 10000`)); process.exit(1); }\n\n const swapAdapter = (opts.swapAdapter as Address) || resolveSwapAdapter();\n const chainlinkVerifier = CHAINLINK().VERIFIER_PROXY;\n\n // Auto-detect swap routes for each token\n console.log(chalk.dim(\" Detecting swap routes...\"));\n const allocations: portfolioBuilder.BasketAllocation[] = [];\n for (let i = 0; i < tokenAddrs.length; i++) {\n const token = tokenAddrs[i];\n const route = await detectSwapRoute(asset, token, Number(feeTier));\n if (!route) {\n console.error(chalk.red(`No swap route found for ${token}. No Uniswap V3 pool (direct or via WETH).`));\n process.exit(1);\n }\n console.log(chalk.dim(` ${token.slice(0, 10)}... → ${route.routeDesc}`));\n allocations.push({\n token, weightBps: weightsBps[i],\n swapExtraData: route.extraData,\n });\n }\n return {\n initData: portfolioBuilder.buildInitData(asset, swapAdapter, chainlinkVerifier, allocations, totalAmount, maxSlippageBps),\n asset, assetAmount: totalAmount,\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n // Omit --amount to use the vault's full asset balance at execute time (dynamic-all mode).\n const depositAmount = opts.amount ? parseUnits(opts.amount as string, decimals) : 0n;\n // --min-return is a settlement floor: `sweepToVault` reverts on the first\n // call if `balance < minReturnAmount`. With --amount set we default to 1:1\n // (return at least the deposit). With dynamic-all we have no anchor, so\n // require --min-return explicitly — a zero floor would trivially pass the\n // settlement guard and defeat the whole check.\n if (depositAmount === 0n && !opts.minReturn) {\n console.error(chalk.red(\n \"--min-return is required when --amount is omitted (dynamic-all mode).\\n\" +\n \" The settlement floor can't be derived without a reference deposit — \" +\n \"set it explicitly to the minimum USDC you'll accept back from HyperCore.\",\n ));\n process.exit(1);\n }\n const minReturn = opts.minReturn\n ? parseUnits(opts.minReturn as string, decimals)\n : opts.amount\n ? parseUnits(opts.amount as string, decimals)\n : 0n;\n const leverage = Number((opts.leverage as string) || \"10\");\n const assetIndex = Number((opts.assetIndex as string) || \"0\");\n const maxPosition = parseUnits((opts.maxPosition as string) || \"100000\", decimals);\n const maxTradesDay = Number((opts.maxTradesPerDay as string) || \"50\");\n return {\n initData: hyperliquidPerpBuilder.buildInitData(asset, depositAmount, minReturn, assetIndex, leverage, maxPosition, maxTradesDay),\n asset, assetAmount: depositAmount,\n };\n }\n\n throw new Error(`No init builder for template: ${templateKey}`);\n}\n\nfunction buildCallsForTemplate(\n templateKey: string,\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n extraApprovals?: { token: Address; amount: bigint }[],\n): { executeCalls: BatchCall[]; settleCalls: BatchCall[] } {\n if (templateKey === \"moonwell-supply\") {\n return {\n executeCalls: moonwellBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: moonwellBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"venice-inference\") {\n return {\n executeCalls: veniceBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: veniceBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n const tokenB = extraApprovals?.[0]?.token ?? ZERO;\n const amountB = extraApprovals?.[0]?.amount ?? 0n;\n return {\n executeCalls: aerodromeBuilder.buildExecuteCalls(clone, asset, assetAmount, tokenB, amountB),\n settleCalls: aerodromeBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n return {\n executeCalls: wstethBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: wstethBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n return {\n executeCalls: mamoBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: mamoBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"portfolio\") {\n return {\n executeCalls: portfolioBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: portfolioBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n return {\n executeCalls: hyperliquidPerpBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: hyperliquidPerpBuilder.buildSettleCalls(clone),\n };\n }\n\n throw new Error(`No call builder for template: ${templateKey}`);\n}\n\n// ── Token resolution ──\n\nfunction resolveSwapAdapter(): Address {\n const network = getNetwork();\n if (network === \"robinhood-testnet\") {\n if (SYNTHRA().ROUTER === ZERO) { console.error(chalk.red(\"Synthra DEX not available\")); process.exit(1); }\n return \"0xdae81cDCfcB14c56fCeB788A147Fcd6CbEdfEeca\" as Address;\n }\n const adapterAddr = UNISWAP().SWAP_ADAPTER;\n if (adapterAddr !== ZERO) return adapterAddr;\n console.error(chalk.red(\"UniswapSwapAdapter not deployed yet. Use --swap-adapter to specify manually.\"));\n process.exit(1);\n}\n\nfunction resolveToken(symbolOrAddress: string): Address {\n if (isAddress(symbolOrAddress)) return symbolOrAddress as Address;\n const upper = symbolOrAddress.toUpperCase();\n const tokens = TOKENS();\n const tokenMap: Record<string, Address> = {\n USDC: tokens.USDC,\n WETH: tokens.WETH,\n DAI: tokens.DAI,\n AERO: tokens.AERO,\n VVV: VENICE().VVV,\n };\n const addr = tokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`Unknown token: ${symbolOrAddress}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction resolveMToken(tokenSymbol: string): Address {\n const upper = tokenSymbol.toUpperCase();\n const moonwell = MOONWELL();\n const mTokenMap: Record<string, Address> = {\n USDC: moonwell.mUSDC,\n WETH: moonwell.mWETH,\n };\n const addr = mTokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`No Moonwell market for: ${tokenSymbol}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction serializeCalls(calls: BatchCall[]): string {\n return JSON.stringify(\n calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n null,\n 2,\n );\n}\n\n// ── Commands ──\n\nexport function registerStrategyTemplateCommands(strategy: Command): void {\n // ── strategy list ──\n\n strategy\n .command(\"list\")\n .description(\"List available strategy templates\")\n .action(() => {\n const templates = STRATEGY_TEMPLATES();\n const network = getNetwork();\n\n console.log();\n console.log(chalk.bold(\"Strategy Templates\"), chalk.dim(`(${network})`));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n let availableCount = 0;\n for (const t of TEMPLATES) {\n const addr = templates[t.addressKey];\n if (addr !== ZERO) {\n availableCount++;\n console.log();\n console.log(` ${chalk.bold(t.name)} (${chalk.cyan(t.key)})`);\n console.log(` ${t.description}`);\n console.log(` Template: ${chalk.green(addr)}`);\n }\n }\n\n if (availableCount === 0) {\n console.log();\n console.log(chalk.yellow(\" No strategy templates deployed on this network.\"));\n }\n\n const unavailable = TEMPLATES.filter((t) => templates[t.addressKey] === ZERO);\n if (unavailable.length > 0) {\n console.log();\n console.log(chalk.dim(` Not available on ${network}:`));\n for (const t of unavailable) {\n console.log(chalk.dim(` ${t.name} (${t.key})`));\n }\n }\n\n console.log();\n console.log(chalk.dim(\"Clone a template: sherwood strategy clone <template> --vault <addr> ...\"));\n console.log(chalk.dim(\"Full proposal: sherwood strategy propose <template> --vault <addr> ...\"));\n console.log();\n });\n\n // ── strategy clone ──\n\n strategy\n .command(\"clone\")\n .description(\"Clone a strategy template and initialize it\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n let cloneHash: Hex;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneHash = result.hash;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(cloneHash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n const receipt = await waitForReceipt(initHash);\n if (receipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"Strategy clone ready:\"), chalk.green(clone));\n console.log(chalk.dim(\"Use this address in your proposal batch calls.\"));\n console.log();\n });\n\n // ── strategy init ──\n\n strategy\n .command(\"init\")\n .description(\"Initialize an already-deployed but uninitialized strategy clone\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--clone <address>\", \"Clone address to initialize\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const clone = opts.clone as Address;\n const vault = opts.vault as Address;\n if (!isAddress(clone)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n resolveTemplate(templateKey); // validate template exists\n\n // Check if already initialized\n const publicClient = getPublicClient();\n const currentVault = await publicClient.readContract({\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"vault\",\n }) as Address;\n\n if (currentVault !== \"0x0000000000000000000000000000000000000000\") {\n console.error(chalk.red(`Clone already initialized (vault: ${currentVault})`));\n process.exit(1);\n }\n\n const initSpinner = ora(\"Initializing strategy clone...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n const receipt = await waitForReceipt(initHash);\n if (receipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(initHash)}`));\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Verify\n const verifiedVault = await publicClient.readContract({\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"vault\",\n }) as Address;\n\n console.log();\n console.log(chalk.bold(\"Clone initialized:\"), chalk.green(clone));\n console.log(` Vault: ${chalk.green(verifiedVault)}`);\n console.log(` Proposer: ${chalk.green(getAccount().address)}`);\n console.log();\n });\n\n // ── strategy propose ──\n\n strategy\n .command(\"propose\")\n .description(\"Clone + init + build calls + submit governance proposal (all-in-one)\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .option(\"--write-calls <dir>\", \"Write execute/settle JSON to directory (skip proposal submission)\")\n // proposal metadata (required unless --write-calls)\n .option(\"--name <name>\", \"Proposal name\")\n .option(\"--description <text>\", \"Proposal description\")\n .option(\"--performance-fee <bps>\", \"Agent fee in bps\")\n .option(\"--duration <duration>\", \"Strategy duration (7d, 24h, etc.)\")\n // template-specific (same as clone)\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n // mamo-yield\n .option(\"--mamo-factory <address>\", \"Mamo StrategyFactory address (Mamo)\")\n // portfolio\n .option(\"--tokens <list>\", \"Comma-separated token addresses or symbols (Portfolio)\")\n .option(\"--weights <list>\", \"Comma-separated weights in bps, must sum to 10000 (Portfolio)\")\n .option(\"--max-slippage <bps>\", \"Max slippage bps (Portfolio, default: 500)\")\n .option(\"--fee-tier <n>\", \"Pool fee tier (Portfolio, default: 3000)\")\n .option(\"--swap-adapter <address>\", \"Swap adapter address (Portfolio)\")\n // hyperliquid-perp\n .option(\"--leverage <number>\", \"Leverage multiplier (Hyperliquid Perp, default: 10)\")\n .option(\"--asset-index <number>\", \"Perp asset index (Hyperliquid Perp, default: 0 for BTC)\")\n .option(\"--min-return <n>\", \"Min return amount on settlement (Hyperliquid Perp)\")\n .option(\"--max-position <amount>\", \"Max position size in USD (Hyperliquid Perp, default: 100000)\")\n .option(\"--max-trades-per-day <n>\", \"Max trades per day (Hyperliquid Perp, default: 50)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 0. Preflight — bail out before burning gas on clone + init for a\n // proposal the governor will refuse anyway. Two read-only checks,\n // no gas cost.\n const account = getAccount();\n const preflightSpinner = ora(\"Preflight checks...\").start();\n try {\n const publicClient = getPublicClient();\n\n // (a) Signer must be a registered active agent on this vault.\n const isRegistered = await publicClient.readContract({\n address: vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"isAgent\",\n args: [account.address],\n });\n if (!isRegistered) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(\n chalk.red(\n ` Signer ${account.address} is not a registered agent on ${vault}.\\n` +\n ` Register first via: sherwood syndicate approve --wallet ${account.address}`,\n ),\n );\n process.exit(1);\n }\n\n // (b) Vault must not be paused (deposits + governance ops would revert).\n const paused = await publicClient.readContract({\n address: vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"paused\",\n });\n if (paused) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(chalk.red(` Vault ${vault} is paused. Cannot propose.`));\n process.exit(1);\n }\n\n preflightSpinner.succeed(\"Preflight OK\");\n } catch (err) {\n preflightSpinner.fail(\"Preflight failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(result.hash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n let asset: Address;\n let assetAmount: bigint;\n let extraApprovals: { token: Address; amount: bigint }[] | undefined;\n try {\n const built = await buildInitDataForTemplate(templateKey, opts, vault);\n asset = built.asset;\n assetAmount = built.assetAmount;\n extraApprovals = built.extraApprovals;\n\n // account hoisted above during preflight — reuse.\n const initHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, built.initData],\n });\n\n const initReceipt = await waitForReceipt(initHash);\n if (initReceipt.status === \"reverted\") {\n throw new Error(\"Initialize transaction reverted on-chain\");\n }\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 3. Build batch calls\n const { executeCalls, settleCalls } = buildCallsForTemplate(\n templateKey, clone, asset, assetAmount, extraApprovals,\n );\n\n console.log();\n console.log(chalk.bold(`Execute calls (${executeCalls.length}):`));\n console.log(formatBatch(executeCalls));\n console.log(chalk.bold(`Settle calls (${settleCalls.length}):`));\n console.log(formatBatch(settleCalls));\n\n // 4. Write files or submit proposal\n if (opts.writeCalls) {\n const dir = resolve(opts.writeCalls as string);\n mkdirSync(dir, { recursive: true });\n\n const execPath = resolve(dir, \"execute.json\");\n const settlePath = resolve(dir, \"settle.json\");\n writeFileSync(execPath, serializeCalls(executeCalls));\n writeFileSync(settlePath, serializeCalls(settleCalls));\n\n console.log();\n console.log(chalk.green(`Execute calls: ${execPath}`));\n console.log(chalk.green(`Settle calls: ${settlePath}`));\n console.log(chalk.green(`Clone address: ${clone}`));\n console.log();\n console.log(chalk.dim(\"Submit with:\"));\n console.log(chalk.dim(` sherwood proposal create \\\\`));\n console.log(chalk.dim(` --vault ${vault} \\\\`));\n console.log(chalk.dim(` --name \"...\" --description \"...\" \\\\`));\n console.log(chalk.dim(` --performance-fee 0 --duration 7d \\\\`));\n console.log(chalk.dim(` --execute-calls ${execPath} \\\\`));\n console.log(chalk.dim(` --settle-calls ${settlePath}`));\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Reminder: before settlement, agent must approve repayment:\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n console.log(chalk.yellow(\" Agent can update repayment via strategy.updateParams(newRepayment, 0, 0)\"));\n }\n\n console.log();\n return;\n }\n\n // Direct proposal submission requires metadata flags\n if (!opts.name || !opts.performanceFee || !opts.duration) {\n console.error(chalk.red(\"Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission.\"));\n process.exit(1);\n }\n\n // Lazy import governor to avoid pulling it in for --write-calls path\n const { propose } = await import(\"../lib/governor.js\");\n const { pinJSON } = await import(\"../lib/ipfs.js\");\n const { parseDuration } = await import(\"../lib/governor.js\");\n\n const performanceFeeBps = BigInt(opts.performanceFee as string);\n if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {\n console.error(chalk.red(\"--performance-fee must be 0-10000 (basis points)\"));\n process.exit(1);\n }\n const strategyDuration = parseDuration(opts.duration as string);\n // account already hoisted at preflight.\n\n const metaSpinner = ora(\"Pinning metadata to IPFS...\").start();\n let metadataURI: string;\n try {\n const metadata = {\n name: opts.name,\n description: opts.description || \"\",\n proposer: account.address,\n vault,\n strategyClone: clone,\n template: def.key,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: new Date().toISOString(),\n };\n metadataURI = await pinJSON(metadata, opts.name as string);\n metaSpinner.succeed(`Metadata pinned: ${metadataURI}`);\n } catch (err) {\n metaSpinner.fail(\"IPFS pin failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n const proposeSpinner = ora(\"Submitting proposal...\").start();\n try {\n const { hash, proposalId } = await propose(\n vault, metadataURI, performanceFeeBps, strategyDuration,\n executeCalls, settleCalls,\n );\n proposeSpinner.succeed(`Proposal #${proposalId} created`);\n console.log(`Proposal #${proposalId}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(hash)}`));\n console.log(chalk.dim(` Clone: ${clone}`));\n } catch (err) {\n proposeSpinner.fail(\"Proposal failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Next steps:\"));\n console.log(chalk.yellow(\" 1. After execution: sherwood venice provision\"));\n console.log(chalk.yellow(\" 2. Use inference: sherwood venice infer --model <id> --prompt '...'\"));\n console.log(chalk.yellow(\" 3. Before settlement: approve repayment (principal + profit):\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n }\n\n console.log();\n });\n\n // ── strategy status ──\n\n strategy\n .command(\"status\")\n .description(\"Show portfolio strategy status — allocations, balances, drift, PnL (Portfolio only)\")\n .argument(\"<clone>\", \"Strategy clone address\")\n .option(\"--json\", \"Output machine-readable JSON for agent consumption\")\n .action(async (cloneArg: string, opts) => {\n if (!isAddress(cloneArg)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n const clone = cloneArg as Address;\n const publicClient = getPublicClient();\n const network = getNetwork();\n const jsonMode = !!opts.json;\n\n const spinner = jsonMode ? null : ora(\"Reading strategy state...\").start();\n try {\n // Read strategy state + swap extra data (for fee tiers)\n const [stateRaw, vault, proposer, assetAddr, totalAmount, maxSlippage, allocations, swapExtraData] = await Promise.all([\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"state\" }),\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"vault\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"proposer\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"asset\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"totalAmount\" }) as Promise<bigint>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"maxSlippageBps\" }) as Promise<bigint>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getAllocations\" }) as Promise<readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[]>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getSwapExtraData\" }) as Promise<readonly `0x${string}`[]>,\n ]);\n\n const stateNames = [\"Pending\", \"Executed\", \"Settled\"];\n const stateStr = stateNames[Number(stateRaw)] || `Unknown(${stateRaw})`;\n\n // Read asset decimals & symbol\n const [assetDecimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n\n // Read current token balances & symbols in parallel\n const tokenReads = allocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const tokenData = await Promise.all(tokenReads);\n\n // Read asset balance held by strategy\n const assetBalance = await publicClient.readContract({\n address: assetAddr,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [clone],\n });\n\n // Extract fee tiers from swapExtraData (abi.encode(uint24 fee))\n const feeTiers = swapExtraData.map((data) => {\n try {\n const [fee] = decodeAbiParameters([{ type: \"uint24\" }], data);\n return Number(fee) > 0 && Number(fee) <= 100000 ? Number(fee) : 3000;\n } catch {\n return 3000;\n }\n });\n\n // Fetch prices (graceful — continues without if unavailable)\n let prices: (import(\"../lib/price.js\").TokenPrice | null)[] = [];\n let priceSource: \"uniswap\" | \"synthra\" | null = null;\n try {\n const { getTokenPricesInAsset } = await import(\"../lib/price.js\");\n prices = await getTokenPricesInAsset({\n tokens: allocations.map((a, i) => ({\n token: a.token,\n tokenDecimals: tokenData[i][2] as number,\n feeTier: feeTiers[i],\n })),\n asset: assetAddr,\n assetDecimals,\n });\n priceSource = prices.find((p) => p !== null)?.source ?? null;\n } catch {\n // Prices unavailable — continue with balance-only\n }\n\n const pricesAvailable = prices.some((p) => p !== null);\n\n // Compute enriched allocation data\n const assetBalanceNum = Number(formatUnits(assetBalance as bigint, assetDecimals));\n let totalPortfolioValue = assetBalanceNum;\n let totalInvested = 0n;\n\n interface AllocStatus {\n token: Address;\n symbol: string;\n decimals: number;\n targetWeightBps: number;\n balance: string;\n balanceRaw: string;\n investedAmount: string;\n currentPrice: number | null;\n currentValue: number | null;\n actualWeightBps: number | null;\n driftBps: number | null;\n pnl: number | null;\n pnlPct: number | null;\n }\n\n const allocStatuses: AllocStatus[] = allocations.map((alloc, i) => {\n const [balance, symbol, decimals] = tokenData[i];\n const balanceNum = Number(formatUnits(balance as bigint, decimals));\n const investedNum = Number(formatUnits(alloc.investedAmount, assetDecimals));\n totalInvested += alloc.investedAmount;\n\n const price = prices[i];\n let currentValue: number | null = null;\n\n if (price) {\n currentValue = balanceNum * price.price;\n totalPortfolioValue += currentValue;\n }\n\n return {\n token: alloc.token,\n symbol: symbol as string,\n decimals: decimals as number,\n targetWeightBps: Number(alloc.targetWeightBps),\n balance: formatUnits(balance as bigint, decimals),\n balanceRaw: (balance as bigint).toString(),\n investedAmount: formatUnits(alloc.investedAmount, assetDecimals),\n currentPrice: price?.price ?? null,\n currentValue,\n actualWeightBps: null, // computed after totals\n driftBps: null,\n pnl: currentValue !== null ? currentValue - investedNum : null,\n pnlPct: currentValue !== null && investedNum > 0\n ? ((currentValue - investedNum) / investedNum) * 100\n : null,\n };\n });\n\n // Second pass: compute actual weights and drift (needs totalPortfolioValue)\n let maxDriftBps = 0;\n let maxDriftToken = \"\";\n if (pricesAvailable && totalPortfolioValue > 0) {\n for (const a of allocStatuses) {\n if (a.currentValue !== null) {\n a.actualWeightBps = Math.round((a.currentValue / totalPortfolioValue) * 10000);\n a.driftBps = a.actualWeightBps - a.targetWeightBps;\n if (Math.abs(a.driftBps) > Math.abs(maxDriftBps)) {\n maxDriftBps = a.driftBps;\n maxDriftToken = a.symbol;\n }\n }\n }\n }\n\n // Total PnL\n const totalInvestedNum = Number(formatUnits(totalInvested, assetDecimals));\n const totalPnl = pricesAvailable ? totalPortfolioValue - totalInvestedNum : null;\n const totalPnlPct = totalPnl !== null && totalInvestedNum > 0\n ? (totalPnl / totalInvestedNum) * 100\n : null;\n\n spinner?.succeed(\"Strategy state loaded\");\n\n // ── JSON output ──\n if (jsonMode) {\n const result = {\n clone,\n vault,\n proposer,\n state: stateStr,\n network,\n asset: { address: assetAddr, symbol: assetSymbol as string, decimals: assetDecimals as number },\n totalDeployed: formatUnits(totalAmount, assetDecimals),\n maxSlippageBps: Number(maxSlippage),\n assetBalance: formatUnits(assetBalance as bigint, assetDecimals),\n pricesAvailable,\n priceSource,\n portfolio: {\n totalValue: pricesAvailable ? totalPortfolioValue : null,\n totalPnl,\n totalPnlPct,\n },\n allocations: allocStatuses,\n maxDriftBps: pricesAvailable ? maxDriftBps : null,\n maxDriftToken: pricesAvailable ? maxDriftToken : null,\n timestamp: new Date().toISOString(),\n };\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n return;\n }\n\n // ── Human-friendly output ──\n const stateColor = stateStr === \"Executed\" ? chalk.green : stateStr === \"Settled\" ? chalk.blue : chalk.yellow;\n\n console.log();\n console.log(chalk.bold(\"Portfolio Strategy Status\"));\n console.log(chalk.dim(\"─\".repeat(70)));\n console.log(` Clone: ${chalk.cyan(clone)}`);\n console.log(` Vault: ${chalk.cyan(vault)}`);\n console.log(` Proposer: ${chalk.cyan(proposer)}`);\n console.log(` State: ${stateColor(stateStr)}`);\n console.log(` Asset: ${assetSymbol} (${assetAddr})`);\n console.log(` Deployed: ${formatUnits(totalAmount, assetDecimals)} ${assetSymbol}`);\n console.log(` Max Slip: ${Number(maxSlippage) / 100}%`);\n console.log(` Asset held: ${formatUnits(assetBalance as bigint, assetDecimals)} ${assetSymbol}`);\n\n if (pricesAvailable) {\n const pvStr = totalPortfolioValue.toFixed(6);\n const pnlStr = totalPnl !== null ? (totalPnl >= 0 ? \"+\" : \"\") + totalPnl.toFixed(6) : \"n/a\";\n const pnlPctStr = totalPnlPct !== null ? (totalPnlPct >= 0 ? \"+\" : \"\") + totalPnlPct.toFixed(1) + \"%\" : \"\";\n const pnlColor = totalPnl !== null && totalPnl >= 0 ? chalk.green : chalk.red;\n console.log(` Value: ${pvStr} ${assetSymbol} | PnL: ${pnlColor(`${pnlStr} (${pnlPctStr})`)}`);\n console.log(` Price src: ${priceSource}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Allocations\"));\n console.log(chalk.dim(\"─\".repeat(70)));\n\n if (pricesAvailable) {\n // Price-enriched table\n console.log(\n chalk.dim(\" Token\".padEnd(10)) +\n chalk.dim(\"Target\".padEnd(9)) +\n chalk.dim(\"Actual\".padEnd(9)) +\n chalk.dim(\"Drift\".padEnd(8)) +\n chalk.dim(\"Value\".padEnd(16)) +\n chalk.dim(\"PnL\".padEnd(16)) +\n chalk.dim(\"Balance\"),\n );\n\n for (const a of allocStatuses) {\n const targetStr = (a.targetWeightBps / 100).toFixed(1) + \"%\";\n const actualStr = a.actualWeightBps !== null ? (a.actualWeightBps / 100).toFixed(1) + \"%\" : \"—\";\n const driftStr = a.driftBps !== null\n ? (a.driftBps >= 0 ? \"+\" : \"\") + a.driftBps\n : \"—\";\n const driftColor = a.driftBps !== null\n ? (Math.abs(a.driftBps) > 500 ? chalk.red : Math.abs(a.driftBps) > 200 ? chalk.yellow : chalk.dim)\n : chalk.dim;\n const valueStr = a.currentValue !== null ? a.currentValue.toFixed(6) : \"—\";\n const pnlPctStr = a.pnlPct !== null ? (a.pnlPct >= 0 ? \"+\" : \"\") + a.pnlPct.toFixed(1) + \"%\" : \"—\";\n const pnlColor = a.pnlPct !== null ? (a.pnlPct >= 0 ? chalk.green : chalk.red) : chalk.dim;\n\n console.log(\n ` ${chalk.bold(a.symbol.padEnd(8))}` +\n `${targetStr.padEnd(9)}` +\n `${actualStr.padEnd(9)}` +\n `${driftColor(driftStr.toString().padEnd(8))}` +\n `${valueStr.padEnd(16)}` +\n `${pnlColor(pnlPctStr.padEnd(16))}` +\n `${a.balance}`,\n );\n }\n } else {\n // Balance-only table (no prices available)\n console.log(chalk.dim(\" Prices unavailable — showing raw balances only.\"));\n console.log();\n console.log(\n chalk.dim(\" Token\".padEnd(12)) +\n chalk.dim(\"Weight\".padEnd(10)) +\n chalk.dim(\"Invested\".padEnd(18)) +\n chalk.dim(\"Balance\".padEnd(18)) +\n chalk.dim(\"Address\"),\n );\n\n for (const a of allocStatuses) {\n const weightPct = (a.targetWeightBps / 100).toFixed(1) + \"%\";\n console.log(\n ` ${chalk.bold(a.symbol.padEnd(10))}` +\n `${weightPct.padEnd(10)}` +\n `${a.investedAmount.padEnd(18)}` +\n `${a.balance.padEnd(18)}` +\n `${chalk.dim(a.token)}`,\n );\n }\n }\n\n console.log(chalk.dim(\"─\".repeat(70)));\n console.log(` Total invested: ${formatUnits(totalInvested, assetDecimals)} ${assetSymbol}`);\n\n if (pricesAvailable && maxDriftToken) {\n const absMaxDrift = Math.abs(maxDriftBps);\n const driftColor = absMaxDrift > 500 ? chalk.red : absMaxDrift > 200 ? chalk.yellow : chalk.green;\n console.log(` Max drift: ${driftColor(`${maxDriftBps > 0 ? \"+\" : \"\"}${maxDriftBps} bps`)} (${maxDriftToken})`);\n }\n\n if (stateStr === \"Executed\") {\n console.log();\n console.log(chalk.dim(\"Rebalance: sherwood strategy rebalance \" + clone));\n console.log(chalk.dim(\"With new weights: sherwood strategy rebalance \" + clone + \" --new-weights 2500,2500,2000,1500,1500\"));\n }\n\n console.log();\n } catch (err) {\n spinner?.fail(\"Failed to read strategy state\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── strategy rebalance ──\n\n strategy\n .command(\"rebalance\")\n .description(\"Rebalance a portfolio strategy — sell all positions, re-buy at target weights (Portfolio only)\")\n .argument(\"<clone>\", \"Strategy clone address\")\n .option(\"--new-weights <list>\", \"Comma-separated new weights in bps (must sum to 10000). Updates weights before rebalancing.\")\n .option(\"--max-slippage <bps>\", \"New max slippage bps (used with --new-weights)\")\n .option(\"--dry-run\", \"Show what would happen without executing\")\n .action(async (cloneArg: string, opts) => {\n if (!isAddress(cloneArg)) {\n console.error(chalk.red(\"Invalid clone address\"));\n process.exit(1);\n }\n const clone = cloneArg as Address;\n const publicClient = getPublicClient();\n const account = getAccount();\n const chain = getChain();\n\n // 1. Verify strategy state\n const verifySpinner = ora(\"Verifying strategy state...\").start();\n try {\n const [stateRaw, proposer, assetAddr, allocations] = await Promise.all([\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"state\" }),\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"proposer\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"asset\" }) as Promise<Address>,\n publicClient.readContract({ address: clone, abi: PORTFOLIO_STRATEGY_ABI, functionName: \"getAllocations\" }) as Promise<readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[]>,\n ]);\n\n // Check state\n if (Number(stateRaw) !== 1) { // State.Executed = 1\n const stateNames = [\"Pending\", \"Executed\", \"Settled\"];\n verifySpinner.fail(`Strategy is ${stateNames[Number(stateRaw)] || \"Unknown\"}, must be Executed to rebalance`);\n process.exit(1);\n }\n\n // Check proposer\n if (proposer.toLowerCase() !== account.address.toLowerCase()) {\n verifySpinner.fail(`Only the proposer (${proposer}) can rebalance. Your wallet: ${account.address}`);\n process.exit(1);\n }\n\n const [assetDecimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: assetAddr, abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n\n // Read current balances\n const tokenReads = allocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const tokenData = await Promise.all(tokenReads);\n\n verifySpinner.succeed(\"Strategy is Executed — ready to rebalance\");\n\n // Show current allocations\n console.log();\n console.log(chalk.bold(\"Current Allocations\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < allocations.length; i++) {\n const alloc = allocations[i];\n const [balance, symbol, decimals] = tokenData[i];\n const weightPct = (Number(alloc.targetWeightBps) / 100).toFixed(1) + \"%\";\n console.log(\n ` ${chalk.bold((symbol as string).padEnd(8))} ` +\n `${weightPct.padEnd(8)} ` +\n `bal: ${formatUnits(balance as bigint, decimals)}`,\n );\n }\n\n // Parse new weights if provided\n let newWeightsBps: number[] | undefined;\n if (opts.newWeights) {\n newWeightsBps = (opts.newWeights as string).split(\",\").map((w) => Number(w.trim()));\n if (newWeightsBps.length !== allocations.length) {\n console.error(chalk.red(`--new-weights must have ${allocations.length} values (one per token)`));\n process.exit(1);\n }\n const weightSum = newWeightsBps.reduce((a, b) => a + b, 0);\n if (weightSum !== 10000) {\n console.error(chalk.red(`Weights must sum to 10000, got ${weightSum}`));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"New Target Weights\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < allocations.length; i++) {\n const [, symbol] = tokenData[i];\n const oldPct = (Number(allocations[i].targetWeightBps) / 100).toFixed(1);\n const newPct = (newWeightsBps[i] / 100).toFixed(1);\n const arrow = oldPct !== newPct ? chalk.yellow(\"→\") : chalk.dim(\"→\");\n console.log(` ${chalk.bold((symbol as string).padEnd(8))} ${oldPct}% ${arrow} ${newPct}%`);\n }\n }\n\n if (opts.dryRun) {\n console.log();\n console.log(chalk.yellow(\"Dry run — no transactions sent.\"));\n console.log(chalk.dim(\"The rebalance would:\"));\n console.log(chalk.dim(\" 1. Sell all current token positions back to \" + assetSymbol));\n console.log(chalk.dim(\" 2. Re-buy at \" + (newWeightsBps ? \"new\" : \"current\") + \" target weights\"));\n console.log();\n return;\n }\n\n // 2. Update weights first (if specified)\n if (newWeightsBps) {\n const maxSlip = Number((opts.maxSlippage as string) || \"0\");\n const swapData = await publicClient.readContract({\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"getSwapExtraData\",\n }) as Hex[];\n\n const updateSpinner = ora(\"Updating target weights...\").start();\n try {\n const innerData = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [newWeightsBps.map((w: number) => BigInt(w)), BigInt(maxSlip), swapData],\n );\n\n const updateHash = await writeContractWithRetry({\n account,\n chain,\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"updateParams\",\n args: [innerData],\n });\n\n const receipt = await waitForReceipt(updateHash);\n if (receipt.status === \"reverted\") throw new Error(\"updateParams reverted\");\n updateSpinner.succeed(\"Target weights updated\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(updateHash)}`));\n } catch (err) {\n updateSpinner.fail(\"Failed to update weights\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n\n // 3. Execute rebalance\n const rebalanceSpinner = ora(\"Rebalancing portfolio (sell all → re-buy at targets)...\").start();\n try {\n const rebalanceHash = await writeContractWithRetry({\n account,\n chain,\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"rebalance\",\n });\n\n const receipt = await waitForReceipt(rebalanceHash);\n if (receipt.status === \"reverted\") throw new Error(\"rebalance() reverted on-chain\");\n rebalanceSpinner.succeed(\"Portfolio rebalanced\");\n console.log(chalk.dim(` Tx: ${getExplorerUrl(rebalanceHash)}`));\n } catch (err) {\n rebalanceSpinner.fail(\"Rebalance failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // 4. Show updated balances\n const postSpinner = ora(\"Reading updated allocations...\").start();\n const postAllocations = await publicClient.readContract({\n address: clone,\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"getAllocations\",\n }) as readonly { token: Address; targetWeightBps: bigint; tokenAmount: bigint; investedAmount: bigint }[];\n\n const postReads = postAllocations.map((a) => Promise.all([\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"balanceOf\", args: [clone] }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"symbol\" }),\n publicClient.readContract({ address: a.token, abi: erc20Abi, functionName: \"decimals\" }),\n ]));\n const postData = await Promise.all(postReads);\n postSpinner.succeed(\"Updated allocations\");\n\n console.log();\n console.log(chalk.bold(\"Post-Rebalance Allocations\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (let i = 0; i < postAllocations.length; i++) {\n const alloc = postAllocations[i];\n const [balance, symbol, decimals] = postData[i];\n const weightPct = (Number(alloc.targetWeightBps) / 100).toFixed(1) + \"%\";\n const investedStr = formatUnits(alloc.investedAmount, assetDecimals);\n console.log(\n ` ${chalk.bold((symbol as string).padEnd(8))} ` +\n `${weightPct.padEnd(8)} ` +\n `invested: ${investedStr.padEnd(14)} ` +\n `bal: ${formatUnits(balance as bigint, decimals)}`,\n );\n }\n\n console.log();\n console.log(chalk.green(\"✓ Rebalance complete\"));\n console.log();\n } catch (err: any) {\n if (err.code === \"ERR_MODULE_NOT_FOUND\" || err instanceof TypeError) throw err;\n verifySpinner.fail(\"Pre-flight check failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * ERC-1167 minimal proxy cloning from TypeScript.\n *\n * Mirrors OpenZeppelin's Clones.clone() — constructs the creation\n * bytecode for a minimal proxy and deploys via a raw transaction.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { concat } from \"viem\";\nimport { getPublicClient, getAccount, sendTxWithRetry, waitForReceipt } from \"./client.js\";\nimport { getChain } from \"./network.js\";\n\n/**\n * Deploy an ERC-1167 minimal proxy clone of a template contract.\n *\n * @param template - Address of the deployed template (implementation)\n * @returns The clone address and deployment tx hash\n */\nexport async function cloneTemplate(\n template: Address,\n): Promise<{ clone: Address; hash: Hex }> {\n // ERC-1167 creation code (matches OpenZeppelin Clones.sol):\n // Init code: 3d602d80600a3d3981f3\n // Runtime code: 363d3d373d3d3d363d73 <address> 5af43d82803e903d91602b57fd5bf3\n const creationCode = concat([\n \"0x3d602d80600a3d3981f3363d3d373d3d3d363d73\",\n template,\n \"0x5af43d82803e903d91602b57fd5bf3\",\n ]);\n\n const account = getAccount();\n const chain = getChain();\n\n const hash = await sendTxWithRetry({\n account,\n chain,\n data: creationCode as Hex,\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n\n if (!receipt.contractAddress) {\n throw new Error(`Clone deployment failed — no contract address in receipt (tx: ${hash})`);\n }\n\n return { clone: receipt.contractAddress, hash };\n}\n","/**\n * Types and helpers for batch call construction.\n *\n * Calls go directly to vault.executeBatch() — no separate executor contract.\n */\n\nimport type { Address, Hex } from \"viem\";\n\nexport interface BatchCall {\n target: Address;\n data: Hex;\n value: bigint;\n}\n\n/**\n * Format a batch for human-readable display (CLI output before simulation).\n */\nexport function formatBatch(calls: BatchCall[]): string {\n return calls\n .map((call, i) => {\n const selector = call.data.slice(0, 10);\n return ` ${i + 1}. ${call.target} :: ${selector}... (${call.value > 0n ? call.value + \" wei\" : \"no value\"})`;\n })\n .join(\"\\n\");\n}\n","/**\n * MoonwellSupplyStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mToken, uint256 supplyAmount, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mToken: Address,\n supplyAmount: bigint,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n [underlying, mToken, supplyAmount, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * VeniceInferenceStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address asset, address weth, address vvv, address sVVV,\n * address aeroRouter, address aeroFactory, address agent,\n * uint256 assetAmount, uint256 minVVV, uint256 deadlineOffset, bool singleHop\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface VeniceInferenceInitParams {\n asset: Address;\n weth: Address;\n vvv: Address;\n sVVV: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n agent: Address;\n assetAmount: bigint;\n minVVV: bigint;\n deadlineOffset: bigint;\n singleHop: boolean;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"asset\", type: \"address\" as const },\n { name: \"weth\", type: \"address\" as const },\n { name: \"vvv\", type: \"address\" as const },\n { name: \"sVVV\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"agent\", type: \"address\" as const },\n { name: \"assetAmount\", type: \"uint256\" as const },\n { name: \"minVVV\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n { name: \"singleHop\", type: \"bool\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: VeniceInferenceInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, assetAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * AerodromeLPStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address tokenA, address tokenB, bool stable,\n * address factory, address router, address gauge, address lpToken,\n * uint256 amountADesired, uint256 amountBDesired,\n * uint256 amountAMin, uint256 amountBMin,\n * uint256 minAmountAOut, uint256 minAmountBOut\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface AerodromeLPInitParams {\n tokenA: Address;\n tokenB: Address;\n stable: boolean;\n factory: Address;\n router: Address;\n gauge: Address;\n lpToken: Address;\n amountADesired: bigint;\n amountBDesired: bigint;\n amountAMin: bigint;\n amountBMin: bigint;\n minAmountAOut: bigint;\n minAmountBOut: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"tokenA\", type: \"address\" as const },\n { name: \"tokenB\", type: \"address\" as const },\n { name: \"stable\", type: \"bool\" as const },\n { name: \"factory\", type: \"address\" as const },\n { name: \"router\", type: \"address\" as const },\n { name: \"gauge\", type: \"address\" as const },\n { name: \"lpToken\", type: \"address\" as const },\n { name: \"amountADesired\", type: \"uint256\" as const },\n { name: \"amountBDesired\", type: \"uint256\" as const },\n { name: \"amountAMin\", type: \"uint256\" as const },\n { name: \"amountBMin\", type: \"uint256\" as const },\n { name: \"minAmountAOut\", type: \"uint256\" as const },\n { name: \"minAmountBOut\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: AerodromeLPInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n tokenA: Address,\n amountA: bigint,\n tokenB: Address,\n amountB: bigint,\n): BatchCall[] {\n return [\n {\n target: tokenA,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountA],\n }),\n value: 0n,\n },\n {\n target: tokenB,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountB],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * WstETHMoonwellStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address weth, address wsteth, address mwsteth,\n * address aeroRouter, address aeroFactory,\n * uint256 supplyAmount, uint256 minWstethOutPerWeth, uint256 minWethOutPerWsteth, uint256 deadlineOffset\n * supplyAmount = 0 means use the vault's full WETH balance at execute time\n * min*PerX are 1e18-scaled per-unit rates so slippage protection scales with amountIn.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface WstETHMoonwellInitParams {\n weth: Address;\n wsteth: Address;\n mwsteth: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n supplyAmount: bigint;\n minWstethOutPerWeth: bigint;\n minWethOutPerWsteth: bigint;\n deadlineOffset: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"weth\", type: \"address\" as const },\n { name: \"wsteth\", type: \"address\" as const },\n { name: \"mwsteth\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"supplyAmount\", type: \"uint256\" as const },\n { name: \"minWstethOutPerWeth\", type: \"uint256\" as const },\n { name: \"minWethOutPerWsteth\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: WstETHMoonwellInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n weth: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (supplyAmount == 0) we can't know the exact amount\n // at proposal-build time, so approve maxUint256 then revoke to 0 after\n // execute() in the same batch. This bounds the residual allowance to a\n // single atomic tx — any leftover approval is cleared before control\n // returns to the governor.\n const approveAmount = supplyAmount === 0n ? maxUint256 : supplyAmount;\n\n return [\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * MamoYieldStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mamoFactory, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mamoFactory: Address,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ],\n [underlying, mamoFactory, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n amount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}","/**\n * PortfolioStrategy call builder.\n *\n * InitParams (Solidity): (address asset, address swapAdapter, address chainlinkVerifier,\n * address[] tokens, uint256[] weightsBps, uint256 totalAmount, uint256 maxSlippageBps,\n * bytes[] swapExtraData)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface BasketAllocation {\n token: Address;\n weightBps: number; // e.g. 4000 = 40%\n swapExtraData: Hex; // adapter-specific (fee tier, path, etc.)\n}\n\nexport function buildInitData(\n asset: Address,\n swapAdapter: Address,\n chainlinkVerifier: Address,\n allocations: BasketAllocation[],\n totalAmount: bigint,\n maxSlippageBps: number,\n): Hex {\n const tokens = allocations.map((a) => a.token);\n const weightsBps = allocations.map((a) => BigInt(a.weightBps));\n const swapExtraData = allocations.map((a) => a.swapExtraData);\n\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"address\" },\n { type: \"address[]\" },\n { type: \"uint256[]\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"bytes[]\" },\n ],\n [\n asset,\n swapAdapter,\n chainlinkVerifier,\n tokens,\n weightsBps,\n totalAmount,\n BigInt(maxSlippageBps),\n swapExtraData,\n ],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n totalAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, totalAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildUpdateParamsCalls(\n clone: Address,\n newWeightsBps: number[],\n newMaxSlippageBps: number,\n newSwapExtraData: Hex[],\n): BatchCall[] {\n const data = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [\n newWeightsBps.map((w) => BigInt(w)),\n BigInt(newMaxSlippageBps),\n newSwapExtraData,\n ],\n );\n\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: [\n {\n type: \"function\",\n name: \"updateParams\",\n inputs: [{ type: \"bytes\", name: \"data\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n ],\n functionName: \"updateParams\",\n args: [data],\n }),\n value: 0n,\n },\n ];\n}\n\n// ── Rebalancing ──\n\nimport { PORTFOLIO_STRATEGY_ABI } from \"../lib/abis.js\";\n\n/**\n * Encode calldata for the simple `rebalance()` call.\n * This is called directly by the proposer (not via vault batch).\n */\nexport function encodeRebalanceCalldata(): Hex {\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"rebalance\",\n });\n}\n\n/**\n * Encode calldata for `updateParams()` to change weights before rebalancing.\n */\nexport function encodeUpdateWeightsCalldata(\n newWeightsBps: number[],\n newMaxSlippageBps: number,\n newSwapExtraData: Hex[],\n): Hex {\n const data = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [\n newWeightsBps.map((w) => BigInt(w)),\n BigInt(newMaxSlippageBps),\n newSwapExtraData,\n ],\n );\n\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"updateParams\",\n args: [data],\n });\n}\n","/**\n * HyperliquidPerpStrategy call builder.\n *\n * InitParams (Solidity): (address asset, uint256 depositAmount, uint256 minReturnAmount, uint32 perpAssetIndex, uint32 leverage, uint256 maxPositionSize, uint32 maxTradesPerDay)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI, HYPERLIQUID_PERP_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n asset: Address,\n depositAmount: bigint,\n minReturnAmount: bigint,\n perpAssetIndex: number,\n leverage: number,\n maxPositionSize: bigint,\n maxTradesPerDay: number,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n { type: \"uint32\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n ],\n [asset, depositAmount, minReturnAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n amount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (amount == 0) we approve maxUint256 up front and\n // revoke to 0 after execute() in the same atomic batch — the residual\n // allowance never persists beyond the tx.\n const approveAmount = amount === 0n ? maxUint256 : amount;\n\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\n/** Phase 2: sweep USDC back to vault after async HyperCore transfer completes. */\nexport function buildSweepToVaultCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: HYPERLIQUID_PERP_STRATEGY_ABI,\n functionName: \"sweepToVault\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * Subgraph query wrapper for syndicate discovery.\n *\n * Queries The Graph's hosted/studio subgraph for indexed\n * factory + vault events. Much faster than on-chain iteration.\n *\n * Requires SUBGRAPH_URL env var pointing to the subgraph's\n * query endpoint (from The Graph Studio).\n */\n\nexport interface SubgraphSyndicate {\n id: string;\n vault: string;\n creator: string;\n metadataURI: string;\n createdAt: string;\n active: boolean;\n totalDeposits: string;\n totalWithdrawals: string;\n}\n\nexport interface SubgraphAgent {\n id: string;\n agentAddress: string;\n active: boolean;\n registeredAt: string;\n totalBatches: string;\n totalAssetAmount: string;\n}\n\nexport interface SubgraphDeposit {\n id: string;\n sender: string;\n owner: string;\n assets: string;\n shares: string;\n timestamp: string;\n txHash: string;\n}\n\nexport interface SyndicateDetails extends SubgraphSyndicate {\n agents: SubgraphAgent[];\n deposits: SubgraphDeposit[];\n}\n\nfunction getSubgraphUrl(): string {\n const url = process.env.SUBGRAPH_URL;\n if (!url) {\n throw new Error(\n \"SUBGRAPH_URL env var is required. Set it to your The Graph Studio query endpoint.\",\n );\n }\n return url;\n}\n\nasync function query<T>(graphql: string, variables?: Record<string, unknown>): Promise<T> {\n const url = getSubgraphUrl();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query: graphql, variables }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Subgraph query failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { data?: T; errors?: { message: string }[] };\n\n if (result.errors?.length) {\n throw new Error(`Subgraph query error: ${result.errors.map((e) => e.message).join(\", \")}`);\n }\n\n if (!result.data) {\n throw new Error(\"Subgraph returned no data\");\n }\n\n return result.data;\n}\n\n/**\n * Get all active syndicates, optionally filtered by creator.\n */\nexport async function getActiveSyndicates(\n creator?: string,\n): Promise<SubgraphSyndicate[]> {\n if (creator) {\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(\n `query($creator: String!) {\n syndicates(where: { active: true, creator: $creator }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }`,\n { creator: creator.toLowerCase() },\n );\n return data.syndicates;\n }\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(where: { active: true }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }\n `);\n\n return data.syndicates;\n}\n\n/**\n * Get detailed syndicate info including agents, recent deposits, and batch executions.\n */\nexport async function getSyndicateDetails(\n syndicateId: string,\n): Promise<SyndicateDetails | null> {\n const data = await query<{ syndicate: SyndicateDetails | null }>(\n `query($id: ID!) {\n syndicate(id: $id) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n agentAddress\n active\n registeredAt\n totalBatches\n totalAssetAmount\n }\n deposits(first: 10, orderBy: timestamp, orderDirection: desc) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n }`,\n { id: syndicateId },\n );\n\n return data.syndicate;\n}\n\n/**\n * Get deposit/withdrawal history for a specific depositor across all syndicates.\n */\nexport async function getDepositorHistory(\n depositorAddress: string,\n): Promise<{ deposits: SubgraphDeposit[]; withdrawals: SubgraphDeposit[] }> {\n const addr = depositorAddress.toLowerCase();\n\n const data = await query<{\n deposits: SubgraphDeposit[];\n withdrawals: SubgraphDeposit[];\n }>(\n `query($owner: String!) {\n deposits(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n withdrawals: withdrawals(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }`,\n { owner: addr },\n );\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * Venice commands — sherwood venice <subcommand>\n *\n * Manages Venice private inference: provision API keys, check status,\n * list models, run inference.\n *\n * Venice funding uses the VeniceInferenceStrategy template via the\n * proposal flow (sherwood proposal create).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { formatUnits, isAddress, parseUnits } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt, formatContractError } from \"../lib/client.js\";\nimport { getChain } from \"../lib/network.js\";\nimport { VENICE } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, VENICE_STAKING_ABI } from \"../lib/abis.js\";\nimport { provisionApiKey, checkApiKeyValid, chatCompletion, listModels } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.js\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function registerVeniceCommands(program: Command): void {\n const venice = program.command(\"venice\").description(\"Venice private inference — provision API keys, run inference\");\n\n // ── venice provision ──\n\n venice\n .command(\"provision\")\n .description(\"Self-provision a Venice API key (requires sVVV in wallet)\")\n .action(async () => {\n const account = getAccount();\n const client = getPublicClient();\n\n // Check sVVV balance\n const checkSpinner = ora(\"Checking sVVV balance...\").start();\n try {\n const sVvvBalance = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (sVvvBalance === 0n) {\n checkSpinner.fail(\"No sVVV found in wallet\");\n console.log(chalk.yellow(\" Your wallet must hold staked VVV (sVVV) to provision a Venice API key.\"));\n console.log(chalk.yellow(\" Use the VeniceInferenceStrategy via a proposal to distribute sVVV to agents.\"));\n process.exit(1);\n }\n\n checkSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n } catch (err) {\n checkSpinner.fail(\"Failed to check sVVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Provision API key\n const keySpinner = ora(\"Provisioning Venice API key...\").start();\n try {\n const apiKey = await provisionApiKey();\n keySpinner.succeed(\"Venice API key provisioned\");\n console.log(chalk.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));\n console.log(chalk.dim(\" Saved to ~/.sherwood/config.json\"));\n\n // Create EAS attestation\n try {\n const { createVeniceProvisionAttestation, getEasScanUrl } = await import(\"../lib/eas.js\");\n const { uid } = await createVeniceProvisionAttestation(account.address);\n if (uid !== \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n console.log(chalk.dim(` Attested: ${getEasScanUrl(uid)}`));\n }\n } catch {\n // Attestation is best-effort\n }\n } catch (err) {\n keySpinner.fail(\"Failed to provision API key\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice stake ──\n\n venice\n .command(\"stake\")\n .description(\"Stake VVV tokens to receive sVVV (required for API key provisioning)\")\n .requiredOption(\"--amount <n>\", \"Amount of VVV to stake (human-readable, e.g. 13)\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const chain = getChain();\n const veniceAddrs = VENICE();\n const amount = parseUnits(opts.amount, 18);\n\n // Check VVV balance\n const balSpinner = ora(\"Checking VVV balance...\").start();\n try {\n const vvvBalance = await client.readContract({\n address: veniceAddrs.VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (vvvBalance < amount) {\n balSpinner.fail(`Insufficient VVV: have ${formatUnits(vvvBalance, 18)}, need ${opts.amount}`);\n process.exit(1);\n }\n balSpinner.succeed(`VVV balance: ${formatUnits(vvvBalance, 18)}`);\n } catch (err) {\n balSpinner.fail(\"Failed to check VVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Approve VVV spend\n const approveSpinner = ora(\"Approving VVV for staking contract...\").start();\n try {\n const approveHash = await writeContractWithRetry({\n account,\n chain,\n address: veniceAddrs.VVV,\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [veniceAddrs.STAKING, amount],\n });\n await waitForReceipt(approveHash);\n approveSpinner.succeed(\"VVV approved\");\n } catch (err) {\n approveSpinner.fail(\"Approve failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n // Stake VVV → sVVV\n const stakeSpinner = ora(`Staking ${opts.amount} VVV...`).start();\n try {\n const stakeHash = await writeContractWithRetry({\n account,\n chain,\n address: veniceAddrs.STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"stake\",\n args: [account.address, amount],\n });\n await waitForReceipt(stakeHash);\n\n // Read new sVVV balance\n const sVvvBalance = await client.readContract({\n address: veniceAddrs.STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n stakeSpinner.succeed(`Staked ${opts.amount} VVV → ${formatUnits(sVvvBalance, 18)} sVVV`);\n console.log(chalk.dim(\" You can now run: sherwood venice provision\"));\n } catch (err) {\n stakeSpinner.fail(\"Stake failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice mint-diem ──\n\n venice\n .command(\"mint-diem\")\n .description(\"Lock sVVV to mint DIEM (Venice inference credits; ~1d cooldown)\")\n .requiredOption(\"--amount <n>\", \"Amount of sVVV to lock (human-readable, 18 decimals)\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (default 500 = 5%)\", \"500\")\n .option(\"--yes\", \"Skip the cooldown confirmation prompt\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const chain = getChain();\n const { STAKING, DIEM } = VENICE();\n\n const amount = parseUnits(opts.amount, 18);\n const slippageBps = BigInt(opts.slippage ?? \"500\");\n if (slippageBps < 0n || slippageBps > 10000n) {\n console.error(chalk.red(`Invalid slippage bps: ${opts.slippage} (must be 0–10000)`));\n process.exit(1);\n }\n\n // 1. Check sVVV balance\n const balSpinner = ora(\"Checking sVVV balance...\").start();\n let sVvvBalance: bigint;\n try {\n sVvvBalance = await client.readContract({\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n } catch (err) {\n balSpinner.fail(\"Failed to read sVVV balance\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n if (sVvvBalance < amount) {\n balSpinner.fail(\n `Insufficient sVVV: have ${formatUnits(sVvvBalance, 18)}, need ${opts.amount}`,\n );\n console.log(chalk.yellow(\" Stake VVV first (see VeniceInferenceStrategy proposal flow).\"));\n process.exit(1);\n }\n balSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n\n // 2. Quote DIEM out\n const quoteSpinner = ora(\"Quoting DIEM output...\").start();\n let expected: bigint;\n try {\n expected = await client.readContract({\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"getDiemAmountOut\",\n args: [amount],\n }) as bigint;\n } catch (err) {\n quoteSpinner.fail(\"Failed to quote DIEM output\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n if (expected === 0n) {\n quoteSpinner.fail(\"Quote returned 0 DIEM — refusing to mint\");\n process.exit(1);\n }\n const minOut = (expected * (10000n - slippageBps)) / 10000n;\n quoteSpinner.succeed(\n `Expected: ${formatUnits(expected, 18)} DIEM (minOut @ ${slippageBps}bps: ${formatUnits(minOut, 18)})`,\n );\n\n // 3. Spendability check — Venice requires >= 0.1 DIEM minimum before any\n // DIEM credit becomes spendable on inference calls. Warn the agent\n // upfront so they can size up sVVV (or switch to x402) before locking.\n const MIN_SPENDABLE_DIEM = parseUnits(\"0.1\", 18);\n let currentDiem = 0n;\n try {\n currentDiem = await client.readContract({\n address: DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n } catch {\n // best-effort\n }\n const projectedDiem = currentDiem + expected;\n if (projectedDiem < MIN_SPENDABLE_DIEM) {\n const shortfall = MIN_SPENDABLE_DIEM - projectedDiem;\n // Linear extrapolation: scale up amount by the ratio shortfall/expected\n const sVvvNeeded = (amount * shortfall + expected - 1n) / expected; // ceil-div\n console.log();\n console.log(chalk.red(\" ⚠ Venice requires ≥ 0.1 DIEM minimum before ANY DIEM credit\"));\n console.log(chalk.red(\" becomes spendable on inference calls.\"));\n console.log(chalk.red(` Projected DIEM after mint: ${formatUnits(projectedDiem, 18)} (short by ${formatUnits(shortfall, 18)})`));\n console.log(chalk.red(` Approx additional sVVV needed: ${formatUnits(sVvvNeeded, 18)}`));\n console.log(chalk.dim(\" Below threshold, this DIEM sits idle — consider acquiring\"));\n console.log(chalk.dim(\" more sVVV first, or use x402 USDC pay-per-request.\"));\n }\n\n // 4. Lockup warning + confirmation\n console.log();\n console.log(chalk.yellow(\" ⚠ Locked sVVV cannot be unstaked directly. To recover it you must\"));\n console.log(chalk.yellow(\" first call `staking.burnDiem(amount)` (burns DIEM, unlocks sVVV\"));\n console.log(chalk.yellow(\" at your average mint rate), then `initiateUnstake` + wait the\"));\n console.log(chalk.yellow(\" 7-day staking cooldown, then `finalizeUnstake`.\"));\n console.log(chalk.dim(\" x402 alternative (pay-per-request in USDC, no DIEM lock):\"));\n console.log(chalk.dim(\" https://docs.venice.ai/overview/guides/generating-api-key-agent#paying-for-inference\"));\n console.log();\n\n if (!opts.yes) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = (await rl.question(` Lock ${opts.amount} sVVV for DIEM credits? [y/N] `)).trim().toLowerCase();\n if (answer !== \"y\" && answer !== \"yes\") {\n console.log(chalk.dim(\" Aborted.\"));\n process.exit(0);\n }\n } finally {\n rl.close();\n }\n }\n\n // 5. Mint DIEM (reuses `currentDiem` read in step 3 as the pre-balance)\n const diemBefore = currentDiem;\n const mintSpinner = ora(`Minting DIEM from ${opts.amount} sVVV...`).start();\n try {\n const hash = await writeContractWithRetry({\n account,\n chain,\n address: STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"mintDiem\",\n args: [amount, minOut],\n });\n await waitForReceipt(hash);\n\n const diemAfter = await client.readContract({\n address: DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n const delta = diemAfter - diemBefore;\n\n mintSpinner.succeed(\n `Minted ${formatUnits(delta > 0n ? delta : diemAfter, 18)} DIEM` +\n (delta > 0n ? ` (balance: ${formatUnits(diemAfter, 18)})` : \"\"),\n );\n console.log(chalk.dim(` Tx: ${hash}`));\n console.log(chalk.yellow(\" Note: Venice requires ≥ 0.1 DIEM to spend ANY DIEM credit, and\"));\n console.log(chalk.yellow(\" refreshes daily allocation at 00:00 UTC. Below threshold,\"));\n console.log(chalk.yellow(\" inference will continue to 402.\"));\n console.log(chalk.dim(\" Once over threshold: sherwood venice infer --model <id> --prompt \\\"...\\\"\"));\n } catch (err) {\n mintSpinner.fail(\"mintDiem failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice status ──\n\n venice\n .command(\"status\")\n .description(\"Show Venice inference status: sVVV balances, DIEM, API key\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const account = getAccount();\n const spinner = ora(\"Loading Venice status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read VVV balance on vault\n const vaultVvvBalance = await client.readContract({\n address: VENICE().VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vaultAddress],\n }) as bigint;\n\n // Read per-agent sVVV balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n // Check current agent's sVVV + pending rewards + DIEM\n const [mySvvv, myPending, myDiem] = await Promise.all([\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"pendingRewards\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().DIEM,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n ]);\n\n // Check API key\n const apiKeyValid = await checkApiKeyValid();\n const apiKey = getVeniceApiKey();\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n console.log();\n console.log(chalk.bold(\"Venice Inference Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Profit available: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` VVV (unstaked): ${formatUnits(vaultVvvBalance, 18)}`);\n\n console.log(chalk.bold(\"\\n Agent sVVV Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 18)} sVVV`);\n }\n\n console.log(chalk.bold(\"\\n Your Wallet\"));\n console.log(` sVVV: ${formatUnits(mySvvv, 18)}`);\n console.log(` Pending rewards: ${formatUnits(myPending, 18)} VVV`);\n console.log(` DIEM (credits): ${formatUnits(myDiem, 18)}`);\n console.log(chalk.dim(\" (mint via `sherwood venice mint-diem --amount <sVVV>`)\"));\n\n console.log(chalk.bold(\"\\n Venice API\"));\n console.log(` Key: ${apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : chalk.dim(\"not provisioned\")}`);\n console.log(` Status: ${apiKeyValid ? chalk.green(\"valid\") : chalk.red(\"invalid/missing\")}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice models ──\n\n venice\n .command(\"models\")\n .description(\"List available Venice inference models\")\n .action(async () => {\n const spinner = ora(\"Fetching Venice models...\").start();\n try {\n const models = await listModels();\n spinner.succeed(`${models.length} models available`);\n console.log();\n for (const model of models) {\n console.log(` ${model}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to list models\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── venice infer ──\n\n venice\n .command(\"infer\")\n .description(\"Run private inference via Venice chat completions\")\n .requiredOption(\"--prompt <text>\", \"User prompt\")\n .requiredOption(\"--model <id>\", \"Venice model ID (use 'venice models' to list)\")\n .option(\"--system <text>\", \"System prompt\")\n .option(\"--data <path>\", \"Path to data file — contents prepended to prompt as context\")\n .option(\"--web-search\", \"Enable Venice web search\", false)\n .option(\"--no-thinking\", \"Disable chain-of-thought reasoning\")\n .option(\"--temperature <n>\", \"Sampling temperature (0-2)\")\n .option(\"--max-tokens <n>\", \"Maximum completion tokens\")\n .option(\"--json\", \"Output raw JSON response\", false)\n .option(\"--vault <address>\", \"Vault address — attestation recipient (defaults to config vault)\")\n .action(async (opts) => {\n // Build messages\n const messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[] = [];\n\n if (opts.system) {\n messages.push({ role: \"system\", content: opts.system });\n }\n\n let userContent = opts.prompt;\n if (opts.data) {\n try {\n const data = readFileSync(opts.data, \"utf-8\");\n userContent = `Context data:\\n\\`\\`\\`\\n${data}\\n\\`\\`\\`\\n\\n${opts.prompt}`;\n } catch (err) {\n console.error(chalk.red(`Failed to read data file: ${opts.data}`));\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n messages.push({ role: \"user\", content: userContent });\n\n const spinner = ora(`Running inference (${opts.model})...`).start();\n try {\n const result = await chatCompletion({\n model: opts.model,\n messages,\n temperature: opts.temperature !== undefined ? Number(opts.temperature) : undefined,\n maxTokens: opts.maxTokens !== undefined ? Number(opts.maxTokens) : undefined,\n enableWebSearch: opts.webSearch,\n disableThinking: opts.thinking === false,\n });\n\n spinner.succeed(\"Inference complete\");\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log();\n console.log(result.content);\n console.log();\n console.log(chalk.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));\n }\n\n // Create EAS attestation (best-effort)\n try {\n const { createVeniceInferenceAttestation, getEasScanUrl } = await import(\"../lib/eas.js\");\n const { keccak256, toHex, isAddress: isAddr } = await import(\"viem\");\n const { getChainContracts } = await import(\"../lib/config.js\");\n const { getChain: getActiveChain } = await import(\"../lib/network.js\");\n const vaultRecipient = (opts.vault && isAddr(opts.vault)) ? opts.vault : getChainContracts(getActiveChain().id).vault;\n const promptHash = keccak256(toHex(userContent)).slice(0, 18); // short hash\n const { uid } = await createVeniceInferenceAttestation(\n result.model,\n result.usage.promptTokens,\n result.usage.completionTokens,\n promptHash,\n vaultRecipient as `0x${string}` | undefined,\n );\n if (uid !== \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n console.log(chalk.dim(`Attested: ${getEasScanUrl(uid)}`));\n }\n } catch {\n // Attestation is best-effort\n }\n } catch (err) {\n spinner.fail(\"Inference failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Allowance commands — sherwood allowance <subcommand>\n *\n * Disburses vault profits as USDC to agent operator wallets for\n * operational expenses (gas, x402 API payments, etc.).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI } from \"../lib/abis.js\";\nimport { getQuote, getMultiHopQuote, encodeSwapPath, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch } from \"../lib/vault.js\";\nimport { buildDisburseBatch, type AllowanceDisbursConfig } from \"../strategies/allowance-disburse.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport function registerAllowanceCommands(program: Command): void {\n const allowance = program.command(\"allowance\").description(\"Disburse vault profits to agent wallets\");\n\n // ── allowance disburse ──\n\n allowance\n .command(\"disburse\")\n .description(\"Swap vault profits → USDC → distribute to all agent operator wallets\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .requiredOption(\"--amount <amount>\", \"Deposit token amount to convert & distribute (e.g. 500)\")\n .option(\"--fee <tier>\", \"Fee tier for asset → USDC swap (500, 3000, 10000)\", \"3000\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const fee = Number(opts.fee);\n if (!VALID_FEES.includes(fee as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n const slippageBps = Number(opts.slippage);\n\n const client = getPublicClient();\n\n // ── Read vault state ──\n\n const spinner = ora(\"Reading vault state...\").start();\n let assetAddress: Address;\n let assetDecimals: number;\n let assetSymbol: string;\n let totalDeposited: bigint;\n let assetBalance: bigint;\n let agents: Address[];\n\n try {\n [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Failed to read vault state\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n\n if (agents.length === 0) {\n console.error(chalk.red(\"No agents registered in vault. Register agents first.\"));\n process.exit(1);\n }\n\n const requestedAmount = parseUnits(opts.amount, assetDecimals);\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n // ── Display config ──\n\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n\n console.log();\n console.log(chalk.bold(\"Allowance Disburse\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Asset: ${assetSymbol} (${assetDecimals} decimals)`);\n console.log(` Amount: ${opts.amount} ${assetSymbol}`);\n console.log(` Vault balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` Agents: ${agents.length} (USDC will be split equally)`);\n if (!isUsdc) {\n console.log(` Routing: ${isWeth ? `WETH → USDC (fee ${fee})` : `${assetSymbol} → WETH → USDC (fee ${fee})`}`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n }\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n if (requestedAmount > profit) {\n console.warn(chalk.yellow(` Warning: amount (${opts.amount}) exceeds available profit (${formatUnits(profit, assetDecimals)})`));\n console.warn(chalk.yellow(\" This will use deposited capital, not just profits.\"));\n console.log();\n }\n\n // ── Get USDC amount (quote or direct) ──\n\n let minUsdc: bigint;\n let swapPath: `0x${string}` | null = null;\n\n if (isUsdc) {\n // No swap needed — distribute the asset directly\n minUsdc = requestedAmount;\n } else {\n const quoteSpinner = ora(\"Fetching Uniswap quote...\").start();\n try {\n let amountOut: bigint;\n\n if (isWeth) {\n // Single-hop: WETH → USDC\n const quote = await getQuote({\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n amountIn: requestedAmount,\n fee,\n });\n amountOut = quote.amountOut;\n } else {\n // Multi-hop: asset → WETH → USDC\n swapPath = encodeSwapPath(\n [assetAddress, TOKENS().WETH, TOKENS().USDC],\n [fee, 500], // WETH→USDC typically uses 500 (0.05%) fee tier\n );\n const quote = await getMultiHopQuote({\n path: swapPath,\n amountIn: requestedAmount,\n });\n amountOut = quote.amountOut;\n }\n\n minUsdc = applySlippage(amountOut, slippageBps);\n\n quoteSpinner.succeed(\n `Quote: ${formatUnits(amountOut, 6)} USDC ` +\n `(min: ${formatUnits(minUsdc, 6)}, per agent: ${formatUnits(minUsdc / BigInt(agents.length), 6)})`\n );\n } catch (err) {\n quoteSpinner.fail(\"Failed to fetch quote\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n }\n\n // ── Per-agent display ──\n\n const perAgent = minUsdc / BigInt(agents.length);\n if (isUsdc) {\n console.log(chalk.dim(` Per agent: ${formatUnits(perAgent, 6)} USDC`));\n console.log();\n }\n\n // ── Build batch ──\n\n const config: AllowanceDisbursConfig = {\n amount: opts.amount,\n fee,\n slippageBps,\n };\n\n const calls = buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath);\n\n console.log();\n console.log(chalk.bold(`Batch calls (${calls.length}):`));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Execute ──\n\n if (!opts.execute) {\n console.log();\n console.log(chalk.yellow(\"Dry run complete. Add --execute to submit on-chain.\"));\n return;\n }\n\n const execSpinner = ora(\"Executing batch via vault...\").start();\n try {\n const txHash = await executeBatch(calls);\n execSpinner.succeed(`Batch executed: ${txHash}`);\n console.log(chalk.dim(` ${getExplorerUrl(txHash)}`));\n } catch (err) {\n execSpinner.fail(\"Execution failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── allowance status ──\n\n allowance\n .command(\"status\")\n .description(\"Show vault profit and agent USDC balances\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const spinner = ora(\"Loading allowance status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read per-agent USDC balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n const account = getAccount();\n\n console.log();\n console.log(chalk.bold(\"Allowance Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Asset: ${assetSymbol}`);\n console.log(` Balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n\n console.log(chalk.bold(\"\\n Agent USDC Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 6)} USDC`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Allowance Disburse Strategy — swap vault profits to USDC and distribute to agents.\n *\n * If the vault's deposit token is already USDC, transfers directly to each agent.\n * Otherwise, swaps asset → USDC via Uniswap V3 (single-hop or multi-hop via WETH),\n * then distributes USDC equally to each agent's operator wallet.\n *\n * Agents use USDC for operational expenses: gas, x402 API payments, etc.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseUnits } from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { TOKENS, UNISWAP } from \"../lib/addresses.js\";\nimport {\n ERC20_ABI,\n SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n SWAP_ROUTER_ABI as SWAP_ROUTER_EXACT_INPUT_ABI,\n} from \"../lib/abis.js\";\n\n// ── Strategy Config ──\n\nexport interface AllowanceDisbursConfig {\n /** Deposit token amount to convert & distribute (human-readable, e.g. \"500\") */\n amount: string;\n /** Fee tier for asset → USDC swap (ignored if asset = USDC) */\n fee: number;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n}\n\n// ── Batch Builder ──\n\n/**\n * Build the allowance disburse batch.\n *\n * @param config - Strategy parameters\n * @param vaultAddress - Vault contract address (delegatecall identity)\n * @param agents - Agent operator EOA addresses to receive USDC\n * @param assetAddress - Vault's deposit token address\n * @param assetDecimals - Deposit token decimals\n * @param minUsdc - Minimum USDC output (post-slippage), or raw amount if asset IS USDC\n * @param swapPath - Encoded Uniswap V3 path for multi-hop (null if single-hop or no swap)\n */\nexport function buildDisburseBatch(\n config: AllowanceDisbursConfig,\n vaultAddress: Address,\n agents: Address[],\n assetAddress: Address,\n assetDecimals: number,\n minUsdc: bigint,\n swapPath: Hex | null,\n): BatchCall[] {\n const assetAmount = parseUnits(config.amount, assetDecimals);\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n const calls: BatchCall[] = [];\n\n if (!isUsdc) {\n // 1. Approve SwapRouter to spend vault asset\n calls.push({\n target: assetAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, assetAmount],\n }),\n value: 0n,\n });\n\n // 2. Swap asset → USDC\n if (isWeth) {\n // Single-hop: WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n });\n } else {\n // Multi-hop: asset → WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_ABI,\n functionName: \"exactInput\",\n args: [\n {\n path: swapPath!,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n },\n ],\n }),\n value: 0n,\n });\n }\n }\n\n // 3. Transfer USDC to each agent equally\n const perAgent = minUsdc / BigInt(agents.length);\n for (const agent of agents) {\n calls.push({\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [agent, perAgent],\n }),\n value: 0n,\n });\n }\n\n return calls;\n}\n","/**\n * Identity commands — sherwood identity <subcommand>\n *\n * Wraps the Agent0 SDK (@agent0-sdk) for ERC-8004 agent identity management.\n * Handles: mint (register), set metadata, check status, load existing agent.\n * Required before creating or joining syndicates.\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SDK } from \"agent0-sdk\";\nimport { getPublicClient, getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl, getChain, getRpcUrl } from \"../lib/network.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport { setAgentId, getAgentId, loadConfig } from \"../lib/config.js\";\n\n// ── ABI (minimal, for status reads without SDK) ──\n\nconst IDENTITY_REGISTRY_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n] as const;\n\n/**\n * Initialize the Agent0 SDK with the current network config.\n */\nfunction getAgent0SDK(): SDK {\n // Read key from config first, env var as fallback\n const config = loadConfig();\n const key = config.privateKey || process.env.PRIVATE_KEY;\n if (!key) {\n throw new Error(\n \"Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var.\",\n );\n }\n\n return new SDK({\n chainId: getChain().id,\n rpcUrl: getRpcUrl(),\n privateKey: key.startsWith(\"0x\") ? key : `0x${key}`,\n });\n}\n\nexport function registerIdentityCommands(program: Command): void {\n const identity = program.command(\"identity\").description(\"Manage ERC-8004 agent identity (via Agent0 SDK)\");\n\n // ── identity mint ──\n\n identity\n .command(\"mint\")\n .description(\"Register a new ERC-8004 agent identity (required before creating/joining syndicates)\")\n .requiredOption(\"--name <name>\", \"Agent name (e.g. 'Alpha Seeker Agent')\")\n .option(\"--description <desc>\", \"Agent description\", \"Sherwood syndicate agent\")\n .option(\"--image <uri>\", \"Agent image URI (IPFS recommended)\")\n .action(async (opts) => {\n const account = getAccount();\n\n // Check if wallet already has an identity\n const existingId = getAgentId();\n if (existingId) {\n console.log(chalk.yellow(`You already have an agent identity saved: #${existingId}`));\n console.log(chalk.dim(\" Minting a new one anyway. The old ID is not affected.\"));\n console.log();\n }\n\n const spinner = ora(\"Initializing Agent0 SDK...\").start();\n try {\n const sdk = getAgent0SDK();\n\n // Create agent with metadata\n spinner.text = \"Creating agent profile...\";\n const agent = sdk.createAgent(opts.name, opts.description, opts.image);\n\n // Register on-chain (mints ERC-8004 NFT)\n spinner.text = \"Registering on-chain (minting ERC-8004 identity)...\";\n const txHandle = await agent.registerOnChain();\n\n spinner.text = \"Waiting for confirmation...\";\n await txHandle.waitMined();\n\n const agentId = agent.agentId;\n if (!agentId) {\n spinner.warn(\"Identity registered but could not read agentId\");\n console.log(chalk.dim(\" Check the transaction on the explorer.\"));\n return;\n }\n\n // Agent0 agentId format is \"chainId:tokenId\" — extract the token ID\n const tokenId = Number(agentId.includes(\":\") ? agentId.split(\":\")[1] : agentId);\n\n // Save to config\n setAgentId(tokenId);\n\n spinner.succeed(`Agent identity registered: #${tokenId}`);\n console.log(chalk.dim(` Agent0 ID: ${agentId}`));\n console.log(chalk.dim(` Name: ${opts.name}`));\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n console.log();\n console.log(chalk.green(\"You can now create syndicates:\"));\n console.log(chalk.dim(` sherwood syndicate create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to register identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity load ──\n\n identity\n .command(\"load\")\n .description(\"Load an existing ERC-8004 agent identity into your config\")\n .requiredOption(\"--id <tokenId>\", \"Agent token ID to load\")\n .action(async (opts) => {\n const account = getAccount();\n const client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const tokenId = Number(opts.id);\n\n const spinner = ora(`Verifying ownership of agent #${tokenId}...`).start();\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\n }) as Address;\n\n if (owner.toLowerCase() !== account.address.toLowerCase()) {\n spinner.fail(`Agent #${tokenId} is owned by ${owner}, not your wallet`);\n process.exit(1);\n }\n\n setAgentId(tokenId);\n spinner.succeed(`Agent #${tokenId} loaded and saved to config`);\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n } catch (err) {\n spinner.fail(\"Failed to load identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity find ──\n\n identity\n .command(\"find\")\n .description(\"Search ERC-8004 agents by wallet address or name (recover a lost agent ID)\")\n .option(\"--wallet <address>\", \"Filter by owner / wallet address\")\n .option(\"--name <text>\", \"Filter by agent name (exact or substring match, depending on registry)\")\n .option(\"--all-chains\", \"Search across all chains, not just the active one\")\n .action(async (opts) => {\n if (!opts.wallet && !opts.name) {\n console.error(chalk.red(\"Pass --wallet <address> or --name <text> (or both).\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Searching ERC-8004 registry...\").start();\n try {\n const sdk = getAgent0SDK();\n const filters: Record<string, unknown> = {};\n if (opts.wallet) filters.walletAddress = opts.wallet;\n if (opts.name) filters.name = opts.name;\n // SearchFilters['chains']: explicit list per-chain or 'all'\n filters.chains = opts.allChains ? \"all\" : [getChain().id];\n\n const results = await sdk.searchAgents(filters);\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.dim(\"No agents found matching those filters.\"));\n console.log(chalk.dim(\"If you minted on a different chain, retry with --all-chains.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Found ${results.length} agent${results.length === 1 ? \"\" : \"s\"}`));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (const a of results) {\n // Agent0 agentId format is \"chainId:tokenId\" — split for display\n const idStr = String(a.agentId);\n const tokenId = idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr;\n console.log(` ${chalk.bold(`#${tokenId}`)} ${a.name || chalk.dim(\"(no name)\")}`);\n console.log(chalk.dim(` Chain: ${a.chainId}`));\n console.log(chalk.dim(` Full: ${idStr}`));\n if (a.owners?.length) {\n console.log(chalk.dim(` Owner: ${a.owners[0]}`));\n }\n if (a.walletAddress) {\n console.log(chalk.dim(` Wallet: ${a.walletAddress}`));\n }\n }\n console.log();\n console.log(chalk.green(\"To bind one of these to this machine:\"));\n console.log(chalk.dim(` sherwood identity load --id <tokenId>`));\n } catch (err) {\n spinner.fail(\"Search failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity status ──\n\n identity\n .command(\"status\")\n .description(\"Show your agent identity status\")\n .action(async () => {\n const account = getAccount();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const client = getPublicClient();\n\n const spinner = ora(\"Checking identity...\").start();\n try {\n const balance = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n spinner.stop();\n\n const savedId = getAgentId();\n\n console.log();\n console.log(chalk.bold(\"Agent Identity (ERC-8004)\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Wallet: ${account.address}`);\n console.log(` Registry: ${registry}`);\n console.log(` NFTs owned: ${balance.toString()}`);\n\n if (savedId) {\n // Verify the saved ID is still owned by this wallet\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(savedId)],\n }) as Address;\n\n const isOwner = owner.toLowerCase() === account.address.toLowerCase();\n console.log(` Saved ID: #${savedId} ${isOwner ? chalk.green(\"(verified)\") : chalk.red(\"(owned by \" + owner + \")\")}`);\n\n // Load full agent details via SDK if verified\n if (isOwner) {\n try {\n const sdk = getAgent0SDK();\n const agent = await sdk.loadAgent(`${getChain().id}:${savedId}`);\n if (agent.name) console.log(` Name: ${agent.name}`);\n if (agent.description) console.log(` Desc: ${chalk.dim(agent.description)}`);\n if (agent.walletAddress) console.log(` Wallet: ${agent.walletAddress}`);\n } catch {\n // SDK load failed — not critical, basic info already shown\n }\n }\n } catch {\n console.log(` Saved ID: #${savedId} ${chalk.red(\"(token not found)\")}`);\n }\n } else {\n console.log(` Saved ID: ${chalk.dim(\"none — run 'sherwood identity mint --name <name>'\")}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to check identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Proposal commands — sherwood proposal <subcommand>\n *\n * Manages the full proposal lifecycle: create, list, show, vote,\n * execute, settle, cancel, simulate.\n */\n\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress, encodeFunctionData } from \"viem\";\nimport { getVaultOwner, getAssetAddress } from \"../lib/vault.js\";\nimport { ERC20_ABI } from \"../lib/abis.js\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFileSync } from \"node:fs\";\nimport { getAccount, formatContractError } from \"../lib/client.js\";\nimport { getExplorerUrl, getNetwork } from \"../lib/network.js\";\nimport { uploadMetadata } from \"../lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"../lib/ipfs.js\";\nimport { fetchMetadata } from \"../lib/ipfs.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getProposal,\n getProposalState,\n proposalCount,\n propose,\n vote,\n executeProposal,\n settleProposal,\n emergencySettle,\n getExecuteCalls,\n getSettlementCalls,\n cancelProposal,\n emergencyCancel,\n getVoteWeight,\n hasVoted,\n getCapitalSnapshot,\n getActiveProposal,\n parseDuration,\n PROPOSAL_STATES,\n PROPOSAL_STATE,\n VOTE_TYPE,\n} from \"../lib/governor.js\";\nimport type { BatchCall } from \"../lib/governor.js\";\nimport { formatDurationShort as formatDuration, formatShares, formatUSDC, parseBigIntArg } from \"../lib/format.js\";\nimport { simulateBatchCalls, printSimulationResult, sendSimulationAlert } from \"../lib/simulate.js\";\nimport type { RiskContext } from \"../lib/simulate.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction formatTimestamp(ts: bigint): string {\n if (ts === 0n) return \"—\";\n return new Date(Number(ts) * 1000).toLocaleString();\n}\n\nfunction parseCallsFile(path: string): BatchCall[] {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw) as { target: string; data: string; value: string }[];\n return parsed.map((c) => ({\n target: c.target as Address,\n data: c.data as Hex,\n value: BigInt(c.value || \"0\"),\n }));\n}\n\nexport function registerProposalCommands(program: Command): void {\n const proposal = program.command(\"proposal\").description(\"Governance proposals — create, vote, execute, settle\");\n\n // ── proposal create ──\n\n proposal\n .command(\"create\")\n .description(\"Submit a strategy proposal\")\n .requiredOption(\"--vault <address>\", \"Vault address the proposal targets\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .requiredOption(\"--description <text>\", \"Strategy rationale and risk summary\")\n .requiredOption(\"--performance-fee <bps>\", \"Agent fee in bps (e.g. 1500 = 15%)\")\n .requiredOption(\"--duration <duration>\", \"Strategy duration (e.g. 7d, 24h, 3600)\")\n .requiredOption(\"--execute-calls <path>\", \"Path to JSON file with execute Call[] array\")\n .requiredOption(\"--settle-calls <path>\", \"Path to JSON file with settlement Call[] array\")\n .option(\"--metadata-uri <uri>\", \"Override — skip IPFS upload and use this URI directly\")\n .option(\"--simulate\", \"Simulate calls via Tenderly before submitting\")\n .option(\"--force\", \"Submit even if simulation fails (requires --simulate)\")\n .action(async (opts) => {\n try {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const performanceFeeBps = parseBigIntArg(opts.performanceFee, \"performance-fee\");\n const strategyDuration = parseDuration(opts.duration);\n const executeCalls = parseCallsFile(opts.executeCalls);\n const settleCalls = parseCallsFile(opts.settleCalls);\n\n // ── Pin metadata ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const account = getAccount();\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/proposal/v1\",\n name: opts.name,\n description: opts.description,\n chain: getNetwork(),\n strategies: [],\n terms: {},\n links: {},\n };\n // Attach proposal-specific fields\n const proposalMeta = {\n ...metadata,\n proposer: account.address,\n vault,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: Math.floor(Date.now() / 1000),\n };\n // Use the existing upload function — it accepts SyndicateMetadata shape\n metadataURI = await uploadMetadata(proposalMeta as unknown as SyndicateMetadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(\"IPFS upload failed — using inline metadata\"));\n const json = JSON.stringify({ name: opts.name, description: opts.description, vault });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Summary ──\n console.log();\n console.log(LABEL(\" ◆ Proposal Summary\"));\n SEP();\n console.log(W(` Name: ${BOLD(opts.name)}`));\n console.log(W(` Vault: ${G(vault)}`));\n console.log(W(` Performance Fee: ${Number(performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(strategyDuration)}`));\n console.log(W(` Calls: ${executeCalls.length} execute + ${settleCalls.length} settle`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n SEP();\n\n // ── Simulate (optional) ──\n if (opts.simulate) {\n // Build risk context from the proposal parameters\n let createRiskContext: RiskContext = { vault, performanceFeeBps, strategyDuration };\n try {\n const govParams = await getGovernorParams();\n createRiskContext = { ...createRiskContext, governorParams: govParams };\n } catch { /* non-fatal — skip parameter bounds checks */ }\n\n const simSpinner = ora({ text: W(\"Simulating execute calls...\"), color: \"green\" }).start();\n const execResult = await simulateBatchCalls(vault, executeCalls, \"execute\", createRiskContext);\n simSpinner.stop();\n printSimulationResult(execResult, \"execute\");\n\n if (settleCalls.length > 0) {\n const settleSpinner = ora({ text: W(\"Simulating settlement calls...\"), color: \"green\" }).start();\n const settleResult = await simulateBatchCalls(vault, settleCalls, \"settlement\", createRiskContext);\n settleSpinner.stop();\n printSimulationResult(settleResult, \"settlement\");\n\n if (!settleResult.success && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Settlement simulation failed. Use --force to submit anyway.\"));\n process.exit(1);\n }\n }\n\n if (!execResult.success && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Execution simulation failed. Use --force to submit anyway.\"));\n process.exit(1);\n }\n\n // Block on critical risks\n const hasCriticalRisks = execResult.risks.some((r) => r.level === \"critical\");\n if (hasCriticalRisks && !opts.force) {\n console.error(chalk.red(\"\\n ✖ Critical risks detected. Use --force to submit anyway.\"));\n process.exit(1);\n }\n }\n\n // ── Submit ──\n const spinner = ora({ text: W(\"Submitting proposal...\"), color: \"green\" }).start();\n const result = await propose(vault, metadataURI, performanceFeeBps, strategyDuration, executeCalls, settleCalls);\n spinner.succeed(G(\"Proposal submitted\"));\n\n console.log();\n console.log(LABEL(\" ◆ Proposal Created\"));\n SEP();\n console.log(W(` Proposal ID: ${G(`#${result.proposalId}`)}`));\n console.log(W(` Tx: ${DIM(getExplorerUrl(result.hash))}`));\n SEP();\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal list ──\n\n proposal\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"--vault <address>\", \"Filter by vault\")\n .option(\"--state <filter>\", \"Filter by state: draft, pending, approved, executed, settled, all\", \"all\")\n .action(async (opts) => {\n const spinner = ora(\"Loading proposals...\").start();\n try {\n const count = await proposalCount();\n if (count === 0n) {\n spinner.stop();\n console.log(DIM(\"\\n No proposals found.\\n\"));\n return;\n }\n\n const vaultFilter = opts.vault ? (opts.vault as string).toLowerCase() : null;\n const stateFilter = opts.state.toLowerCase();\n const stateIndex = PROPOSAL_STATES.findIndex((s) => s.toLowerCase() === stateFilter);\n\n // Fetch all proposals + computed states concurrently\n const ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n const results = await Promise.all(\n ids.map(async (id) => {\n const [p, state] = await Promise.all([getProposal(id), getProposalState(id)]);\n return { ...p, computedState: state };\n }),\n );\n\n const proposals = results.filter((p) => {\n if (vaultFilter && p.vault.toLowerCase() !== vaultFilter) return false;\n if (stateFilter !== \"all\" && stateIndex >= 0 && p.computedState !== stateIndex) return false;\n return true;\n });\n\n spinner.stop();\n\n if (proposals.length === 0) {\n console.log(DIM(\"\\n No matching proposals.\\n\"));\n return;\n }\n\n console.log();\n console.log(BOLD(`Proposals (${proposals.length})`));\n console.log(DIM(\"─\".repeat(90)));\n console.log(\n DIM(\" ID \") +\n DIM(\"Agent\".padEnd(14)) +\n DIM(\"State\".padEnd(12)) +\n DIM(\"Votes (For/Against)\".padEnd(22)) +\n DIM(\"Fee\".padEnd(8)) +\n DIM(\"Duration\".padEnd(10)) +\n DIM(\"Created\"),\n );\n console.log(DIM(\"─\".repeat(90)));\n\n for (const p of proposals) {\n const state = PROPOSAL_STATES[p.computedState] || \"Unknown\";\n const created = p.snapshotTimestamp > 0n\n ? new Date(Number(p.snapshotTimestamp) * 1000).toLocaleDateString()\n : \"—\";\n const agent = `${p.proposer.slice(0, 6)}...${p.proposer.slice(-4)}`;\n const fee = `${Number(p.performanceFeeBps) / 100}%`;\n const dur = formatDuration(p.strategyDuration);\n const votes = `${formatShares(p.votesFor)}/${formatShares(p.votesAgainst)}`;\n\n console.log(\n ` ${String(p.id).padEnd(4)}` +\n `${agent.padEnd(14)}` +\n `${state.padEnd(12)}` +\n `${votes.padEnd(22)}` +\n `${fee.padEnd(8)}` +\n `${dur.padEnd(10)}` +\n `${created}`,\n );\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposals\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── proposal show ──\n\n proposal\n .command(\"show\")\n .description(\"Show full proposal details\")\n .argument(\"<id>\", \"Proposal ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading proposal...\").start();\n try {\n const id = parseBigIntArg(idStr, \"proposal ID\");\n const p = await getProposal(id);\n const state = await getProposalState(id);\n const params = await getGovernorParams();\n\n spinner.stop();\n\n const stateLabel = PROPOSAL_STATES[state] || \"Unknown\";\n const totalVotes = p.votesFor + p.votesAgainst;\n const quorumNeeded = totalVotes > 0n ? `${Number(params.vetoThresholdBps) / 100}%` : \"—\";\n\n console.log();\n console.log(LABEL(` ◆ Proposal #${p.id}`));\n SEP();\n\n // Try to resolve IPFS metadata\n if (p.metadataURI && p.metadataURI.startsWith(\"ipfs://\")) {\n try {\n const meta = await fetchMetadata(p.metadataURI);\n console.log(W(` Name: ${BOLD(meta.name)}`));\n console.log(W(` Description: ${DIM(meta.description)}`));\n } catch {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n } else if (p.metadataURI) {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n\n console.log(W(` State: ${BOLD(stateLabel)}`));\n console.log(W(` Proposer: ${G(p.proposer)}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(` Performance Fee: ${Number(p.performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(p.strategyDuration)}`));\n\n console.log();\n console.log(LABEL(\" Timestamps\"));\n console.log(W(` Snapshot: ${formatTimestamp(p.snapshotTimestamp)}`));\n console.log(W(` Vote End: ${formatTimestamp(p.voteEnd)}`));\n console.log(W(` Execute By: ${formatTimestamp(p.executeBy)}`));\n console.log(W(` Executed At: ${formatTimestamp(p.executedAt)}`));\n\n console.log();\n console.log(LABEL(\" Votes\"));\n console.log(W(` For: ${formatShares(p.votesFor)}`));\n console.log(W(` Against: ${formatShares(p.votesAgainst)}`));\n console.log(W(` Abstain: ${formatShares(p.votesAbstain)}`));\n console.log(W(` Veto Threshold: ${quorumNeeded}`));\n\n if (state === PROPOSAL_STATE.Executed || state === PROPOSAL_STATE.Settled) {\n try {\n const cap = await getCapitalSnapshot(id);\n console.log();\n console.log(LABEL(\" Capital\"));\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(W(` Snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot */ }\n }\n\n const execCalls = await getExecuteCalls(id);\n const settlCalls = await getSettlementCalls(id);\n\n console.log();\n console.log(LABEL(` Execute Calls (${execCalls.length})`));\n for (let i = 0; i < execCalls.length; i++) {\n console.log(DIM(` [${i}] target=${execCalls[i].target}`));\n console.log(DIM(` data=${execCalls[i].data.slice(0, 20)}... value=${execCalls[i].value}`));\n }\n console.log(LABEL(` Settlement Calls (${settlCalls.length})`));\n for (let i = 0; i < settlCalls.length; i++) {\n console.log(DIM(` [${i}] target=${settlCalls[i].target}`));\n console.log(DIM(` data=${settlCalls[i].data.slice(0, 20)}... value=${settlCalls[i].value}`));\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposal\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── proposal vote ──\n\n proposal\n .command(\"vote\")\n .description(\"Cast a vote on a pending proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .requiredOption(\"--support <for|against|abstain>\", \"Vote direction: for, against, or abstain\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const supportRaw = String(opts.support).toLowerCase();\n const support = supportRaw === \"yes\" || supportRaw === \"for\"\n ? VOTE_TYPE.For\n : supportRaw === \"no\" || supportRaw === \"against\"\n ? VOTE_TYPE.Against\n : supportRaw === \"abstain\"\n ? VOTE_TYPE.Abstain\n : null;\n if (support === null) {\n console.error(chalk.red(`Invalid support value \"${opts.support}\". Use for|against|abstain.`));\n process.exit(1);\n }\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Pending`);\n process.exit(1);\n }\n\n const alreadyVoted = await hasVoted(proposalId, account.address);\n if (alreadyVoted) {\n spinner.fail(\"You have already voted on this proposal\");\n process.exit(1);\n }\n\n const weight = await getVoteWeight(proposalId, account.address);\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Cast Vote\"));\n SEP();\n console.log(W(` Proposal: #${proposalId}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(\n ` Support: ${\n support === VOTE_TYPE.For ? G(\"FOR\")\n : support === VOTE_TYPE.Against ? chalk.red(\"AGAINST\")\n : DIM(\"ABSTAIN\")\n }`,\n ));\n console.log(W(` Weight: ${formatShares(weight)} shares`));\n SEP();\n\n const voteSpinner = ora({ text: W(\"Submitting vote...\"), color: \"green\" }).start();\n const hash = await vote(proposalId, support);\n voteSpinner.succeed(G(\"Vote cast\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal execute ──\n\n proposal\n .command(\"execute\")\n .description(\"Execute an approved proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--dry-run\", \"Simulate execution without sending a transaction\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Approved) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Approved`);\n process.exit(1);\n }\n\n // Dry run — simulate instead of executing\n if (opts.dryRun) {\n const p = await getProposal(proposalId);\n const execCalls = await getExecuteCalls(proposalId);\n const dryRunContext: RiskContext = {\n vault: p.vault,\n performanceFeeBps: p.performanceFeeBps,\n strategyDuration: p.strategyDuration,\n };\n spinner.text = W(\"Simulating execution...\");\n const result = await simulateBatchCalls(p.vault, execCalls, \"execute\", dryRunContext);\n spinner.stop();\n printSimulationResult(result, \"execute\");\n const hasCritical = result.risks.some((r) => r.level === \"critical\");\n process.exit(result.success && !hasCritical ? 0 : 1);\n }\n\n spinner.text = W(\"Executing proposal...\");\n const hash = await executeProposal(proposalId);\n spinner.succeed(G(\"Proposal executed\"));\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n try {\n const cap = await getCapitalSnapshot(proposalId);\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(DIM(` Capital snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot yet */ }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal settle ──\n\n proposal\n .command(\"settle\")\n .description(\"Settle an executed proposal (auto-routes settlement path)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--calls <path>\", \"Path to JSON file with settle Call[] (for agent/emergency settle)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Executed`);\n process.exit(1);\n }\n\n const isProposer = account.address.toLowerCase() === p.proposer.toLowerCase();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const durationElapsed = p.executedAt > 0n && now >= p.executedAt + p.strategyDuration;\n\n let hash: Hex;\n\n if (isProposer && !durationElapsed) {\n // Proposer can settle anytime\n spinner.text = W(\"Settling (proposer)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled by proposer\"));\n } else if (durationElapsed && !opts.calls) {\n // Permissionless settle after duration\n spinner.text = W(\"Settling (permissionless)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled (permissionless)\"));\n } else if (durationElapsed && opts.calls) {\n // Emergency settle — owner with custom calls\n spinner.text = W(\"Emergency settling...\");\n const calls = parseCallsFile(opts.calls);\n hash = await emergencySettle(proposalId, calls);\n spinner.succeed(G(\"Emergency settled\"));\n } else {\n spinner.fail(\"Cannot settle: duration not elapsed and you are not the proposer.\");\n process.exit(1);\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal unstick ──\n // Guardian-only recovery path. Hidden from `--help` on purpose: this is a\n // last-resort command used by the syndicate-owner skill when an Executed\n // proposal's pre-committed settlement calls revert, leaving the vault\n // locked (`redemptionsLocked() == true`, `getActiveProposal(vault) != 0`).\n //\n // It calls `emergencySettle(id, [noopCall])` where `noopCall` is a\n // harmless `asset.balanceOf(vault)` view-call on the vault's underlying\n // asset. The governor's `_tryPrecommittedThenFallback` catches the\n // pre-committed revert and runs this no-op fallback, causing\n // `_finishSettlement` to mark the proposal `Settled` and clear\n // `_activeProposal[vault]`. LPs can redeem afterwards.\n //\n // Docs: skill/skills/syndicate-owner/SKILL.md § \"Recovering a stuck proposal\"\n\n proposal\n .command(\"unstick\", { hidden: true })\n .description(\n \"Guardian-only: unstick a vault whose Executed proposal cannot settle (no funds moved)\",\n )\n .requiredOption(\"--id <proposalId>\", \"Proposal ID to unstick\")\n .option(\"--yes\", \"Skip the interactive confirmation\")\n .option(\n \"--dry-run\",\n \"Check preconditions and print the fallback call without broadcasting\",\n )\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n // 1. State must be Executed\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(\n `Proposal ${proposalId} is ${PROPOSAL_STATES[state] || \"Unknown\"} — unstick only applies to Executed proposals.`,\n );\n console.error(\n DIM(\n \"\\n Other states have their own recovery path:\\n\" +\n \" Draft/Pending → sherwood proposal cancel --id <id>\\n\" +\n \" Approved → sherwood proposal veto <id>\\n\" +\n \" Expired → vault is not locked, nothing to do\\n\" +\n \" Settled → already settled\\n\" +\n \" Cancelled → governor upgrade required (issue #177)\\n\",\n ),\n );\n process.exit(1);\n }\n\n // 2. Strategy duration must have elapsed (emergencySettle requires it)\n const now = BigInt(Math.floor(Date.now() / 1000));\n const expiresAt = p.executedAt + p.strategyDuration;\n if (p.executedAt === 0n || now < expiresAt) {\n spinner.fail(\"Strategy duration has not elapsed yet.\");\n const remaining = expiresAt - now;\n console.error(\n DIM(\n `\\n Can unstick after: ${new Date(Number(expiresAt) * 1000).toLocaleString()} (in ~${formatDuration(remaining)})\\n`,\n ),\n );\n process.exit(1);\n }\n\n // 3. Vault must actually be locked by this proposal\n const vault = p.vault as Address;\n const active = await getActiveProposal(vault);\n if (active !== proposalId) {\n spinner.fail(\n `Vault ${vault} active proposal is ${active}, not ${proposalId} — nothing to unstick for this proposal.`,\n );\n process.exit(1);\n }\n\n // 4. Caller must be vault owner\n const vaultOwner = await getVaultOwner(vault);\n if (account.address.toLowerCase() !== vaultOwner.toLowerCase()) {\n spinner.fail(\"Only the vault owner can unstick a proposal.\");\n console.error(\n DIM(`\\n Vault owner: ${vaultOwner}\\n Your wallet: ${account.address}\\n`),\n );\n process.exit(1);\n }\n\n // 5. Craft the no-op fallback call: asset.balanceOf(vault)\n // Cannot revert, costs ~2.5k gas, satisfies fallbackCalls.length > 0\n // requirement in _tryPrecommittedThenFallback.\n const asset = await getAssetAddress();\n const noopCalldata = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vault],\n });\n const fallbackCalls: BatchCall[] = [\n { target: asset, data: noopCalldata, value: 0n },\n ];\n\n spinner.stop();\n\n // Print plan\n console.log();\n console.log(BOLD(\"Unstick plan\"));\n SEP();\n console.log(` Proposal: ${proposalId}`);\n console.log(` Vault: ${vault}`);\n console.log(` Asset: ${asset}`);\n console.log(` State: ${PROPOSAL_STATES[state]} (duration elapsed)`);\n console.log(` Caller: ${account.address} (vault owner ✓)`);\n console.log();\n console.log(LABEL(\" Fallback call (no-op, cannot revert):\"));\n console.log(DIM(` target: ${asset}`));\n console.log(DIM(` data: ${noopCalldata} // balanceOf(${vault})`));\n console.log(DIM(\" value: 0\"));\n console.log();\n console.log(\n DIM(\n \" This calls emergencySettle(id, [noop]). The governor catches any revert\\n\" +\n \" from the pre-committed settlement calls and runs the no-op instead. No\\n\" +\n \" funds move. The proposal transitions to Settled and the vault unlocks.\\n\" +\n \" LPs can then redeem via `sherwood vault redeem`.\",\n ),\n );\n console.log();\n\n if (opts.dryRun) {\n console.log(G(\" (dry-run) Preconditions OK — not broadcasting.\\n\"));\n return;\n }\n\n if (!opts.yes) {\n process.stdout.write(chalk.yellow(\" Proceed? [y/N] \"));\n const answer = await new Promise<string>((resolve) => {\n process.stdin.resume();\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.once(\"data\", (d) => resolve(String(d).trim().toLowerCase()));\n });\n process.stdin.pause();\n if (answer !== \"y\" && answer !== \"yes\") {\n console.log(DIM(\" Cancelled.\\n\"));\n return;\n }\n }\n\n const send = ora(\"Broadcasting emergencySettle...\").start();\n const hash = await emergencySettle(proposalId, fallbackCalls);\n send.succeed(G(\"Vault unstuck — proposal Settled\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n // Verify unlock\n const stillActive = await getActiveProposal(vault);\n if (stillActive === 0n) {\n console.log(G(\" redemptionsLocked cleared ✓\"));\n } else {\n console.log(\n chalk.yellow(\n ` ⚠ getActiveProposal(vault) still returns ${stillActive} — check manually.`,\n ),\n );\n }\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal cancel ──\n\n proposal\n .command(\"cancel\")\n .description(\"Cancel a proposal (proposer or vault owner)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--emergency\", \"Emergency cancel (vault owner only, any non-settled state)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state === PROPOSAL_STATE.Settled || state === PROPOSAL_STATE.Cancelled) {\n spinner.fail(`Proposal is already ${PROPOSAL_STATES[state]}`);\n process.exit(1);\n }\n\n let hash: Hex;\n\n if (opts.emergency) {\n spinner.text = W(\"Emergency cancelling...\");\n hash = await emergencyCancel(proposalId);\n spinner.succeed(G(\"Emergency cancelled\"));\n } else {\n if (state !== PROPOSAL_STATE.Draft && state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"} — use --emergency for non-pending/approved`);\n process.exit(1);\n }\n spinner.text = W(\"Cancelling proposal...\");\n hash = await cancelProposal(proposalId);\n spinner.succeed(G(\"Proposal cancelled\"));\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${formatContractError(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal simulate ──\n\n proposal\n .command(\"simulate\")\n .description(\"Simulate proposal calls via Tenderly (or eth_call fallback)\")\n .option(\"--id <proposalId>\", \"Proposal ID to simulate\")\n .option(\"--vault <address>\", \"Vault address (required with --execute-calls)\")\n .option(\"--execute-calls <path>\", \"Path to JSON execute calls file\")\n .option(\"--settle-calls <path>\", \"Path to JSON settlement calls file\")\n .option(\"--notify <subdomain>\", \"Send results to syndicate XMTP chat\")\n .action(async (opts) => {\n try {\n let vault: Address;\n let executeCalls: BatchCall[];\n let settlementCalls: BatchCall[] = [];\n let riskContext: RiskContext = {};\n let proposalId: bigint | undefined;\n\n if (opts.id) {\n // By proposal ID — fetch calls and build full risk context\n proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const spinner = ora(\"Loading proposal...\").start();\n\n const p = await getProposal(proposalId);\n vault = p.vault;\n executeCalls = await getExecuteCalls(proposalId);\n settlementCalls = await getSettlementCalls(proposalId);\n\n riskContext = {\n vault,\n performanceFeeBps: p.performanceFeeBps,\n strategyDuration: p.strategyDuration,\n };\n\n try {\n const govParams = await getGovernorParams();\n riskContext.governorParams = govParams;\n } catch { /* non-fatal */ }\n\n spinner.stop();\n console.log(DIM(`\\n Simulating proposal #${proposalId} on vault ${vault.slice(0, 10)}...`));\n } else if (opts.executeCalls) {\n // By call files — minimal risk context (no proposal params)\n if (!opts.vault || !isAddress(opts.vault)) {\n console.error(chalk.red(\"\\n ✖ --vault is required when using --execute-calls\"));\n process.exit(1);\n }\n vault = opts.vault as Address;\n executeCalls = parseCallsFile(opts.executeCalls);\n if (opts.settleCalls) {\n settlementCalls = parseCallsFile(opts.settleCalls);\n }\n riskContext = { vault };\n } else {\n console.error(chalk.red(\"\\n ✖ Provide --id <proposalId> or --execute-calls <path>\"));\n process.exit(1);\n }\n\n // Simulate execute calls\n const spinner = ora({ text: W(\"Simulating execute calls...\"), color: \"green\" }).start();\n const execResult = await simulateBatchCalls(vault, executeCalls, \"execute\", riskContext);\n spinner.stop();\n printSimulationResult(execResult, \"execute\");\n\n // Simulate settlement calls if present\n let settleResult;\n if (settlementCalls.length > 0) {\n const settleSpinner = ora({ text: W(\"Simulating settlement calls...\"), color: \"green\" }).start();\n settleResult = await simulateBatchCalls(vault, settlementCalls, \"settlement\", riskContext);\n settleSpinner.stop();\n printSimulationResult(settleResult, \"settlement\");\n }\n\n // Send XMTP notification if requested\n if (opts.notify && proposalId !== undefined) {\n const notifySpinner = ora({ text: W(\"Sending XMTP alert...\"), color: \"green\" }).start();\n await sendSimulationAlert(opts.notify, proposalId, vault, execResult, settleResult);\n notifySpinner.succeed(G(\"Risk report sent to chat\"));\n }\n\n // Exit with failure code if simulation or risks are critical\n const hasCritical = execResult.risks.some((r) => r.level === \"critical\")\n || (settleResult?.risks.some((r) => r.level === \"critical\") ?? false);\n\n if (!execResult.success || (settleResult && !settleResult.success) || hasCritical) {\n process.exit(1);\n }\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * Shared formatting helpers for CLI output.\n */\n\n/** Compact duration: \"3d\", \"2.5h\", \"15m\", \"30s\" */\nexport function formatDurationShort(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)}d`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)}h`;\n if (s >= 60) return `${(s / 60).toFixed(0)}m`;\n return `${s}s`;\n}\n\n/** Verbose duration: \"3 days\", \"2.5 hours\", \"15 min\", \"30s\" */\nexport function formatDurationLong(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)} day${s >= 172800 ? \"s\" : \"\"}`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)} hour${s >= 7200 ? \"s\" : \"\"}`;\n if (s >= 60) return `${(s / 60).toFixed(0)} min`;\n return `${s}s`;\n}\n\n/** Format raw share amounts to human-readable (e.g. 124000000000 → \"124,000\") */\nexport function formatShares(raw: bigint, decimals: number = 6): string {\n const num = Number(raw) / 10 ** decimals;\n return num.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n}\n\n/** Format USDC amount (6 decimals) to human-readable (e.g. 50000000000 → \"$50,000.00\") */\nexport function formatUSDC(raw: bigint): string {\n const num = Number(raw) / 1e6;\n return `$${num.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/** Validate string as BigInt, throw user-friendly error */\nexport function parseBigIntArg(value: string, name: string): bigint {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Invalid ${name}: \"${value}\" is not a valid integer`);\n }\n return BigInt(value);\n}\n","/**\n * Proposal simulation — Tenderly API client, eth_call fallback,\n * calldata decoder, and CLI output formatter.\n *\n * The Tenderly integration is proxied through the Sherwood app API\n * (/api/simulate) so credentials stay server-side.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { decodeFunctionData, encodeFunctionData } from \"viem\";\nimport chalk from \"chalk\";\nimport { getPublicClient } from \"./client.js\";\nimport { getChain } from \"./network.js\";\nimport { getGovernorAddress } from \"./governor.js\";\nimport type { GovernorParams } from \"./governor.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, SWAP_ROUTER_ABI } from \"./abis.js\";\nimport { TOKENS, MOONWELL, UNISWAP, SHERWOOD, AERODROME, VENICE, STRATEGY_TEMPLATES } from \"./addresses.js\";\nimport type { BatchCall } from \"./batch.js\";\n\n// ── Styling (matches proposal.ts conventions) ────────────\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\n// ── Types ────────────────────────────────────────────────\n\nexport interface SimulationCallResult {\n index: number;\n target: Address;\n decodedFunction: string | null;\n selector: Hex;\n success: boolean;\n gasUsed: number;\n}\n\nexport interface SimulationResult {\n success: boolean;\n totalGasUsed: number;\n callResults: SimulationCallResult[];\n warnings: string[];\n risks: RiskFlag[];\n source: \"api\" | \"eth_call\";\n errorMessage?: string;\n}\n\n// ── Risk analysis types ─────────────────────────────────\n\nexport type RiskLevel = \"critical\" | \"warning\" | \"info\";\n\nexport interface RiskFlag {\n level: RiskLevel;\n code: string;\n message: string;\n callIndex?: number;\n}\n\nexport interface RiskContext {\n vault?: Address;\n performanceFeeBps?: bigint;\n strategyDuration?: bigint;\n governorParams?: GovernorParams;\n}\n\n// ── Moonwell cToken ABI fragment (not in main abis.ts) ───\n\nconst MOONWELL_CTOKEN_ABI = [\n {\n name: \"mint\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mintAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeem\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"redeemTokens\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeemUnderlying\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"redeemAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"borrow\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"borrowAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"repayBorrow\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"repayAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Moonwell Comptroller ABI fragment ────────────────────\n\nconst MOONWELL_COMPTROLLER_ABI = [\n {\n name: \"enterMarkets\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mTokens\", type: \"address[]\" }],\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n },\n {\n name: \"exitMarket\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"mToken\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Uniswap SwapRouter exactInputSingle ABI fragment ─────\n\nconst SWAP_ROUTER_SINGLE_ABI = [\n {\n name: \"exactInputSingle\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Address label registry ───────────────────────────────\n\nfunction buildLabelMap(): Map<string, string> {\n const map = new Map<string, string>();\n const add = (addr: Address, label: string) => {\n if (addr !== \"0x0000000000000000000000000000000000000000\") {\n map.set(addr.toLowerCase(), label);\n }\n };\n\n try {\n const tokens = TOKENS();\n add(tokens.USDC, \"USDC\");\n add(tokens.WETH, \"WETH\");\n add(tokens.cbETH, \"cbETH\");\n add(tokens.wstETH, \"wstETH\");\n add(tokens.cbBTC, \"cbBTC\");\n add(tokens.DAI, \"DAI\");\n add(tokens.AERO, \"AERO\");\n\n const mw = MOONWELL();\n add(mw.COMPTROLLER, \"Moonwell Comptroller\");\n add(mw.mUSDC, \"mUSDC\");\n add(mw.mWETH, \"mWETH\");\n add(mw.mCbETH, \"mCbETH\");\n add(mw.mWstETH, \"mWstETH\");\n add(mw.mCbBTC, \"mCbBTC\");\n add(mw.mDAI, \"mDAI\");\n add(mw.mAERO, \"mAERO\");\n\n const uni = UNISWAP();\n add(uni.SWAP_ROUTER, \"SwapRouter\");\n add(uni.QUOTER_V2, \"QuoterV2\");\n\n const sw = SHERWOOD();\n add(sw.FACTORY, \"SyndicateFactory\");\n add(sw.GOVERNOR, \"SyndicateGovernor\");\n\n const aero = AERODROME();\n add(aero.ROUTER, \"Aerodrome Router\");\n add(aero.FACTORY, \"Aerodrome Factory\");\n\n const venice = VENICE();\n add(venice.VVV, \"VVV\");\n add(venice.STAKING, \"sVVV Staking\");\n add(venice.DIEM, \"DIEM\");\n\n const strats = STRATEGY_TEMPLATES();\n add(strats.MOONWELL_SUPPLY, \"MoonwellSupplyStrategy\");\n add(strats.AERODROME_LP, \"AerodromeLPStrategy\");\n add(strats.VENICE_INFERENCE, \"VeniceInferenceStrategy\");\n add(strats.WSTETH_MOONWELL, \"WstETHMoonwellStrategy\");\n } catch {\n // Network not set yet — return partial map\n }\n\n return map;\n}\n\n/** Known token decimals for human-readable formatting */\nfunction buildDecimalsMap(): Map<string, { decimals: number; symbol: string }> {\n const map = new Map<string, { decimals: number; symbol: string }>();\n try {\n const tokens = TOKENS();\n map.set(tokens.USDC.toLowerCase(), { decimals: 6, symbol: \"USDC\" });\n map.set(tokens.WETH.toLowerCase(), { decimals: 18, symbol: \"WETH\" });\n map.set(tokens.cbETH.toLowerCase(), { decimals: 18, symbol: \"cbETH\" });\n map.set(tokens.wstETH.toLowerCase(), { decimals: 18, symbol: \"wstETH\" });\n map.set(tokens.cbBTC.toLowerCase(), { decimals: 8, symbol: \"cbBTC\" });\n map.set(tokens.DAI.toLowerCase(), { decimals: 18, symbol: \"DAI\" });\n map.set(tokens.AERO.toLowerCase(), { decimals: 18, symbol: \"AERO\" });\n } catch {\n // Network not set\n }\n return map;\n}\n\n/** Moonwell mToken → underlying token address mapping */\nfunction buildMTokenToUnderlying(): Map<string, string> {\n const map = new Map<string, string>();\n try {\n const mw = MOONWELL();\n const tokens = TOKENS();\n map.set(mw.mUSDC.toLowerCase(), tokens.USDC.toLowerCase());\n map.set(mw.mWETH.toLowerCase(), tokens.WETH.toLowerCase());\n map.set(mw.mCbETH.toLowerCase(), tokens.cbETH.toLowerCase());\n map.set(mw.mWstETH.toLowerCase(), tokens.wstETH.toLowerCase());\n map.set(mw.mCbBTC.toLowerCase(), tokens.cbBTC.toLowerCase());\n map.set(mw.mDAI.toLowerCase(), tokens.DAI.toLowerCase());\n map.set(mw.mAERO.toLowerCase(), tokens.AERO.toLowerCase());\n } catch {\n // Network not set\n }\n return map;\n}\n\nexport function getAddressLabel(addr: Address): string | null {\n const labels = buildLabelMap();\n return labels.get(addr.toLowerCase()) ?? null;\n}\n\n// ── Human-readable formatting helpers ────────────────────\n\nfunction truncAddr(addr: string): string {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n}\n\nfunction labeledAddr(addr: string): string {\n const label = buildLabelMap().get(addr.toLowerCase());\n const short = truncAddr(addr);\n return label ? `${short} (${label})` : short;\n}\n\nfunction formatTokenAmount(amount: bigint, target: string): string {\n const decimalsMap = buildDecimalsMap();\n\n // Direct match: target is a token\n const tokenInfo = decimalsMap.get(target.toLowerCase());\n if (tokenInfo) {\n return formatWithDecimals(amount, tokenInfo.decimals, tokenInfo.symbol);\n }\n\n // mToken: use underlying token's decimals\n const mTokenMap = buildMTokenToUnderlying();\n const underlying = mTokenMap.get(target.toLowerCase());\n if (underlying) {\n const underlyingInfo = decimalsMap.get(underlying);\n if (underlyingInfo) {\n return formatWithDecimals(amount, underlyingInfo.decimals, underlyingInfo.symbol);\n }\n }\n\n // Unknown — return raw\n return amount.toString();\n}\n\nfunction formatWithDecimals(amount: bigint, decimals: number, symbol: string): string {\n const num = Number(amount) / 10 ** decimals;\n const formatted = num.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: decimals <= 8 ? 2 : 4,\n });\n return `${formatted} ${symbol}`;\n}\n\n// ── Calldata decoder ─────────────────────────────────────\n\n/**\n * Decode calldata into a human-readable function call string.\n * Returns null for unknown selectors.\n */\nexport function decodeCallData(target: Address, data: Hex): string | null {\n if (data.length < 10) return null;\n\n const labels = buildLabelMap();\n const targetLower = target.toLowerCase();\n\n // Build a list of (abi, contextLabel) pairs to try, ordered by target match\n type AbiEntry = { abi: readonly unknown[]; context: string };\n const candidates: AbiEntry[] = [];\n\n // Moonwell mTokens\n const mw = safeCall(() => MOONWELL());\n if (mw) {\n const isMToken = [mw.mUSDC, mw.mWETH, mw.mCbETH, mw.mWstETH, mw.mCbBTC, mw.mDAI, mw.mAERO]\n .some((a) => a.toLowerCase() === targetLower);\n if (isMToken) {\n candidates.push({ abi: MOONWELL_CTOKEN_ABI, context: labels.get(targetLower) || \"mToken\" });\n }\n\n if (mw.COMPTROLLER.toLowerCase() === targetLower) {\n candidates.push({ abi: MOONWELL_COMPTROLLER_ABI, context: \"Comptroller\" });\n }\n }\n\n // Uniswap SwapRouter\n const uni = safeCall(() => UNISWAP());\n if (uni && uni.SWAP_ROUTER.toLowerCase() === targetLower) {\n candidates.push({ abi: SWAP_ROUTER_ABI, context: \"SwapRouter\" });\n candidates.push({ abi: SWAP_ROUTER_SINGLE_ABI, context: \"SwapRouter\" });\n }\n\n // ERC20 as generic fallback (always try last)\n candidates.push({ abi: ERC20_ABI, context: labels.get(targetLower) || \"ERC20\" });\n\n for (const { abi, context } of candidates) {\n try {\n const decoded = decodeFunctionData({\n abi: abi as readonly unknown[],\n data,\n });\n\n const args = formatArgs(decoded.args as readonly unknown[], decoded.functionName, target);\n return `${decoded.functionName}(${args})`;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nfunction formatArgs(args: readonly unknown[], functionName: string, target: Address): string {\n if (!args || args.length === 0) return \"\";\n\n const parts: string[] = [];\n\n for (const arg of args) {\n if (typeof arg === \"bigint\") {\n parts.push(formatTokenAmount(arg, target));\n } else if (typeof arg === \"string\" && arg.startsWith(\"0x\") && arg.length === 42) {\n parts.push(labeledAddr(arg));\n } else if (typeof arg === \"object\" && arg !== null && !Array.isArray(arg)) {\n // Struct (e.g. exactInput params)\n const entries = Object.entries(arg as Record<string, unknown>);\n const structParts: string[] = [];\n for (const [key, val] of entries) {\n if (typeof val === \"bigint\") {\n structParts.push(`${key}: ${formatTokenAmount(val, target)}`);\n } else if (typeof val === \"string\" && val.startsWith(\"0x\") && val.length === 42) {\n structParts.push(`${key}: ${labeledAddr(val)}`);\n } else if (typeof val === \"string\" && val.startsWith(\"0x\") && key === \"path\") {\n structParts.push(`path: ${decodeUniswapPath(val)}`);\n } else {\n structParts.push(`${key}: ${String(val)}`);\n }\n }\n parts.push(`{${structParts.join(\", \")}}`);\n } else if (Array.isArray(arg)) {\n const arrParts = (arg as unknown[]).map((item) => {\n if (typeof item === \"string\" && item.startsWith(\"0x\") && item.length === 42) {\n return labeledAddr(item);\n }\n return String(item);\n });\n parts.push(`[${arrParts.join(\", \")}]`);\n } else {\n parts.push(String(arg));\n }\n }\n\n return parts.join(\", \");\n}\n\n/** Decode a Uniswap V3 packed path (address + fee + address + ...) */\nfunction decodeUniswapPath(pathHex: string): string {\n const labels = buildLabelMap();\n const path = pathHex.startsWith(\"0x\") ? pathHex.slice(2) : pathHex;\n const tokens: string[] = [];\n\n // Path format: 20 bytes address, 3 bytes fee, 20 bytes address, ...\n let offset = 0;\n while (offset + 40 <= path.length) {\n const addr = `0x${path.slice(offset, offset + 40)}`;\n const label = labels.get(addr.toLowerCase());\n tokens.push(label || truncAddr(addr));\n offset += 40;\n if (offset + 6 <= path.length) {\n offset += 6; // skip 3-byte fee\n } else {\n break;\n }\n }\n\n return tokens.join(\" → \");\n}\n\nfunction safeCall<T>(fn: () => T): T | null {\n try {\n return fn();\n } catch {\n return null;\n }\n}\n\n// ── Raw calldata decoder (for risk analysis) ─────────────\n\ninterface DecodedCall {\n functionName: string;\n args: readonly unknown[];\n}\n\n/**\n * Decode calldata into raw { functionName, args } for risk inspection.\n * Same ABI candidate logic as decodeCallData(), but returns typed values\n * instead of a formatted display string.\n */\nfunction decodeCallArgs(target: Address, data: Hex): DecodedCall | null {\n if (data.length < 10) return null;\n\n const targetLower = target.toLowerCase();\n type AbiEntry = { abi: readonly unknown[] };\n const candidates: AbiEntry[] = [];\n\n const mw = safeCall(() => MOONWELL());\n if (mw) {\n const isMToken = [mw.mUSDC, mw.mWETH, mw.mCbETH, mw.mWstETH, mw.mCbBTC, mw.mDAI, mw.mAERO]\n .some((a) => a.toLowerCase() === targetLower);\n if (isMToken) candidates.push({ abi: MOONWELL_CTOKEN_ABI });\n if (mw.COMPTROLLER.toLowerCase() === targetLower) candidates.push({ abi: MOONWELL_COMPTROLLER_ABI });\n }\n\n const uni = safeCall(() => UNISWAP());\n if (uni && uni.SWAP_ROUTER.toLowerCase() === targetLower) {\n candidates.push({ abi: SWAP_ROUTER_ABI });\n candidates.push({ abi: SWAP_ROUTER_SINGLE_ABI });\n }\n\n candidates.push({ abi: ERC20_ABI });\n\n for (const { abi } of candidates) {\n try {\n const decoded = decodeFunctionData({ abi: abi as readonly unknown[], data });\n return { functionName: decoded.functionName, args: decoded.args as readonly unknown[] };\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n// ── Risk analysis engine ─────────────────────────────────\n\n/**\n * Analyze simulation results for semantic risks.\n * Pure function — no chain calls. Checks each call against the known\n * address registry and flags dangerous patterns.\n */\nexport function analyzeRisk(\n calls: BatchCall[],\n callResults: SimulationCallResult[],\n context?: RiskContext,\n): RiskFlag[] {\n const risks: RiskFlag[] = [];\n const labels = buildLabelMap();\n const vaultLower = context?.vault?.toLowerCase();\n\n const isKnown = (addr: string): boolean => {\n const lower = addr.toLowerCase();\n return labels.has(lower) || lower === vaultLower;\n };\n\n // ── Per-call checks ──\n\n let allTargetsVerified = true;\n let allCallsDecoded = true;\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const result = callResults[i];\n const callNum = i + 1;\n\n // Simulation failure\n if (result && !result.success) {\n risks.push({\n level: \"critical\",\n code: \"SIMULATION_FAILED\",\n message: `Call #${callNum} to ${labeledAddr(call.target)} reverted during simulation`,\n callIndex: i,\n });\n }\n\n // Unknown target\n const targetKnown = isKnown(call.target);\n if (!targetKnown) {\n allTargetsVerified = false;\n risks.push({\n level: \"critical\",\n code: \"UNKNOWN_TARGET\",\n message: `Call #${callNum} targets ${labeledAddr(call.target)} which is not in the known address registry`,\n callIndex: i,\n });\n }\n\n // Decode calldata for inspection\n const decoded = decodeCallArgs(call.target, call.data);\n\n if (!decoded) {\n allCallsDecoded = false;\n if (!targetKnown) {\n risks.push({\n level: \"critical\",\n code: \"UNDECODED_CALLDATA\",\n message: `Call #${callNum} has unrecognized calldata (selector ${call.data.slice(0, 10)}) targeting unknown contract`,\n callIndex: i,\n });\n }\n continue;\n }\n\n // transfer(to, amount) → check 'to'\n if (decoded.functionName === \"transfer\" && decoded.args.length >= 2) {\n const to = decoded.args[0] as string;\n if (typeof to === \"string\" && to.startsWith(\"0x\") && !isKnown(to)) {\n risks.push({\n level: \"critical\",\n code: \"TRANSFER_TO_UNKNOWN\",\n message: `Call #${callNum} transfer() sends funds to ${truncAddr(to)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n\n // transferFrom(from, to, amount) → check 'to'\n if (decoded.functionName === \"transferFrom\" && decoded.args.length >= 3) {\n const to = decoded.args[1] as string;\n if (typeof to === \"string\" && to.startsWith(\"0x\") && !isKnown(to)) {\n risks.push({\n level: \"critical\",\n code: \"TRANSFER_FROM_TO_UNKNOWN\",\n message: `Call #${callNum} transferFrom() sends funds to ${truncAddr(to)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n\n // approve(spender, amount) → check 'spender'\n if (decoded.functionName === \"approve\" && decoded.args.length >= 2) {\n const spender = decoded.args[0] as string;\n if (typeof spender === \"string\" && spender.startsWith(\"0x\") && !isKnown(spender)) {\n risks.push({\n level: \"critical\",\n code: \"APPROVE_TO_UNKNOWN\",\n message: `Call #${callNum} approve() grants allowance to ${truncAddr(spender)} which is not a known protocol`,\n callIndex: i,\n });\n }\n }\n }\n\n // ── Proposal parameter checks ──\n\n if (context?.performanceFeeBps !== undefined) {\n const fee = context.performanceFeeBps;\n const maxFee = context.governorParams?.maxPerformanceFeeBps;\n\n if (maxFee && fee > (maxFee * 80n) / 100n) {\n risks.push({\n level: \"critical\",\n code: \"EXCESSIVE_PERFORMANCE_FEE\",\n message: `Performance fee ${Number(fee) / 100}% is within 20% of the hard cap (${Number(maxFee) / 100}%)`,\n });\n } else if (fee > 2000n) {\n risks.push({\n level: \"warning\",\n code: \"HIGH_PERFORMANCE_FEE\",\n message: `Performance fee ${Number(fee) / 100}% exceeds 20% threshold`,\n });\n }\n }\n\n if (context?.strategyDuration !== undefined) {\n const dur = context.strategyDuration;\n if (dur < 3600n) {\n risks.push({\n level: \"warning\",\n code: \"SHORT_STRATEGY_DURATION\",\n message: `Strategy duration ${Number(dur)}s is under 1 hour — flash-loan-style risk`,\n });\n }\n if (dur > 2_592_000n) {\n risks.push({\n level: \"warning\",\n code: \"LONG_STRATEGY_DURATION\",\n message: `Strategy duration ${Number(dur) / 86400} days exceeds 30-day threshold`,\n });\n }\n }\n\n // ── Summary flags ──\n\n const hasCritical = risks.some((r) => r.level === \"critical\");\n const hasWarning = risks.some((r) => r.level === \"warning\");\n\n if (!hasCritical && !hasWarning) {\n if (allTargetsVerified) {\n risks.push({\n level: \"info\",\n code: \"ALL_TARGETS_VERIFIED\",\n message: \"All call targets are verified protocol addresses\",\n });\n }\n if (allCallsDecoded) {\n risks.push({\n level: \"info\",\n code: \"ALL_CALLS_DECODED\",\n message: \"All calldata successfully decoded\",\n });\n }\n }\n\n return risks;\n}\n\n// ── API simulation ───────────────────────────────────────\n\nconst API_URLS: Record<string, string> = {\n \"base\": \"https://app.sherwood.sh\",\n \"base-sepolia\": \"https://testnet.app.sherwood.sh\",\n};\n\nfunction getApiBaseUrl(): string {\n // Allow override for local development\n if (process.env.SHERWOOD_API_URL) return process.env.SHERWOOD_API_URL;\n\n const chain = getChain();\n return API_URLS[chain.testnet ? \"base-sepolia\" : \"base\"] || API_URLS[\"base\"];\n}\n\nasync function simulateViaApi(\n vault: Address,\n calls: BatchCall[],\n): Promise<SimulationResult> {\n const baseUrl = getApiBaseUrl();\n const chainId = getChain().id;\n\n const response = await fetch(`${baseUrl}/api/simulate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n vault,\n chainId,\n calls: calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({ error: \"Unknown error\" })) as { error?: string; details?: string };\n throw new Error(body.error || `Simulation API returned ${response.status}`);\n }\n\n const result = await response.json() as {\n success: boolean;\n totalGasUsed: number;\n errorMessage: string | null;\n calls: Array<{\n index: number;\n target: string;\n success: boolean;\n gasUsed: number;\n returnData: string;\n }>;\n };\n\n const callResults: SimulationCallResult[] = result.calls.map((c, i) => ({\n index: c.index,\n target: (calls[i]?.target || c.target) as Address,\n decodedFunction: calls[i] ? decodeCallData(calls[i].target, calls[i].data) : null,\n selector: (calls[i]?.data.slice(0, 10) || \"0x\") as Hex,\n success: c.success,\n gasUsed: c.gasUsed,\n }));\n\n // Add decoded functions for any calls the API returned that weren't in our original list\n // (shouldn't happen, but defensive)\n for (const cr of callResults) {\n if (!cr.decodedFunction) {\n const matchingCall = calls[cr.index];\n if (matchingCall) {\n cr.decodedFunction = decodeCallData(matchingCall.target, matchingCall.data);\n }\n }\n }\n\n const warnings: string[] = [];\n for (const cr of callResults) {\n if (!cr.success) {\n warnings.push(`Call #${cr.index + 1} to ${labeledAddr(cr.target)} failed`);\n }\n }\n\n return {\n success: result.success,\n totalGasUsed: result.totalGasUsed,\n callResults,\n warnings,\n risks: [],\n source: \"api\",\n errorMessage: result.errorMessage ?? undefined,\n };\n}\n\n// ── eth_call fallback ────────────────────────────────────\n\nasync function simulateViaEthCall(\n vault: Address,\n calls: BatchCall[],\n): Promise<SimulationResult> {\n const governor = getGovernorAddress();\n const client = getPublicClient();\n\n const input = encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"executeGovernorBatch\",\n args: [calls.map((c) => ({ target: c.target, data: c.data, value: c.value }))],\n });\n\n // Decode calldata for display regardless of simulation result\n const callResults: SimulationCallResult[] = calls.map((c, i) => ({\n index: i,\n target: c.target,\n decodedFunction: decodeCallData(c.target, c.data),\n selector: c.data.slice(0, 10) as Hex,\n success: true, // will be set after simulation\n gasUsed: 0,\n }));\n\n try {\n await client.call({\n account: governor,\n to: vault,\n data: input,\n });\n\n return {\n success: true,\n totalGasUsed: 0,\n callResults,\n warnings: [],\n risks: [],\n source: \"eth_call\",\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // Mark all calls as potentially failed (no per-call granularity)\n for (const cr of callResults) {\n cr.success = false;\n }\n\n return {\n success: false,\n totalGasUsed: 0,\n callResults,\n warnings: [`Batch reverted: ${message.slice(0, 200)}`],\n risks: [],\n source: \"eth_call\",\n errorMessage: message,\n };\n }\n}\n\n// ── Public API ───────────────────────────────────────────\n\nexport async function simulateBatchCalls(\n vault: Address,\n calls: BatchCall[],\n callType: \"execute\" | \"settlement\",\n riskContext?: RiskContext,\n): Promise<SimulationResult> {\n let result: SimulationResult;\n\n try {\n result = await simulateViaApi(vault, calls);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(DIM(` Simulation API unavailable (${message}), falling back to eth_call...`));\n\n result = await simulateViaEthCall(vault, calls);\n }\n\n // Run risk analysis on the results\n const ctx: RiskContext = { vault, ...riskContext };\n result.risks = analyzeRisk(calls, result.callResults, ctx);\n\n return result;\n}\n\n// ── Output formatter ─────────────────────────────────────\n\nexport function printSimulationResult(result: SimulationResult, callType: string): void {\n console.log();\n console.log(LABEL(` ◆ Simulation — ${callType} calls`));\n SEP();\n\n const sourceLabel = result.source === \"api\"\n ? \"Tenderly (via API)\"\n : `eth_call ${DIM(\"(configure Tenderly for detailed results)\")}`;\n console.log(W(` Source: ${sourceLabel}`));\n\n const statusIcon = result.success ? G(\"✓ PASS\") : chalk.red(\"✖ FAIL\");\n console.log(W(` Status: ${statusIcon}`));\n\n if (result.totalGasUsed > 0) {\n console.log(W(` Total Gas: ${result.totalGasUsed.toLocaleString()}`));\n }\n\n if (result.errorMessage && !result.success) {\n console.log(chalk.red(` Error: ${result.errorMessage.slice(0, 120)}`));\n }\n\n console.log();\n\n for (const cr of result.callResults) {\n const icon = cr.success ? G(\"✓\") : chalk.red(\"✖\");\n const funcName = cr.decodedFunction || `${cr.selector}... ${DIM(\"(unknown)\")}`;\n console.log(W(` [${cr.index + 1}] ${icon} ${funcName}`));\n\n const label = getAddressLabel(cr.target);\n const targetDisplay = label ? `${cr.target} (${label})` : cr.target;\n console.log(DIM(` Target: ${targetDisplay}`));\n\n if (cr.gasUsed > 0) {\n console.log(DIM(` Gas: ${cr.gasUsed.toLocaleString()}`));\n }\n\n console.log();\n }\n\n // ── Risk assessment ──\n if (result.risks.length > 0) {\n const criticals = result.risks.filter((r) => r.level === \"critical\");\n const warnings = result.risks.filter((r) => r.level === \"warning\");\n const infos = result.risks.filter((r) => r.level === \"info\");\n\n if (criticals.length > 0) {\n console.log(chalk.red.bold(` ✖ CRITICAL RISKS (${criticals.length})`));\n for (const r of criticals) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n console.log(chalk.red(` ✖${ref} ${r.code} — ${r.message}`));\n }\n console.log();\n }\n\n if (warnings.length > 0) {\n console.log(chalk.yellow.bold(` ⚠ WARNINGS (${warnings.length})`));\n for (const r of warnings) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n console.log(chalk.yellow(` ⚠${ref} ${r.code} — ${r.message}`));\n }\n console.log();\n }\n\n if (criticals.length === 0 && warnings.length === 0 && infos.length > 0) {\n console.log(G.bold(` ✓ RISK ASSESSMENT: CLEAN`));\n for (const r of infos) {\n console.log(G(` ✓ ${r.message}`));\n }\n console.log();\n }\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(` ⚠ Simulation Warnings`));\n for (const w of result.warnings) {\n console.log(chalk.yellow(` - ${w}`));\n }\n console.log();\n }\n\n SEP();\n}\n\n// ── XMTP escalation ─────────────────────────────────────\n\n/**\n * Send a simulation risk report to the syndicate's XMTP chat.\n * Uses RISK_ALERT message type for critical findings, POSITION_UPDATE otherwise.\n * Fails silently if XMTP is not configured.\n */\nexport async function sendSimulationAlert(\n subdomain: string,\n proposalId: bigint,\n vault: Address,\n execResult: SimulationResult,\n settleResult?: SimulationResult,\n): Promise<void> {\n try {\n const xmtp = await import(\"./xmtp.js\");\n const { getAccount } = await import(\"./client.js\");\n\n const group = await xmtp.getGroup(\"\", subdomain);\n\n // Collect all risks across both results\n const allRisks = [...execResult.risks, ...(settleResult?.risks ?? [])];\n const criticals = allRisks.filter((r) => r.level === \"critical\");\n const warnings = allRisks.filter((r) => r.level === \"warning\");\n\n const highestLevel: RiskLevel = criticals.length > 0 ? \"critical\" : warnings.length > 0 ? \"warning\" : \"info\";\n\n // Build markdown report\n const lines: string[] = [];\n const statusEmoji = highestLevel === \"critical\" ? \"🚨\" : highestLevel === \"warning\" ? \"⚠️\" : \"✅\";\n const statusText = highestLevel === \"critical\" ? \"RISKS DETECTED\" : highestLevel === \"warning\" ? \"WARNINGS\" : \"CLEAN\";\n\n lines.push(`## ${statusEmoji} Proposal #${proposalId} — Simulation Report`);\n lines.push(`**Vault**: \\`${truncAddr(vault)}\\``);\n lines.push(`**Status**: ${statusText}`);\n lines.push(`**Source**: ${execResult.source === \"api\" ? \"Tenderly\" : \"eth_call\"}`);\n lines.push(\"\");\n\n // Execute calls summary\n lines.push(`### Execute Calls ${execResult.success ? \"✓\" : \"✖\"}`);\n for (const cr of execResult.callResults) {\n const icon = cr.success ? \"✓\" : \"✖\";\n const fn = cr.decodedFunction || `${cr.selector}...`;\n const flag = allRisks.find((r) => r.callIndex === cr.index);\n const suffix = flag && flag.level === \"critical\" ? \" ← **\" + flag.code + \"**\" : \"\";\n lines.push(`${cr.index + 1}. ${icon} \\`${fn}\\`${suffix}`);\n }\n lines.push(\"\");\n\n // Settlement calls summary (if present)\n if (settleResult && settleResult.callResults.length > 0) {\n lines.push(`### Settlement Calls ${settleResult.success ? \"✓\" : \"✖\"}`);\n for (const cr of settleResult.callResults) {\n const icon = cr.success ? \"✓\" : \"✖\";\n const fn = cr.decodedFunction || `${cr.selector}...`;\n lines.push(`${cr.index + 1}. ${icon} \\`${fn}\\``);\n }\n lines.push(\"\");\n }\n\n // Risk flags\n if (criticals.length > 0) {\n lines.push(`### 🚨 Critical Risks`);\n for (const r of criticals) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n lines.push(`- **${r.code}**${ref}: ${r.message}`);\n }\n lines.push(\"\");\n }\n\n if (warnings.length > 0) {\n lines.push(`### ⚠️ Warnings`);\n for (const r of warnings) {\n const ref = r.callIndex !== undefined ? ` [call #${r.callIndex + 1}]` : \"\";\n lines.push(`- **${r.code}**${ref}: ${r.message}`);\n }\n lines.push(\"\");\n }\n\n // Action recommendation\n if (highestLevel === \"critical\") {\n lines.push(`### Action Required`);\n lines.push(`Recommend **VETO** — critical risks detected.`);\n } else if (highestLevel === \"warning\") {\n lines.push(`### Review Required`);\n lines.push(`Warnings detected — manual review recommended before execution.`);\n } else {\n lines.push(`### ✅ No Risks Detected`);\n lines.push(`All call targets verified. All calldata decoded. Safe to proceed.`);\n }\n\n const markdown = lines.join(\"\\n\");\n const messageType = highestLevel === \"critical\" ? \"RISK_ALERT\" as const : \"POSITION_UPDATE\" as const;\n\n await xmtp.sendEnvelope(group, {\n type: messageType,\n from: getAccount().address,\n text: markdown,\n data: {\n format: \"markdown\",\n proposalId: Number(proposalId),\n vault,\n riskLevel: highestLevel,\n riskCodes: allRisks.filter((r) => r.level !== \"info\").map((r) => r.code),\n simulationSuccess: execResult.success && (settleResult?.success ?? true),\n },\n timestamp: Math.floor(Date.now() / 1000),\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.yellow(` ⚠ Failed to send XMTP alert: ${message.slice(0, 100)}`));\n }\n}\n","/**\n * Governor commands — sherwood governor <subcommand>\n *\n * View and manage SyndicateGovernor parameters (owner-only setters).\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { formatContractError } from \"../lib/errors.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getRegisteredVaults,\n setVotingPeriod,\n setExecutionWindow,\n setVetoThresholdBps,\n setProtocolFeeBps,\n setMaxPerformanceFeeBps,\n setMaxStrategyDuration,\n setCooldownPeriod,\n} from \"../lib/governor.js\";\nimport { formatDurationLong as formatDuration, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nexport function registerGovernorCommands(program: Command): void {\n const governor = program.command(\"governor\").description(\"Governor parameters and vault management\");\n\n // ── governor info ──\n\n governor\n .command(\"info\")\n .description(\"Display current governor parameters and registered vaults\")\n .action(async () => {\n const spinner = ora(\"Loading governor info...\").start();\n try {\n const [params, vaults] = await Promise.all([\n getGovernorParams(),\n getRegisteredVaults(),\n ]);\n\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Governor Parameters\"));\n SEP();\n console.log(W(` Address: ${G(getGovernorAddress())}`));\n console.log(W(` Voting Period: ${BOLD(formatDuration(params.votingPeriod))}`));\n console.log(W(` Execution Window: ${BOLD(formatDuration(params.executionWindow))}`));\n console.log(W(` Veto Threshold: ${BOLD(`${Number(params.vetoThresholdBps) / 100}%`)}`));\n console.log(W(` Max Performance Fee: ${BOLD(`${Number(params.maxPerformanceFeeBps) / 100}%`)}`));\n console.log(W(` Max Strategy Duration:${BOLD(` ${formatDuration(params.maxStrategyDuration)}`)}`));\n console.log(W(` Cooldown Period: ${BOLD(formatDuration(params.cooldownPeriod))}`));\n\n console.log();\n console.log(LABEL(` Registered Vaults (${vaults.length})`));\n if (vaults.length === 0) {\n console.log(DIM(\" (none)\"));\n } else {\n for (const v of vaults) {\n console.log(W(` ${G(v)}`));\n }\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load governor info\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-voting-period ──\n\n governor\n .command(\"set-voting-period\")\n .description(\"Set the voting period (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New voting period in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting voting period...\").start();\n try {\n const hash = await setVotingPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Voting period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set voting period\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-execution-window ──\n\n governor\n .command(\"set-execution-window\")\n .description(\"Set the execution window (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New execution window in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting execution window...\").start();\n try {\n const hash = await setExecutionWindow(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Execution window change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set execution window\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-veto-threshold ──\n\n governor\n .command(\"set-veto-threshold\")\n .description(\"Set the veto threshold in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New veto threshold in bps (e.g. 4000 = 40%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting veto threshold...\").start();\n try {\n const hash = await setVetoThresholdBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Veto threshold change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set veto threshold\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-fee ──\n\n governor\n .command(\"set-max-fee\")\n .description(\"Set the max performance fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New max fee in bps (e.g. 3000 = 30%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max fee...\").start();\n try {\n const hash = await setMaxPerformanceFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Max performance fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max fee\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-duration ──\n\n governor\n .command(\"set-max-duration\")\n .description(\"Set the max strategy duration in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New max duration in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max duration...\").start();\n try {\n const hash = await setMaxStrategyDuration(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Max strategy duration change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max duration\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-cooldown ──\n\n governor\n .command(\"set-cooldown\")\n .description(\"Set the cooldown period in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New cooldown in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting cooldown...\").start();\n try {\n const hash = await setCooldownPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Cooldown period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set cooldown\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-protocol-fee ──\n\n governor\n .command(\"set-protocol-fee\")\n .description(\"Set the protocol fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New protocol fee in bps (e.g. 500 = 5%, max 1000 = 10%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting protocol fee...\").start();\n try {\n const hash = await setProtocolFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Protocol fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set protocol fee\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Guardian delegation commands — sherwood guardian <subcommand>\n *\n * V1.5: stake-pool delegation into GuardianRegistry, DPoS commission\n * configuration, and Merkl reward-claim navigation. Rewards claim itself\n * happens on merkl.xyz; this CLI prints a deep link + pending-reward\n * summary when the API key is configured.\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { Address } from \"viem\";\nimport { formatUnits, isAddress, parseUnits } from \"viem\";\nimport { getPublicClient, getWalletClient } from \"../lib/client.js\";\nimport { getNetwork } from \"../lib/network.js\";\nimport { SHERWOOD } from \"../lib/addresses.js\";\nimport { formatContractError } from \"../lib/errors.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst WARN = chalk.yellow;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\n// Minimal ABI fragments — only what this command set touches.\nconst GUARDIAN_REGISTRY_ABI = [\n // Guardian stake\n { type: \"function\", name: \"stakeAsGuardian\", inputs: [{ type: \"uint256\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"requestUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"cancelUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimUnstakeGuardian\", inputs: [], outputs: [], stateMutability: \"nonpayable\" },\n // Delegation\n { type: \"function\", name: \"delegateStake\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"requestUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"cancelUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimUnstakeDelegation\", inputs: [{ type: \"address\" }], outputs: [], stateMutability: \"nonpayable\" },\n // Commission\n { type: \"function\", name: \"setCommission\", inputs: [{ type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n // Views\n { type: \"function\", name: \"guardianStake\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"isActiveGuardian\", inputs: [{ type: \"address\" }], outputs: [{ type: \"bool\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"commissionOf\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"delegationOf\", inputs: [{ type: \"address\" }, { type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"delegatedInbound\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n // Guardian-fee claim (vault asset)\n { type: \"function\", name: \"claimProposalReward\", inputs: [{ type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"claimDelegatorProposalReward\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [], stateMutability: \"nonpayable\" },\n] as const;\n\nconst ERC20_ABI = [\n { type: \"function\", name: \"approve\", inputs: [{ type: \"address\" }, { type: \"uint256\" }], outputs: [{ type: \"bool\" }], stateMutability: \"nonpayable\" },\n { type: \"function\", name: \"balanceOf\", inputs: [{ type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" },\n { type: \"function\", name: \"decimals\", inputs: [], outputs: [{ type: \"uint8\" }], stateMutability: \"view\" },\n] as const;\n\nfunction requireAddress(name: string, addr: Address): Address {\n if (addr === \"0x0000000000000000000000000000000000000000\") {\n console.error(chalk.red(`${name} is not deployed on ${getNetwork()}. Update cli/src/lib/addresses.ts after deploy.`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction registry(): Address {\n return requireAddress(\"GUARDIAN_REGISTRY\", SHERWOOD().GUARDIAN_REGISTRY);\n}\n\nfunction wood(): Address {\n return requireAddress(\"WOOD_TOKEN\", SHERWOOD().WOOD_TOKEN);\n}\n\nasync function ensureWoodAllowance(amount: bigint): Promise<void> {\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const addr = wallet.account!.address;\n const current = (await pc.readContract({\n address: wood(),\n abi: [{ type: \"function\", name: \"allowance\", inputs: [{ type: \"address\" }, { type: \"address\" }], outputs: [{ type: \"uint256\" }], stateMutability: \"view\" }] as const,\n functionName: \"allowance\",\n args: [addr, registry()],\n })) as bigint;\n if (current >= amount) return;\n const spinner = ora(\"Approving WOOD...\").start();\n try {\n const hash = await wallet.writeContract({\n address: wood(), abi: ERC20_ABI, functionName: \"approve\", args: [registry(), 2n ** 256n - 1n], chain: null, account: wallet.account!,\n });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(\"WOOD approval granted\");\n } catch (err) {\n spinner.fail(\"WOOD approval failed\");\n throw err;\n }\n}\n\nexport function registerGuardianCommands(program: Command): void {\n const guardian = program.command(\"guardian\").description(\"Guardian staking, delegation, and rewards (V1.5)\");\n\n // ── status ──\n\n guardian\n .command(\"status [address]\")\n .description(\"Show guardian stake + commission + active status for an address (default: caller)\")\n .action(async (addressArg?: string) => {\n const pc = getPublicClient();\n let target: Address;\n if (addressArg) {\n if (!isAddress(addressArg)) {\n console.error(chalk.red(\"Invalid address\"));\n process.exit(1);\n }\n target = addressArg;\n } else {\n const wallet = getWalletClient();\n target = wallet.account!.address;\n }\n\n const spinner = ora(\"Loading...\").start();\n try {\n const [stake, active, commission] = await Promise.all([\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"guardianStake\", args: [target] }) as Promise<bigint>,\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"isActiveGuardian\", args: [target] }) as Promise<boolean>,\n pc.readContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"commissionOf\", args: [target] }) as Promise<bigint>,\n ]);\n const delegatedIn = (await pc.readContract({\n address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"delegatedInbound\", args: [target],\n })) as bigint;\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Guardian Status\"));\n SEP();\n console.log(W(` Address: ${G(target)}`));\n console.log(W(` Active guardian: ${active ? G(\"yes\") : DIM(\"no\")}`));\n console.log(W(` Own stake: ${BOLD(formatUnits(stake, 18))} WOOD`));\n console.log(W(` Delegated inbound: ${BOLD(formatUnits(delegatedIn, 18))} WOOD`));\n console.log(W(` Commission: ${BOLD(`${Number(commission) / 100}%`)}`));\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── stake ──\n\n guardian\n .command(\"stake <amount>\")\n .description(\"Stake as a guardian. Amount in WOOD (min = registry.minGuardianStake).\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent ID to associate (first-stake only)\", \"0\")\n .action(async (amountStr: string, opts: { agentId: string }) => {\n const amount = parseUnits(amountStr, 18);\n const agentId = BigInt(opts.agentId);\n await ensureWoodAllowance(amount);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Staking ${amountStr} WOOD...`).start();\n try {\n const hash = await wallet.writeContract({\n address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"stakeAsGuardian\", args: [amount, agentId], chain: null, account: wallet.account!,\n });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Staked. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Stake failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── unstake (request / cancel / claim) ──\n\n guardian\n .command(\"unstake <action>\")\n .description(\"Unstake flow: 'request' | 'cancel' | 'claim' (7d cooldown)\")\n .action(async (action: string) => {\n const fn = { request: \"requestUnstakeGuardian\", cancel: \"cancelUnstakeGuardian\", claim: \"claimUnstakeGuardian\" }[action];\n if (!fn) {\n console.error(chalk.red(`Unknown action '${action}'. Use request | cancel | claim.`));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`${action}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: fn as any, args: [], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`${action} confirmed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(`${action} failed`);\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── delegate ──\n\n guardian\n .command(\"delegate <delegate> <amount>\")\n .description(\"Delegate WOOD stake to a guardian. Amount in WOOD.\")\n .action(async (delegate: string, amountStr: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const amount = parseUnits(amountStr, 18);\n await ensureWoodAllowance(amount);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Delegating ${amountStr} WOOD to ${delegate}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"delegateStake\", args: [delegate, amount], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Delegated. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Delegation failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n guardian\n .command(\"undelegate <delegate> <action>\")\n .description(\"Unstake-delegation flow: 'request' | 'cancel' | 'claim'\")\n .action(async (delegate: string, action: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const fn = { request: \"requestUnstakeDelegation\", cancel: \"cancelUnstakeDelegation\", claim: \"claimUnstakeDelegation\" }[action];\n if (!fn) {\n console.error(chalk.red(`Unknown action '${action}'. Use request | cancel | claim.`));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`${action}...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: fn as any, args: [delegate], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`${action} confirmed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(`${action} failed`);\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── commission ──\n\n guardian\n .command(\"set-commission <bps>\")\n .description(\"Set your commission rate in bps (0-5000 = 0-50%). Raises capped cumulatively at 500 bps/epoch.\")\n .action(async (bpsStr: string) => {\n const bps = BigInt(bpsStr);\n if (bps > 5000n) {\n console.error(chalk.red(\"Commission cannot exceed 5000 bps (50%)\"));\n process.exit(1);\n }\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(`Setting commission to ${Number(bps) / 100}%...`).start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"setCommission\", args: [bps], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Commission set. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"setCommission failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── reward claims ──\n\n guardian\n .command(\"claim-proposal <proposalId>\")\n .description(\"Claim guardian-fee commission for a settled proposal you voted Approve on (vault asset).\")\n .action(async (pidStr: string) => {\n const pid = BigInt(pidStr);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(\"Claiming...\").start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"claimProposalReward\", args: [pid], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Claimed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Claim failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n guardian\n .command(\"claim-delegator <delegate> <proposalId>\")\n .description(\"Claim your delegator share of a delegate's guardian-fee pool for a specific proposal.\")\n .action(async (delegate: string, pidStr: string) => {\n if (!isAddress(delegate)) {\n console.error(chalk.red(\"Invalid delegate address\"));\n process.exit(1);\n }\n const pid = BigInt(pidStr);\n const wallet = getWalletClient();\n const pc = getPublicClient();\n const spinner = ora(\"Claiming delegator share...\").start();\n try {\n const hash = await wallet.writeContract({ address: registry(), abi: GUARDIAN_REGISTRY_ABI, functionName: \"claimDelegatorProposalReward\", args: [delegate, pid], chain: null, account: wallet.account! });\n await pc.waitForTransactionReceipt({ hash });\n spinner.succeed(`Claimed. Tx: ${hash}`);\n } catch (err) {\n spinner.fail(\"Claim failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── WOOD epoch rewards — Merkl ──\n\n guardian\n .command(\"claim-wood\")\n .description(\"Open merkl.xyz to claim WOOD epoch block-rewards (off-chain distribution).\")\n .action(async () => {\n const wallet = getWalletClient();\n const addr = wallet.account!.address;\n const url = `https://merkl.angle.money/user/${addr}`;\n console.log();\n console.log(LABEL(\" ◆ Merkl Reward Claim\"));\n SEP();\n console.log(W(\" WOOD epoch block-rewards are distributed off-chain via Merkl.\"));\n console.log(W(\" Open this URL in your browser to view + claim pending rewards:\"));\n console.log();\n console.log(G(` ${url}`));\n console.log();\n console.log(WARN(\" Note: guardian-fee rewards (vault assets) are claimed on-chain\"));\n console.log(WARN(\" via `sherwood guardian claim-proposal <pid>`.\"));\n SEP();\n console.log();\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,UAAU,kBAAkB;AAErC,SAAS,qBAAqB;AAG9B,SAAS,SAAS,cAAc;AAChC,SAAS,cAAAA,aAAY,eAAAC,cAAa,aAAAC,kBAAiB;AAEnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,OAAO,SAAS,cAAc;;;ACRvC,SAAS,MAAM,mBAAmB;AAI3B,IAAM,mBAAN,MAAkD;AAAA,EACvD,OAAqB;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAiB,CAAC,MAAM,WAAW;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,QAA0C;AAEhE,UAAM,IAAI,MAAM,4CAAuC;AAAA,EACzD;AAAA,EAEA,MAAM,OAAO,QAAyC;AACpD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,MAAM,QAAwC;AAClD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,QAA2C;AAClE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,YAAY,SAA4C;AAC5D,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;;;AC/BA,SAAS,YAAY,aAAa,WAAW,UAAU,uBAAAC,sBAAqB,2BAA2B;AACvG,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,eAAe,iBAAiB;AACzC,SAAS,eAAe;;;ACTxB,SAAS,cAAc;AAUvB,eAAsB,cACpB,UACwC;AAIxC,QAAM,eAAe,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,UAAU,WAAW;AAC3B,QAAM,QAAQ,SAAS;AAEvB,QAAM,OAAO,MAAM,gBAAgB;AAAA,IACjC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,MAAM,eAAe,IAAI;AAEzC,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,UAAM,IAAI,MAAM,sEAAiE,IAAI,GAAG;AAAA,EAC1F;AAEA,SAAO,EAAE,OAAO,QAAQ,iBAAiB,KAAK;AAChD;;;AC9BO,SAAS,YAAY,OAA4B;AACtD,SAAO,MACJ,IAAI,CAAC,MAAM,MAAM;AAChB,UAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE;AACtC,WAAO,KAAK,IAAI,CAAC,KAAK,KAAK,MAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,SAAS,UAAU;AAAA,EAC5G,CAAC,EACA,KAAK,IAAI;AACd;;;ACjBA,SAAS,qBAAqB,0BAA0B;AAIjD,SAAS,cACd,YACA,QACA,cACA,iBACK;AACL,SAAO;AAAA,IACL;AAAA,MACE,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,IACpB;AAAA,IACA,CAAC,YAAY,QAAQ,cAAc,eAAe;AAAA,EACpD;AACF;AAEO,SAAS,kBACd,OACA,YACA,cACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,YAAY;AAAA,MAC5B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACvDA,SAAS,uBAAAC,sBAAqB,sBAAAC,2BAA0B;AAkBxD,IAAM,oBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,OAAO,MAAM,UAAmB;AAAA,MACxC,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,aAAa,MAAM,OAAgB;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAwC;AACpE,SAAOC,qBAAoB,mBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASC,mBACd,OACA,OACA,aACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,WAAW;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5EA,SAAS,uBAAAE,sBAAqB,sBAAAC,2BAA0B;AAoBxD,IAAMC,qBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,UAAU,MAAM,OAAgB;AAAA,MACxC,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,iBAAiB,MAAM,UAAmB;AAAA,MAClD,EAAE,MAAM,iBAAiB,MAAM,UAAmB;AAAA,IACpD;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAoC;AAChE,SAAOC,qBAAoBF,oBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASG,mBACd,OACA,QACA,SACA,QACA,SACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC7FA,SAAS,uBAAAE,sBAAqB,sBAAAC,qBAAoB,kBAAkB;AAgBpE,IAAMC,qBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,gBAAgB,MAAM,UAAmB;AAAA,MACjD,EAAE,MAAM,uBAAuB,MAAM,UAAmB;AAAA,MACxD,EAAE,MAAM,uBAAuB,MAAM,UAAmB;AAAA,MACxD,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,IACrD;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAuC;AACnE,SAAOC,qBAAoBF,oBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASG,mBACd,OACA,MACA,cACa;AAMb,QAAM,gBAAgB,iBAAiB,KAAK,aAAa;AAEzD,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,aAAa;AAAA,MAC7B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,EAAE;AAAA,MAClB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/FA,SAAS,uBAAAE,sBAAqB,sBAAAC,2BAA0B;AAIjD,SAASC,eACd,YACA,aACA,iBACK;AACL,SAAOC;AAAA,IACL;AAAA,MACE,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,IACpB;AAAA,IACA,CAAC,YAAY,aAAa,eAAe;AAAA,EAC3C;AACF;AAEO,SAASC,mBACd,OACA,YACA,QACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,MAAM;AAAA,MACtB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACtDA,SAAS,uBAAAE,sBAAqB,sBAAAC,2BAA0B;AAUjD,SAASC,eACd,OACA,aACA,mBACA,aACA,aACA,gBACK;AACL,QAAM,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK;AAC7C,QAAM,aAAa,YAAY,IAAI,CAAC,MAAM,OAAO,EAAE,SAAS,CAAC;AAC7D,QAAM,gBAAgB,YAAY,IAAI,CAAC,MAAM,EAAE,aAAa;AAE5D,SAAOC;AAAA,IACL;AAAA,MACE,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,YAAY;AAAA,MACpB,EAAE,MAAM,YAAY;AAAA,MACpB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAASC,mBACd,OACA,OACA,aACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,WAAW;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrFA,SAAS,uBAAAE,sBAAqB,sBAAAC,qBAAoB,cAAAC,mBAAkB;AAI7D,SAASC,eACd,OACA,eACA,iBACA,gBACA,UACA,iBACA,iBACK;AACL,SAAOC;AAAA,IACL;AAAA,MACE,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,SAAS;AAAA,MACjB,EAAE,MAAM,SAAS;AAAA,MACjB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,SAAS;AAAA,IACnB;AAAA,IACA,CAAC,OAAO,eAAe,iBAAiB,gBAAgB,UAAU,iBAAiB,eAAe;AAAA,EACpG;AACF;AAEO,SAASC,mBACd,OACA,OACA,QACa;AAIb,QAAM,gBAAgB,WAAW,KAAKC,cAAa;AAEnD,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,aAAa;AAAA,MAC7B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,EAAE;AAAA,MAClB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ATjDA,SAAS,UAAAE,SAAQ,mBAAyB;AAE1C,IAAM,OAAgB;AAOtB,SAAS,aAAa,QAAmB,MAAqB;AAC5D,MAAI,OAAO,WAAW,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,uCAAuC;AAC9F,QAAM,QAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,KAAK,OAAO,CAAC,EAAE,YAAY,CAAQ;AACzC,QAAI,IAAI,KAAK,QAAQ;AAEnB,YAAM,KAAK,YAAY,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,SAAOA,QAAO,KAAK;AACrB;AAUA,SAAS,mBACP,SACA,SACA,UACA,SACA,KACK;AACL,MAAI,YAAY,qBAAqB;AAEnC,WAAOC,qBAAoB,CAAC,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AAAA,EAC5D;AAEA,MAAI,KAAK;AAEP,UAAM,OAAO,aAAa,CAAC,SAAS,IAAI,KAAK,QAAQ,GAAG,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC;AAC/E,UAAMC,WAAUD,qBAAoB,CAAC,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/D,WAAO,OAAOC,SAAQ,MAAM,CAAC,CAAC;AAAA,EAChC;AAGA,QAAM,UAAUD,qBAAoB,CAAC,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AACnE,SAAO,OAAO,QAAQ,MAAM,CAAC,CAAC;AAChC;AAMA,eAAe,gBACb,OACA,OACA,kBACuD;AACvD,QAAM,UAAU,WAAW;AAC3B,MAAI,YAAY,qBAAqB;AACnC,WAAO;AAAA,MACL,WAAW,mBAAmB,SAAS,OAAO,OAAO,gBAAgB;AAAA,MACrE,WAAW,eAAe,gBAAgB;AAAA,IAC5C;AAAA,EACF;AAEA,QAAM,UAAU,eAAe,OAAO,EAAE,MAAM;AAG9C,QAAM,SAAS,mBAAmB,SAAS,OAAO,KAAK;AACvD,MAAI,QAAQ;AACV,UAAM,YAAY,OAAO,MACrB,mBAAmB,SAAS,OAAO,OAAO,GAAG;AAAA,MAC3C,KAAK,OAAO,IAAI;AAAA,MAChB,OAAO,OAAO,IAAI;AAAA,MAClB,QAAQ,OAAO,IAAI;AAAA,IACrB,CAAC,IACD,mBAAmB,SAAS,OAAO,OAAO,OAAO,OAAO;AAC5D,UAAM,OAAO,OAAO,MAChB,qBAAqB,OAAO,IAAI,KAAK,mBAAS,OAAO,IAAI,MAAM,KAC/D,sBAAsB,OAAO,OAAO;AACxC,WAAO,EAAE,WAAW,WAAW,KAAK;AAAA,EACtC;AAEA,QAAM,eAAe,gBAAgB;AACrC,QAAM,aAAa,QAAQ,EAAE;AAC7B,QAAM,YAAY,CAAC;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,SAAS,YAAY;AAAA,MACpC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,MACpC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,MACpC,EAAE,MAAM,UAAU,MAAM,MAAM;AAAA,MAC9B,EAAE,MAAM,WAAW,MAAM,oBAAoB;AAAA,IAC/C,EAAC,CAAC;AAAA,IACF,SAAS;AAAA,MACP,EAAE,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,UAAU;AAAA,MAAG,EAAE,MAAM,SAAS;AAAA,MAAG,EAAE,MAAM,UAAU;AAAA,IAClF;AAAA,IACA,iBAAiB;AAAA,EACnB,CAAC;AAGD,QAAM,aAAa,MAAM,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY,IAAI,WAAa;AACtF,QAAM,WAAW,CAAC,kBAAkB,KAAO,KAAM,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;AAE5F,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,aAAa,iBAAiB;AAAA,QAClC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,EAAE,SAAS,OAAO,UAAU,OAAO,UAAU,YAAY,KAAK,mBAAmB,GAAG,CAAC;AAAA,MAC9F,CAAC;AACD,qBAAe,SAAS,OAAO,OAAO,EAAE,MAAM,UAAU,SAAS,KAAK,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,CAAC;AACjH,aAAO;AAAA,QACL,WAAW,mBAAmB,SAAS,OAAO,OAAO,GAAG;AAAA,QACxD,WAAW,eAAe,GAAG;AAAA,MAC/B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,OAAO,OAAO,EAAE;AACtB,MAAI,MAAM,YAAY,MAAM,KAAK,YAAY,EAAG,QAAO;AAGvD,MAAI,qBAAoC;AACxC,aAAW,OAAO,CAAC,KAAK,KAAM,GAAK,GAAG;AACpC,QAAI;AACF,YAAM,aAAa,iBAAiB;AAAA,QAClC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,EAAE,SAAS,OAAO,UAAU,MAAM,UAAU,YAAY,KAAK,mBAAmB,GAAG,CAAC;AAAA,MAC7F,CAAC;AACD,2BAAqB;AACrB;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AACA,MAAI,CAAC,mBAAoB,QAAO;AAGhC,QAAM,iBAAiB;AACvB,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,aAAa,iBAAiB;AAAA,QAClC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,gBAAgB,KAAK,mBAAmB,GAAG,CAAC;AAAA,MACjG,CAAC;AACD,YAAM,MAAM,EAAE,KAAK,MAAM,OAAO,oBAAoB,QAAQ,IAAI;AAChE,qBAAe,SAAS,OAAO,OAAO,EAAE,MAAM,aAAa,SAAS,GAAG,KAAK,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,CAAC;AACvH,aAAO;AAAA,QACL,WAAW,mBAAmB,SAAS,OAAO,OAAO,GAAG,GAAG;AAAA,QAC3D,WAAW,cAAc,kBAAkB,mBAAS,GAAG;AAAA,MACzD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,SAAO;AACT;AAWA,IAAM,YAA2B;AAAA,EAC/B;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AAEA,SAAS,gBAAgB,KAAqD;AAC5E,QAAM,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC/C,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,MAAM,IAAI,qBAAqB,GAAG,EAAE,CAAC;AACnD,YAAQ,MAAM,MAAM,IAAI,cAAc,UAAU,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,mBAAmB,EAAE,IAAI,UAAU;AACnD,MAAI,YAAY,MAAM;AACpB,YAAQ,MAAM,MAAM,IAAI,aAAa,IAAI,IAAI,iCAAiC,CAAC;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,EAAE,KAAK,QAAQ;AACxB;AAIA,eAAe,yBACb,aACA,MACA,OACwH;AACxH,MAAI,gBAAgB,mBAAmB;AACrC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,mDAAmD,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAS,KAAK,SAAoB;AACxC,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,SAAS,cAAc,KAAK;AAClC,UAAM,WAAW,MAAM,YAAY,MAAM,SAAS,IAAI;AACtD,UAAM,eAAe,WAAW,KAAK,QAAkB,QAAQ;AAC/D,UAAM,YAAY,WAAY,KAAK,aAAwB,KAAK,QAAkB,QAAQ;AAE1F,WAAO;AAAA,MACL,UAA0B,cAAc,YAAY,QAAQ,cAAc,SAAS;AAAA,MACnF,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,oDAAoD,CAAC;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAe,KAAK,SAAoB;AAC9C,UAAM,QAAQ,aAAa,WAAW;AACtC,UAAM,MAAM,OAAO,EAAE;AACrB,UAAM,WAAW,MAAM,YAAY,MAAM,IAAI,YAAY;AACzD,UAAM,WAAW,YAAY,YAAY,MAAM,SAAS,IAAI;AAC5D,UAAM,cAAc,WAAW,KAAK,QAAkB,QAAQ;AAC9D,UAAM,QAAS,KAAK,SAAqB,WAAW,EAAE;AACtD,UAAM,cAAc,CAAC,CAAC,KAAK;AAG3B,QAAI,SAAS;AACb,QAAI,CAAC,UAAU;AACb,UAAI,KAAK,QAAQ;AACf,iBAAS,WAAW,KAAK,QAAkB,EAAE;AAAA,MAC/C,OAAO;AAEL,cAAM,eAAe,gBAAgB;AACrC,cAAM,gBAAgB,CAAC;AAAA,UACrB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,iBAAiB;AAAA,UACjB,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,YACpC,EAAE,MAAM,UAAU,MAAM,WAAW,YAAY;AAAA,cAC7C,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,cAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,cAC9B,EAAE,MAAM,UAAU,MAAM,OAAO;AAAA,cAC/B,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,YACrC,EAAC;AAAA,UACH;AAAA,UACA,SAAS,CAAC,EAAE,MAAM,WAAW,MAAM,YAAY,CAAC;AAAA,QAClD,CAAC;AAED,cAAM,SAAS,cACX,CAAC,EAAE,MAAM,OAAO,IAAI,KAAK,QAAQ,OAAO,SAAS,UAAU,EAAE,QAAQ,CAAC,IACtE;AAAA,UACE,EAAE,MAAM,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,OAAO,SAAS,UAAU,EAAE,QAAQ;AAAA,UAC9E,EAAE,MAAM,OAAO,EAAE,MAAM,IAAI,KAAK,QAAQ,OAAO,SAAS,UAAU,EAAE,QAAQ;AAAA,QAC9E;AAEJ,YAAI;AACF,gBAAM,UAAU,MAAM,aAAa,aAAa;AAAA,YAC9C,SAAS,UAAU,EAAE;AAAA,YACrB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,aAAa,MAAM;AAAA,UAC5B,CAAC;AACD,gBAAM,cAAc,QAAQ,QAAQ,SAAS,CAAC;AAE9C,mBAAU,cAAc,MAAO;AAC/B,kBAAQ,IAAI,MAAM,IAAI,0BAA0B,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,0BAA0B,OAAO,WAAW,IAAI,MAAM,QAAQ,CAAC,CAAC,OAAO,CAAC;AAAA,QAC3J,QAAQ;AACN,kBAAQ,MAAM,MAAM,IAAI,wEAAmE,CAAC;AAC5F,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAkD;AAAA,MACtD;AAAA,MACA,MAAM,WAAW,OAAO,OAAO,EAAE;AAAA,MACjC;AAAA,MACA,MAAM,OAAO,EAAE;AAAA,MACf,YAAY,WAAW,OAAO,UAAU,EAAE;AAAA,MAC1C,aAAa,WAAW,OAAO,UAAU,EAAE;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACb;AAEA,WAAO;AAAA,MACL,UAAwBE,eAAc,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB;AAClC,eAAW,QAAQ,CAAC,UAAU,UAAU,WAAW,WAAW,SAAS,GAAG;AACxE,UAAI,CAAC,KAAK,IAAI,GAAG;AACf,gBAAQ,MAAM,MAAM,IAAI,KAAK,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY,CAAC,wCAAwC,CAAC;AACnH,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,gBAAgB;AACrC,UAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,aAAa,aAAa,EAAE,SAAS,QAAQ,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,MACtF,aAAa,aAAa,EAAE,SAAS,QAAQ,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,IACxF,CAAC;AACD,UAAM,UAAU,WAAW,KAAK,SAAmB,SAAS;AAC5D,UAAM,UAAU,WAAW,KAAK,SAAmB,SAAS;AAC5D,UAAM,UAAU,WAAY,KAAK,WAAsB,KAAK,SAAS;AACrE,UAAM,UAAU,WAAY,KAAK,WAAsB,KAAK,SAAS;AAErE,UAAM,SAAiD;AAAA,MACrD;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,CAAC,KAAK;AAAA,MACf,SAAS,UAAU,EAAE;AAAA,MACrB,QAAQ,UAAU,EAAE;AAAA,MACpB,OAAQ,KAAK,SAAqB;AAAA,MAClC,SAAS,KAAK;AAAA,MACd,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAEA,WAAO;AAAA,MACL,UAA2BA,eAAc,MAAM;AAAA,MAC/C,OAAO;AAAA,MACP,aAAa;AAAA,MACb,gBAAgB,CAAC,EAAE,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,gBAAgB,mBAAmB;AACrC,UAAM,eAAe,KAAK,SAAS,WAAW,KAAK,QAAkB,EAAE,IAAI;AAC3E,UAAM,cAAc,OAAQ,KAAK,YAAuB,KAAK;AAI7D,UAAM,MAAM,OAAO;AACnB,UAAM,sBAAuB,OAAO,SAAS,eAAgB;AAC7D,UAAM,sBAAuB,OAAO,SAAS,eAAgB;AAE7D,UAAM,SAAiD;AAAA,MACrD,MAAM,OAAO,EAAE;AAAA,MACf,QAAQ,OAAO,EAAE;AAAA,MACjB,SAAS,SAAS,EAAE;AAAA,MACpB,YAAY,UAAU,EAAE;AAAA,MACxB,aAAa,UAAU,EAAE;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAEA,WAAO;AAAA,MACL,UAAwBA,eAAc,MAAM;AAAA,MAC5C,OAAO,OAAO,EAAE;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,gBAAgB,cAAc;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,8CAA8C,CAAC;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,CAAC,KAAK,aAAa;AACrB,cAAQ,MAAM,MAAM,IAAI,oDAAoD,CAAC;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAS,KAAK,SAAoB;AACxC,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,WAAW,MAAM,YAAY,MAAM,SAAS,IAAI;AACtD,UAAM,SAAS,WAAW,KAAK,QAAkB,QAAQ;AACzD,UAAM,kBAAkB,WAAY,KAAK,aAAwB,KAAK,QAAkB,QAAQ;AAEhG,WAAO;AAAA,MACL,UAAsBA,eAAc,YAAY,KAAK,aAAwB,eAAe;AAAA,MAC5F,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,gBAAgB,aAAa;AAC/B,QAAI,CAAC,KAAK,QAAQ;AAAE,cAAQ,MAAM,MAAM,IAAI,6CAA6C,CAAC;AAAG,cAAQ,KAAK,CAAC;AAAA,IAAG;AAC9G,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,SAAS;AACjC,cAAQ,MAAM,MAAM,IAAI,4DAA4D,CAAC;AACrF,cAAQ,MAAM,MAAM,IAAI,wDAAwD,CAAC;AACjF,cAAQ,MAAM,MAAM,IAAI,sDAAsD,CAAC;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,OAAO;AACtB,UAAM,eAAe,WAAW,MAAM,sBAAsB,SAAS;AACrE,UAAM,cAAe,KAAK,SAAoB;AAC9C,UAAM,QAAQ,aAAa,WAAW;AACtC,UAAM,WAAW,YAAY,YAAY,MAAM,SAAS,IAAI;AAC5D,UAAM,cAAc,WAAW,KAAK,QAAkB,QAAQ;AAC9D,UAAM,iBAAiB,OAAQ,KAAK,eAA0B,KAAK;AACnE,UAAM,UAAW,KAAK,WAAsB;AAE5C,UAAM,aAAc,KAAK,OAAkB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM;AAC/D,YAAM,UAAU,EAAE,KAAK;AACvB,UAAI,UAAU,OAAO,EAAG,QAAO;AAC/B,YAAM,YAAY;AAClB,YAAM,WAAW,UAAU,QAAQ,YAAY,CAAC;AAChD,UAAI,YAAY,aAAa,KAAM,QAAO;AAC1C,cAAQ,MAAM,MAAM,IAAI,kBAAkB,OAAO,EAAE,CAAC;AAAG,cAAQ,KAAK,CAAC;AAAA,IACvE,CAAC;AACD,UAAM,aAAc,KAAK,QAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,CAAC;AAClF,QAAI,WAAW,WAAW,WAAW,QAAQ;AAAE,cAAQ,MAAM,MAAM,IAAI,8CAA8C,CAAC;AAAG,cAAQ,KAAK,CAAC;AAAA,IAAG;AAC1I,QAAI,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,KAAO;AAAE,cAAQ,MAAM,MAAM,IAAI,2BAA2B,CAAC;AAAG,cAAQ,KAAK,CAAC;AAAA,IAAG;AAE/H,UAAM,cAAe,KAAK,eAA2B,mBAAmB;AACxE,UAAM,oBAAoB,UAAU,EAAE;AAGtC,YAAQ,IAAI,MAAM,IAAI,4BAA4B,CAAC;AACnD,UAAM,cAAmD,CAAC;AAC1D,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,QAAQ,WAAW,CAAC;AAC1B,YAAM,QAAQ,MAAM,gBAAgB,OAAO,OAAO,OAAO,OAAO,CAAC;AACjE,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,IAAI,2BAA2B,KAAK,4CAA4C,CAAC;AACrG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC,cAAS,MAAM,SAAS,EAAE,CAAC;AAC1E,kBAAY,KAAK;AAAA,QACf;AAAA,QAAO,WAAW,WAAW,CAAC;AAAA,QAC9B,eAAe,MAAM;AAAA,MACvB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,UAA2BA,eAAc,OAAO,aAAa,mBAAmB,aAAa,aAAa,cAAc;AAAA,MACxH;AAAA,MAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,UAAM,QAAS,KAAK,SAAoB;AACxC,UAAM,QAAQ,aAAa,KAAK;AAChC,UAAM,WAAW,MAAM,YAAY,MAAM,SAAS,IAAI;AAEtD,UAAM,gBAAgB,KAAK,SAAS,WAAW,KAAK,QAAkB,QAAQ,IAAI;AAMlF,QAAI,kBAAkB,MAAM,CAAC,KAAK,WAAW;AAC3C,cAAQ,MAAM,MAAM;AAAA,QAClB;AAAA,MAGF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,KAAK,YACnB,WAAW,KAAK,WAAqB,QAAQ,IAC7C,KAAK,SACH,WAAW,KAAK,QAAkB,QAAQ,IAC1C;AACN,UAAM,WAAW,OAAQ,KAAK,YAAuB,IAAI;AACzD,UAAM,aAAa,OAAQ,KAAK,cAAyB,GAAG;AAC5D,UAAM,cAAc,WAAY,KAAK,eAA0B,UAAU,QAAQ;AACjF,UAAM,eAAe,OAAQ,KAAK,mBAA8B,IAAI;AACpE,WAAO;AAAA,MACL,UAAiCA,eAAc,OAAO,eAAe,WAAW,YAAY,UAAU,aAAa,YAAY;AAAA,MAC/H;AAAA,MAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC,WAAW,EAAE;AAChE;AAEA,SAAS,sBACP,aACA,OACA,OACA,aACA,gBACyD;AACzD,MAAI,gBAAgB,mBAAmB;AACrC,WAAO;AAAA,MACL,cAA8B,kBAAkB,OAAO,OAAO,WAAW;AAAA,MACzE,aAA6B,iBAAiB,KAAK;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,WAAO;AAAA,MACL,cAA4BC,mBAAkB,OAAO,OAAO,WAAW;AAAA,MACvE,aAA2BC,kBAAiB,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB;AAClC,UAAM,SAAS,iBAAiB,CAAC,GAAG,SAAS;AAC7C,UAAM,UAAU,iBAAiB,CAAC,GAAG,UAAU;AAC/C,WAAO;AAAA,MACL,cAA+BD,mBAAkB,OAAO,OAAO,aAAa,QAAQ,OAAO;AAAA,MAC3F,aAA8BC,kBAAiB,KAAK;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,gBAAgB,mBAAmB;AACrC,WAAO;AAAA,MACL,cAA4BD,mBAAkB,OAAO,OAAO,WAAW;AAAA,MACvE,aAA2BC,kBAAiB,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,gBAAgB,cAAc;AAChC,WAAO;AAAA,MACL,cAA0BD,mBAAkB,OAAO,OAAO,WAAW;AAAA,MACrE,aAAyBC,kBAAiB,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,gBAAgB,aAAa;AAC/B,WAAO;AAAA,MACL,cAA+BD,mBAAkB,OAAO,OAAO,WAAW;AAAA,MAC1E,aAA8BC,kBAAiB,KAAK;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,WAAO;AAAA,MACL,cAAqCD,mBAAkB,OAAO,OAAO,WAAW;AAAA,MAChF,aAAoCC,kBAAiB,KAAK;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC,WAAW,EAAE;AAChE;AAIA,SAAS,qBAA8B;AACrC,QAAM,UAAU,WAAW;AAC3B,MAAI,YAAY,qBAAqB;AACnC,QAAI,QAAQ,EAAE,WAAW,MAAM;AAAE,cAAQ,MAAM,MAAM,IAAI,2BAA2B,CAAC;AAAG,cAAQ,KAAK,CAAC;AAAA,IAAG;AACzG,WAAO;AAAA,EACT;AACA,QAAM,cAAc,QAAQ,EAAE;AAC9B,MAAI,gBAAgB,KAAM,QAAO;AACjC,UAAQ,MAAM,MAAM,IAAI,8EAA8E,CAAC;AACvG,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,aAAa,iBAAkC;AACtD,MAAI,UAAU,eAAe,EAAG,QAAO;AACvC,QAAM,QAAQ,gBAAgB,YAAY;AAC1C,QAAM,SAAS,OAAO;AACtB,QAAM,WAAoC;AAAA,IACxC,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,KAAK,OAAO,EAAE;AAAA,EAChB;AACA,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,CAAC,QAAQ,SAAS,MAAM;AAC1B,YAAQ,MAAM,MAAM,IAAI,kBAAkB,eAAe,EAAE,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,aAA8B;AACnD,QAAM,QAAQ,YAAY,YAAY;AACtC,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAqC;AAAA,IACzC,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,EACjB;AACA,QAAM,OAAO,UAAU,KAAK;AAC5B,MAAI,CAAC,QAAQ,SAAS,MAAM;AAC1B,YAAQ,MAAM,MAAM,IAAI,2BAA2B,WAAW,EAAE,CAAC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAA4B;AAClD,SAAO,KAAK;AAAA,IACV,MAAM,IAAI,CAAC,OAAO;AAAA,MAChB,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,OAAO,EAAE,MAAM,SAAS;AAAA,IAC1B,EAAE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAIO,SAAS,iCAAiCC,WAAyB;AAGxE,EAAAA,UACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACZ,UAAM,YAAY,mBAAmB;AACrC,UAAM,UAAU,WAAW;AAE3B,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,oBAAoB,GAAG,MAAM,IAAI,IAAI,OAAO,GAAG,CAAC;AACvE,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,QAAI,iBAAiB;AACrB,eAAW,KAAK,WAAW;AACzB,YAAM,OAAO,UAAU,EAAE,UAAU;AACnC,UAAI,SAAS,MAAM;AACjB;AACA,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,KAAK,MAAM,KAAK,EAAE,IAAI,CAAC,KAAK,MAAM,KAAK,EAAE,GAAG,CAAC,GAAG;AAC5D,gBAAQ,IAAI,OAAO,EAAE,WAAW,EAAE;AAClC,gBAAQ,IAAI,iBAAiB,MAAM,MAAM,IAAI,CAAC,EAAE;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,mBAAmB,GAAG;AACxB,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,OAAO,mDAAmD,CAAC;AAAA,IAC/E;AAEA,UAAM,cAAc,UAAU,OAAO,CAAC,MAAM,UAAU,EAAE,UAAU,MAAM,IAAI;AAC5E,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,IAAI,sBAAsB,OAAO,GAAG,CAAC;AACvD,iBAAW,KAAK,aAAa;AAC3B,gBAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE,GAAG,GAAG,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,IAAI,0EAA0E,CAAC;AACjG,YAAQ,IAAI,MAAM,IAAI,4EAA4E,CAAC;AACnG,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAA,UACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,SAAS,cAAc,qHAAqH,EAC5I,eAAe,qBAAqB,eAAe,EAEnD,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,oCAAoC,EAE/D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,oCAAoC,EAE3D,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,mBAAmB,mCAAmC,EAE7D,OAAO,oBAAoB,uDAAuD,EAElF,OAAO,4BAA4B,qCAAqC,EAExE,OAAO,mBAAmB,wDAAwD,EAClF,OAAO,oBAAoB,+DAA+D,EAC1F,OAAO,wBAAwB,4CAA4C,EAC3E,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,4BAA4B,kCAAkC,EAErE,OAAO,uBAAuB,qDAAqD,EACnF,OAAO,0BAA0B,yDAAyD,EAC1F,OAAO,oBAAoB,oDAAoD,EAC/E,OAAO,2BAA2B,8DAA8D,EAChG,OAAO,4BAA4B,oDAAoD,EACvF,OAAO,OAAO,aAAqB,SAAS;AAC3C,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,KAAK,SAAS,aAAa,IAAI,gBAAgB,WAAW;AAGlE,UAAM,eAAe,IAAI,WAAW,IAAI,IAAI,cAAc,EAAE,MAAM;AAClE,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,YAAY;AAC/C,cAAQ,OAAO;AACf,kBAAY,OAAO;AACnB,mBAAa,QAAQ,WAAW,MAAM,MAAM,KAAK,CAAC,EAAE;AACpD,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,SAAS,CAAC,EAAE,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,mBAAa,KAAK,cAAc;AAChC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,cAAc,IAAI,0BAA0B,EAAE,MAAM;AAC1D,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,yBAAyB,aAAa,MAAM,KAAK;AAC5E,YAAM,UAAU,WAAW;AAE3B,YAAM,WAAW,MAAM,uBAAuB;AAAA,QAC5C;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ,SAAS,QAAQ;AAAA,MACzC,CAAC;AAED,YAAM,UAAU,MAAM,eAAe,QAAQ;AAC7C,UAAI,QAAQ,WAAW,YAAY;AACjC,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,kBAAY,QAAQ,aAAa;AAAA,IACnC,SAAS,KAAK;AACZ,kBAAY,KAAK,mBAAmB;AACpC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,uBAAuB,GAAG,MAAM,MAAM,KAAK,CAAC;AACnE,YAAQ,IAAI,MAAM,IAAI,gDAAgD,CAAC;AACvE,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAA,UACG,QAAQ,MAAM,EACd,YAAY,iEAAiE,EAC7E,SAAS,cAAc,qHAAqH,EAC5I,eAAe,qBAAqB,6BAA6B,EACjE,eAAe,qBAAqB,eAAe,EAEnD,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,oCAAoC,EAE/D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,oCAAoC,EAE3D,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,mBAAmB,mCAAmC,EAE7D,OAAO,oBAAoB,uDAAuD,EAElF,OAAO,4BAA4B,qCAAqC,EAExE,OAAO,mBAAmB,wDAAwD,EAClF,OAAO,oBAAoB,+DAA+D,EAC1F,OAAO,wBAAwB,4CAA4C,EAC3E,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,4BAA4B,kCAAkC,EAErE,OAAO,uBAAuB,qDAAqD,EACnF,OAAO,0BAA0B,yDAAyD,EAC1F,OAAO,oBAAoB,oDAAoD,EAC/E,OAAO,2BAA2B,8DAA8D,EAChG,OAAO,4BAA4B,oDAAoD,EACvF,OAAO,OAAO,aAAqB,SAAS;AAC3C,UAAM,QAAQ,KAAK;AACnB,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,oBAAgB,WAAW;AAG3B,UAAM,eAAe,gBAAgB;AACrC,UAAM,eAAe,MAAM,aAAa,aAAa;AAAA,MACnD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AAED,QAAI,iBAAiB,8CAA8C;AACjE,cAAQ,MAAM,MAAM,IAAI,qCAAqC,YAAY,GAAG,CAAC;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,IAAI,gCAAgC,EAAE,MAAM;AAChE,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,yBAAyB,aAAa,MAAM,KAAK;AAC5E,YAAM,UAAU,WAAW;AAE3B,YAAM,WAAW,MAAM,uBAAuB;AAAA,QAC5C;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ,SAAS,QAAQ;AAAA,MACzC,CAAC;AAED,YAAM,UAAU,MAAM,eAAe,QAAQ;AAC7C,UAAI,QAAQ,WAAW,YAAY;AACjC,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,kBAAY,QAAQ,aAAa;AACjC,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC5D,SAAS,KAAK;AACZ,kBAAY,KAAK,mBAAmB;AACpC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,gBAAgB,MAAM,aAAa,aAAa;AAAA,MACpD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AAED,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,oBAAoB,GAAG,MAAM,MAAM,KAAK,CAAC;AAChE,YAAQ,IAAI,eAAe,MAAM,MAAM,aAAa,CAAC,EAAE;AACvD,YAAQ,IAAI,eAAe,MAAM,MAAM,WAAW,EAAE,OAAO,CAAC,EAAE;AAC9D,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAA,UACG,QAAQ,SAAS,EACjB,YAAY,sEAAsE,EAClF,SAAS,cAAc,qHAAqH,EAC5I,eAAe,qBAAqB,eAAe,EACnD,OAAO,uBAAuB,mEAAmE,EAEjG,OAAO,iBAAiB,eAAe,EACvC,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,yBAAyB,mCAAmC,EAEnE,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,mBAAmB,mCAAmC,EAE7D,OAAO,oBAAoB,uDAAuD,EAElF,OAAO,4BAA4B,qCAAqC,EAExE,OAAO,mBAAmB,wDAAwD,EAClF,OAAO,oBAAoB,+DAA+D,EAC1F,OAAO,wBAAwB,4CAA4C,EAC3E,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,4BAA4B,kCAAkC,EAErE,OAAO,uBAAuB,qDAAqD,EACnF,OAAO,0BAA0B,yDAAyD,EAC1F,OAAO,oBAAoB,oDAAoD,EAC/E,OAAO,2BAA2B,8DAA8D,EAChG,OAAO,4BAA4B,oDAAoD,EACvF,OAAO,OAAO,aAAqB,SAAS;AAC3C,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,KAAK,SAAS,aAAa,IAAI,gBAAgB,WAAW;AAKlE,UAAM,UAAU,WAAW;AAC3B,UAAM,mBAAmB,IAAI,qBAAqB,EAAE,MAAM;AAC1D,QAAI;AACF,YAAM,eAAe,gBAAgB;AAGrC,YAAM,eAAe,MAAM,aAAa,aAAa;AAAA,QACnD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AACD,UAAI,CAAC,cAAc;AACjB,yBAAiB,KAAK,kBAAkB;AACxC,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,YAAY,QAAQ,OAAO,iCAAiC,KAAK;AAAA,4DACF,QAAQ,OAAO;AAAA,UAChF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,SAAS,MAAM,aAAa,aAAa;AAAA,QAC7C,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AACD,UAAI,QAAQ;AACV,yBAAiB,KAAK,kBAAkB;AACxC,gBAAQ,MAAM,MAAM,IAAI,WAAW,KAAK,6BAA6B,CAAC;AACtE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,QAAQ,cAAc;AAAA,IACzC,SAAS,KAAK;AACZ,uBAAiB,KAAK,kBAAkB;AACxC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,eAAe,IAAI,WAAW,IAAI,IAAI,cAAc,EAAE,MAAM;AAClE,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,YAAY;AAC/C,cAAQ,OAAO;AACf,mBAAa,QAAQ,WAAW,MAAM,MAAM,KAAK,CAAC,EAAE;AACpD,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,OAAO,IAAI,CAAC,EAAE,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,mBAAa,KAAK,cAAc;AAChC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,cAAc,IAAI,0BAA0B,EAAE,MAAM;AAC1D,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,MAAM,yBAAyB,aAAa,MAAM,KAAK;AACrE,cAAQ,MAAM;AACd,oBAAc,MAAM;AACpB,uBAAiB,MAAM;AAGvB,YAAM,WAAW,MAAM,uBAAuB;AAAA,QAC5C;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ,SAAS,MAAM,QAAQ;AAAA,MAC/C,CAAC;AAED,YAAM,cAAc,MAAM,eAAe,QAAQ;AACjD,UAAI,YAAY,WAAW,YAAY;AACrC,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,kBAAY,QAAQ,aAAa;AAAA,IACnC,SAAS,KAAK;AACZ,kBAAY,KAAK,mBAAmB;AACpC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,EAAE,cAAc,YAAY,IAAI;AAAA,MACpC;AAAA,MAAa;AAAA,MAAO;AAAA,MAAO;AAAA,MAAa;AAAA,IAC1C;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,kBAAkB,aAAa,MAAM,IAAI,CAAC;AACjE,YAAQ,IAAI,YAAY,YAAY,CAAC;AACrC,YAAQ,IAAI,MAAM,KAAK,iBAAiB,YAAY,MAAM,IAAI,CAAC;AAC/D,YAAQ,IAAI,YAAY,WAAW,CAAC;AAGpC,QAAI,KAAK,YAAY;AACnB,YAAM,MAAM,QAAQ,KAAK,UAAoB;AAC7C,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAElC,YAAM,WAAW,QAAQ,KAAK,cAAc;AAC5C,YAAM,aAAa,QAAQ,KAAK,aAAa;AAC7C,oBAAc,UAAU,eAAe,YAAY,CAAC;AACpD,oBAAc,YAAY,eAAe,WAAW,CAAC;AAErD,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,MAAM,mBAAmB,QAAQ,EAAE,CAAC;AACtD,cAAQ,IAAI,MAAM,MAAM,mBAAmB,UAAU,EAAE,CAAC;AACxD,cAAQ,IAAI,MAAM,MAAM,mBAAmB,KAAK,EAAE,CAAC;AACnD,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,IAAI,cAAc,CAAC;AACrC,cAAQ,IAAI,MAAM,IAAI,+BAA+B,CAAC;AACtD,cAAQ,IAAI,MAAM,IAAI,eAAe,KAAK,KAAK,CAAC;AAChD,cAAQ,IAAI,MAAM,IAAI,yCAAyC,CAAC;AAChE,cAAQ,IAAI,MAAM,IAAI,0CAA0C,CAAC;AACjE,cAAQ,IAAI,MAAM,IAAI,uBAAuB,QAAQ,KAAK,CAAC;AAC3D,cAAQ,IAAI,MAAM,IAAI,sBAAsB,UAAU,EAAE,CAAC;AAEzD,UAAI,gBAAgB,oBAAoB;AACtC,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,OAAO,4DAA4D,CAAC;AACtF,gBAAQ,IAAI,MAAM,OAAO,mBAAmB,KAAK,sBAAsB,CAAC;AACxE,gBAAQ,IAAI,MAAM,OAAO,4EAA4E,CAAC;AAAA,MACxG;AAEA,cAAQ,IAAI;AACZ;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,kBAAkB,CAAC,KAAK,UAAU;AACxD,cAAQ,MAAM,MAAM,IAAI,kGAAkG,CAAC;AAC3H,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,wBAAoB;AACrD,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,oBAAgB;AACjD,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,wBAAoB;AAE3D,UAAM,oBAAoB,OAAO,KAAK,cAAwB;AAC9D,QAAI,oBAAoB,MAAM,oBAAoB,QAAQ;AACxD,cAAQ,MAAM,MAAM,IAAI,kDAAkD,CAAC;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,mBAAmBA,eAAc,KAAK,QAAkB;AAG9D,UAAM,cAAc,IAAI,6BAA6B,EAAE,MAAM;AAC7D,QAAI;AACJ,QAAI;AACF,YAAM,WAAW;AAAA,QACf,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,eAAe;AAAA,QACjC,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA,eAAe;AAAA,QACf,UAAU,IAAI;AAAA,QACd,mBAAmB,OAAO,iBAAiB;AAAA,QAC3C,kBAAkB,OAAO,gBAAgB;AAAA,QACzC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,oBAAc,MAAM,QAAQ,UAAU,KAAK,IAAc;AACzD,kBAAY,QAAQ,oBAAoB,WAAW,EAAE;AAAA,IACvD,SAAS,KAAK;AACZ,kBAAY,KAAK,iBAAiB;AAClC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,iBAAiB,IAAI,wBAAwB,EAAE,MAAM;AAC3D,QAAI;AACF,YAAM,EAAE,MAAM,WAAW,IAAI,MAAMD;AAAA,QACjC;AAAA,QAAO;AAAA,QAAa;AAAA,QAAmB;AAAA,QACvC;AAAA,QAAc;AAAA,MAChB;AACA,qBAAe,QAAQ,aAAa,UAAU,UAAU;AACxD,cAAQ,IAAI,aAAa,UAAU,EAAE;AACrC,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,IAAI,CAAC,EAAE,CAAC;AACtD,cAAQ,IAAI,MAAM,IAAI,YAAY,KAAK,EAAE,CAAC;AAAA,IAC5C,SAAS,KAAK;AACZ,qBAAe,KAAK,iBAAiB;AACrC,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,gBAAgB,oBAAoB;AACtC,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,OAAO,aAAa,CAAC;AACvC,cAAQ,IAAI,MAAM,OAAO,iDAAiD,CAAC;AAC3E,cAAQ,IAAI,MAAM,OAAO,uEAAuE,CAAC;AACjG,cAAQ,IAAI,MAAM,OAAO,iEAAiE,CAAC;AAC3F,cAAQ,IAAI,MAAM,OAAO,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC7E;AAEA,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAD,UACG,QAAQ,QAAQ,EAChB,YAAY,0FAAqF,EACjG,SAAS,WAAW,wBAAwB,EAC5C,OAAO,UAAU,oDAAoD,EACrE,OAAO,OAAO,UAAkB,SAAS;AACxC,QAAI,CAAC,UAAU,QAAQ,GAAG;AACxB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAQ;AACd,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,WAAW;AAC3B,UAAM,WAAW,CAAC,CAAC,KAAK;AAExB,UAAM,UAAU,WAAW,OAAO,IAAI,2BAA2B,EAAE,MAAM;AACzE,QAAI;AAEF,YAAM,CAAC,UAAU,OAAO,UAAU,WAAW,aAAa,aAAa,aAAa,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrH,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,QAAQ,CAAC;AAAA,QAChG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,QAAQ,CAAC;AAAA,QAChG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,WAAW,CAAC;AAAA,QACnG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,QAAQ,CAAC;AAAA,QAChG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,cAAc,CAAC;AAAA,QACtG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,iBAAiB,CAAC;AAAA,QACzG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,iBAAiB,CAAC;AAAA,QACzG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,mBAAmB,CAAC;AAAA,MAC7G,CAAC;AAED,YAAM,aAAa,CAAC,WAAW,YAAY,SAAS;AACpD,YAAM,WAAW,WAAW,OAAO,QAAQ,CAAC,KAAK,WAAW,QAAQ;AAGpE,YAAM,CAAC,eAAe,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrD,aAAa,aAAa,EAAE,SAAS,WAAW,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,QACzF,aAAa,aAAa,EAAE,SAAS,WAAW,KAAK,UAAU,cAAc,SAAS,CAAC;AAAA,MACzF,CAAC;AAGD,YAAM,aAAa,YAAY,IAAI,CAAC,MAAM,QAAQ,IAAI;AAAA,QACpD,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,QACvG,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,SAAS,CAAC;AAAA,QACrF,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,MACzF,CAAC,CAAC;AACF,YAAM,YAAY,MAAM,QAAQ,IAAI,UAAU;AAG9C,YAAM,eAAe,MAAM,aAAa,aAAa;AAAA,QACnD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK;AAAA,MACd,CAAC;AAGD,YAAM,WAAW,cAAc,IAAI,CAAC,SAAS;AAC3C,YAAI;AACF,gBAAM,CAAC,GAAG,IAAI,oBAAoB,CAAC,EAAE,MAAM,SAAS,CAAC,GAAG,IAAI;AAC5D,iBAAO,OAAO,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK,MAAS,OAAO,GAAG,IAAI;AAAA,QAClE,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAGD,UAAI,SAA0D,CAAC;AAC/D,UAAI,cAA4C;AAChD,UAAI;AACF,cAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qBAAiB;AAChE,iBAAS,MAAM,sBAAsB;AAAA,UACnC,QAAQ,YAAY,IAAI,CAAC,GAAG,OAAO;AAAA,YACjC,OAAO,EAAE;AAAA,YACT,eAAe,UAAU,CAAC,EAAE,CAAC;AAAA,YAC7B,SAAS,SAAS,CAAC;AAAA,UACrB,EAAE;AAAA,UACF,OAAO;AAAA,UACP;AAAA,QACF,CAAC;AACD,sBAAc,OAAO,KAAK,CAAC,MAAM,MAAM,IAAI,GAAG,UAAU;AAAA,MAC1D,QAAQ;AAAA,MAER;AAEA,YAAM,kBAAkB,OAAO,KAAK,CAAC,MAAM,MAAM,IAAI;AAGrD,YAAM,kBAAkB,OAAO,YAAY,cAAwB,aAAa,CAAC;AACjF,UAAI,sBAAsB;AAC1B,UAAI,gBAAgB;AAkBpB,YAAM,gBAA+B,YAAY,IAAI,CAAC,OAAO,MAAM;AACjE,cAAM,CAAC,SAAS,QAAQ,QAAQ,IAAI,UAAU,CAAC;AAC/C,cAAM,aAAa,OAAO,YAAY,SAAmB,QAAQ,CAAC;AAClE,cAAM,cAAc,OAAO,YAAY,MAAM,gBAAgB,aAAa,CAAC;AAC3E,yBAAiB,MAAM;AAEvB,cAAM,QAAQ,OAAO,CAAC;AACtB,YAAI,eAA8B;AAElC,YAAI,OAAO;AACT,yBAAe,aAAa,MAAM;AAClC,iCAAuB;AAAA,QACzB;AAEA,eAAO;AAAA,UACL,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO,MAAM,eAAe;AAAA,UAC7C,SAAS,YAAY,SAAmB,QAAQ;AAAA,UAChD,YAAa,QAAmB,SAAS;AAAA,UACzC,gBAAgB,YAAY,MAAM,gBAAgB,aAAa;AAAA,UAC/D,cAAc,OAAO,SAAS;AAAA,UAC9B;AAAA,UACA,iBAAiB;AAAA;AAAA,UACjB,UAAU;AAAA,UACV,KAAK,iBAAiB,OAAO,eAAe,cAAc;AAAA,UAC1D,QAAQ,iBAAiB,QAAQ,cAAc,KACzC,eAAe,eAAe,cAAe,MAC/C;AAAA,QACN;AAAA,MACF,CAAC;AAGD,UAAI,cAAc;AAClB,UAAI,gBAAgB;AACpB,UAAI,mBAAmB,sBAAsB,GAAG;AAC9C,mBAAW,KAAK,eAAe;AAC7B,cAAI,EAAE,iBAAiB,MAAM;AAC3B,cAAE,kBAAkB,KAAK,MAAO,EAAE,eAAe,sBAAuB,GAAK;AAC7E,cAAE,WAAW,EAAE,kBAAkB,EAAE;AACnC,gBAAI,KAAK,IAAI,EAAE,QAAQ,IAAI,KAAK,IAAI,WAAW,GAAG;AAChD,4BAAc,EAAE;AAChB,8BAAgB,EAAE;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,YAAM,mBAAmB,OAAO,YAAY,eAAe,aAAa,CAAC;AACzE,YAAM,WAAW,kBAAkB,sBAAsB,mBAAmB;AAC5E,YAAM,cAAc,aAAa,QAAQ,mBAAmB,IACvD,WAAW,mBAAoB,MAChC;AAEJ,eAAS,QAAQ,uBAAuB;AAGxC,UAAI,UAAU;AACZ,cAAM,SAAS;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,OAAO,EAAE,SAAS,WAAW,QAAQ,aAAuB,UAAU,cAAwB;AAAA,UAC9F,eAAe,YAAY,aAAa,aAAa;AAAA,UACrD,gBAAgB,OAAO,WAAW;AAAA,UAClC,cAAc,YAAY,cAAwB,aAAa;AAAA,UAC/D;AAAA,UACA;AAAA,UACA,WAAW;AAAA,YACT,YAAY,kBAAkB,sBAAsB;AAAA,YACpD;AAAA,YACA;AAAA,UACF;AAAA,UACA,aAAa;AAAA,UACb,aAAa,kBAAkB,cAAc;AAAA,UAC7C,eAAe,kBAAkB,gBAAgB;AAAA,UACjD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AACA,gBAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,IAAI,IAAI;AAClD;AAAA,MACF;AAGA,YAAM,aAAa,aAAa,aAAa,MAAM,QAAQ,aAAa,YAAY,MAAM,OAAO,MAAM;AAEvG,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,2BAA2B,CAAC;AACnD,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,cAAQ,IAAI,kBAAkB,MAAM,KAAK,KAAK,CAAC,EAAE;AACjD,cAAQ,IAAI,kBAAkB,MAAM,KAAK,KAAK,CAAC,EAAE;AACjD,cAAQ,IAAI,kBAAkB,MAAM,KAAK,QAAQ,CAAC,EAAE;AACpD,cAAQ,IAAI,kBAAkB,WAAW,QAAQ,CAAC,EAAE;AACpD,cAAQ,IAAI,kBAAkB,WAAW,KAAK,SAAS,GAAG;AAC1D,cAAQ,IAAI,kBAAkB,YAAY,aAAa,aAAa,CAAC,IAAI,WAAW,EAAE;AACtF,cAAQ,IAAI,kBAAkB,OAAO,WAAW,IAAI,GAAG,GAAG;AAC1D,cAAQ,IAAI,kBAAkB,YAAY,cAAwB,aAAa,CAAC,IAAI,WAAW,EAAE;AAEjG,UAAI,iBAAiB;AACnB,cAAM,QAAQ,oBAAoB,QAAQ,CAAC;AAC3C,cAAM,SAAS,aAAa,QAAQ,YAAY,IAAI,MAAM,MAAM,SAAS,QAAQ,CAAC,IAAI;AACtF,cAAM,YAAY,gBAAgB,QAAQ,eAAe,IAAI,MAAM,MAAM,YAAY,QAAQ,CAAC,IAAI,MAAM;AACxG,cAAM,WAAW,aAAa,QAAQ,YAAY,IAAI,MAAM,QAAQ,MAAM;AAC1E,gBAAQ,IAAI,kBAAkB,KAAK,IAAI,WAAW,aAAa,SAAS,GAAG,MAAM,KAAK,SAAS,GAAG,CAAC,EAAE;AACrG,gBAAQ,IAAI,kBAAkB,WAAW,EAAE;AAAA,MAC7C;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,aAAa,CAAC;AACrC,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,UAAI,iBAAiB;AAEnB,gBAAQ;AAAA,UACN,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,IAC9B,MAAM,IAAI,SAAS,OAAO,CAAC,CAAC,IAC5B,MAAM,IAAI,SAAS,OAAO,CAAC,CAAC,IAC5B,MAAM,IAAI,QAAQ,OAAO,CAAC,CAAC,IAC3B,MAAM,IAAI,QAAQ,OAAO,EAAE,CAAC,IAC5B,MAAM,IAAI,MAAM,OAAO,EAAE,CAAC,IAC1B,MAAM,IAAI,SAAS;AAAA,QACrB;AAEA,mBAAW,KAAK,eAAe;AAC7B,gBAAM,aAAa,EAAE,kBAAkB,KAAK,QAAQ,CAAC,IAAI;AACzD,gBAAM,YAAY,EAAE,oBAAoB,QAAQ,EAAE,kBAAkB,KAAK,QAAQ,CAAC,IAAI,MAAM;AAC5F,gBAAM,WAAW,EAAE,aAAa,QAC3B,EAAE,YAAY,IAAI,MAAM,MAAM,EAAE,WACjC;AACJ,gBAAM,aAAa,EAAE,aAAa,OAC7B,KAAK,IAAI,EAAE,QAAQ,IAAI,MAAM,MAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,IAAI,MAAM,MAAM,SAAS,MAAM,MAC5F,MAAM;AACV,gBAAM,WAAW,EAAE,iBAAiB,OAAO,EAAE,aAAa,QAAQ,CAAC,IAAI;AACvE,gBAAM,YAAY,EAAE,WAAW,QAAQ,EAAE,UAAU,IAAI,MAAM,MAAM,EAAE,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC/F,gBAAM,WAAW,EAAE,WAAW,OAAQ,EAAE,UAAU,IAAI,MAAM,QAAQ,MAAM,MAAO,MAAM;AAEvF,kBAAQ;AAAA,YACN,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,GAChC,UAAU,OAAO,CAAC,CAAC,GACnB,UAAU,OAAO,CAAC,CAAC,GACnB,WAAW,SAAS,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GACzC,SAAS,OAAO,EAAE,CAAC,GACnB,SAAS,UAAU,OAAO,EAAE,CAAC,CAAC,GAC9B,EAAE,OAAO;AAAA,UACd;AAAA,QACF;AAAA,MACF,OAAO;AAEL,gBAAQ,IAAI,MAAM,IAAI,wDAAmD,CAAC;AAC1E,gBAAQ,IAAI;AACZ,gBAAQ;AAAA,UACN,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,IAC9B,MAAM,IAAI,SAAS,OAAO,EAAE,CAAC,IAC7B,MAAM,IAAI,WAAW,OAAO,EAAE,CAAC,IAC/B,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,IAC9B,MAAM,IAAI,SAAS;AAAA,QACrB;AAEA,mBAAW,KAAK,eAAe;AAC7B,gBAAM,aAAa,EAAE,kBAAkB,KAAK,QAAQ,CAAC,IAAI;AACzD,kBAAQ;AAAA,YACN,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GACjC,UAAU,OAAO,EAAE,CAAC,GACpB,EAAE,eAAe,OAAO,EAAE,CAAC,GAC3B,EAAE,QAAQ,OAAO,EAAE,CAAC,GACpB,MAAM,IAAI,EAAE,KAAK,CAAC;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,cAAQ,IAAI,qBAAqB,YAAY,eAAe,aAAa,CAAC,IAAI,WAAW,EAAE;AAE3F,UAAI,mBAAmB,eAAe;AACpC,cAAM,cAAc,KAAK,IAAI,WAAW;AACxC,cAAM,aAAa,cAAc,MAAM,MAAM,MAAM,cAAc,MAAM,MAAM,SAAS,MAAM;AAC5F,gBAAQ,IAAI,qBAAqB,WAAW,GAAG,cAAc,IAAI,MAAM,EAAE,GAAG,WAAW,MAAM,CAAC,KAAK,aAAa,GAAG;AAAA,MACrH;AAEA,UAAI,aAAa,YAAY;AAC3B,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,IAAI,6CAA6C,KAAK,CAAC;AACzE,gBAAQ,IAAI,MAAM,IAAI,mDAAmD,QAAQ,yCAAyC,CAAC;AAAA,MAC7H;AAEA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,eAAS,KAAK,+BAA+B;AAC7C,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,EAAAA,UACG,QAAQ,WAAW,EACnB,YAAY,qGAAgG,EAC5G,SAAS,WAAW,wBAAwB,EAC5C,OAAO,wBAAwB,6FAA6F,EAC5H,OAAO,wBAAwB,gDAAgD,EAC/E,OAAO,aAAa,0CAA0C,EAC9D,OAAO,OAAO,UAAkB,SAAS;AACxC,QAAI,CAAC,UAAU,QAAQ,GAAG;AACxB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAQ;AACd,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,WAAW;AAC3B,UAAM,QAAQ,SAAS;AAGvB,UAAM,gBAAgB,IAAI,6BAA6B,EAAE,MAAM;AAC/D,QAAI;AACF,YAAM,CAAC,UAAU,UAAU,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrE,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,QAAQ,CAAC;AAAA,QAChG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,WAAW,CAAC;AAAA,QACnG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,QAAQ,CAAC;AAAA,QAChG,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,wBAAwB,cAAc,iBAAiB,CAAC;AAAA,MAC3G,CAAC;AAGD,UAAI,OAAO,QAAQ,MAAM,GAAG;AAC1B,cAAM,aAAa,CAAC,WAAW,YAAY,SAAS;AACpD,sBAAc,KAAK,eAAe,WAAW,OAAO,QAAQ,CAAC,KAAK,SAAS,iCAAiC;AAC5G,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,UAAI,SAAS,YAAY,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAC5D,sBAAc,KAAK,sBAAsB,QAAQ,iCAAiC,QAAQ,OAAO,EAAE;AACnG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,CAAC,eAAe,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrD,aAAa,aAAa,EAAE,SAAS,WAAW,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,QACzF,aAAa,aAAa,EAAE,SAAS,WAAW,KAAK,UAAU,cAAc,SAAS,CAAC;AAAA,MACzF,CAAC;AAGD,YAAM,aAAa,YAAY,IAAI,CAAC,MAAM,QAAQ,IAAI;AAAA,QACpD,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,QACvG,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,SAAS,CAAC;AAAA,QACrF,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,MACzF,CAAC,CAAC;AACF,YAAM,YAAY,MAAM,QAAQ,IAAI,UAAU;AAE9C,oBAAc,QAAQ,gDAA2C;AAGjE,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,qBAAqB,CAAC;AAC7C,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,cAAM,QAAQ,YAAY,CAAC;AAC3B,cAAM,CAAC,SAAS,QAAQ,QAAQ,IAAI,UAAU,CAAC;AAC/C,cAAM,aAAa,OAAO,MAAM,eAAe,IAAI,KAAK,QAAQ,CAAC,IAAI;AACrE,gBAAQ;AAAA,UACN,KAAK,MAAM,KAAM,OAAkB,OAAO,CAAC,CAAC,CAAC,IAC1C,UAAU,OAAO,CAAC,CAAC,SACd,YAAY,SAAmB,QAAQ,CAAC;AAAA,QAClD;AAAA,MACF;AAGA,UAAI;AACJ,UAAI,KAAK,YAAY;AACnB,wBAAiB,KAAK,WAAsB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,CAAC;AAClF,YAAI,cAAc,WAAW,YAAY,QAAQ;AAC/C,kBAAQ,MAAM,MAAM,IAAI,2BAA2B,YAAY,MAAM,yBAAyB,CAAC;AAC/F,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,YAAY,cAAc,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACzD,YAAI,cAAc,KAAO;AACvB,kBAAQ,MAAM,MAAM,IAAI,kCAAkC,SAAS,EAAE,CAAC;AACtE,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,KAAK,oBAAoB,CAAC;AAC5C,gBAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,gBAAM,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC;AAC9B,gBAAM,UAAU,OAAO,YAAY,CAAC,EAAE,eAAe,IAAI,KAAK,QAAQ,CAAC;AACvE,gBAAM,UAAU,cAAc,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjD,gBAAM,QAAQ,WAAW,SAAS,MAAM,OAAO,QAAG,IAAI,MAAM,IAAI,QAAG;AACnE,kBAAQ,IAAI,KAAK,MAAM,KAAM,OAAkB,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;AAAA,QAC5F;AAAA,MACF;AAEA,UAAI,KAAK,QAAQ;AACf,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,OAAO,sCAAiC,CAAC;AAC3D,gBAAQ,IAAI,MAAM,IAAI,sBAAsB,CAAC;AAC7C,gBAAQ,IAAI,MAAM,IAAI,mDAAmD,WAAW,CAAC;AACrF,gBAAQ,IAAI,MAAM,IAAI,qBAAqB,gBAAgB,QAAQ,aAAa,iBAAiB,CAAC;AAClG,gBAAQ,IAAI;AACZ;AAAA,MACF;AAGA,UAAI,eAAe;AACjB,cAAM,UAAU,OAAQ,KAAK,eAA0B,GAAG;AAC1D,cAAM,WAAW,MAAM,aAAa,aAAa;AAAA,UAC/C,SAAS;AAAA,UACT,KAAK;AAAA,UACL,cAAc;AAAA,QAChB,CAAC;AAED,cAAM,gBAAgB,IAAI,4BAA4B,EAAE,MAAM;AAC9D,YAAI;AACF,gBAAM,YAAYL;AAAA,YAChB,CAAC,EAAE,MAAM,YAAY,GAAG,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,YAChE,CAAC,cAAc,IAAI,CAAC,MAAc,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,GAAG,QAAQ;AAAA,UACzE;AAEA,gBAAM,aAAa,MAAM,uBAAuB;AAAA,YAC9C;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,SAAS;AAAA,UAClB,CAAC;AAED,gBAAM,UAAU,MAAM,eAAe,UAAU;AAC/C,cAAI,QAAQ,WAAW,WAAY,OAAM,IAAI,MAAM,uBAAuB;AAC1E,wBAAc,QAAQ,wBAAwB;AAC9C,kBAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,UAAU,CAAC,EAAE,CAAC;AAAA,QAC9D,SAAS,KAAK;AACZ,wBAAc,KAAK,0BAA0B;AAC7C,kBAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAGA,YAAM,mBAAmB,IAAI,8DAAyD,EAAE,MAAM;AAC9F,UAAI;AACF,cAAM,gBAAgB,MAAM,uBAAuB;AAAA,UACjD;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,KAAK;AAAA,UACL,cAAc;AAAA,QAChB,CAAC;AAED,cAAM,UAAU,MAAM,eAAe,aAAa;AAClD,YAAI,QAAQ,WAAW,WAAY,OAAM,IAAI,MAAM,+BAA+B;AAClF,yBAAiB,QAAQ,sBAAsB;AAC/C,gBAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,aAAa,CAAC,EAAE,CAAC;AAAA,MACjE,SAAS,KAAK;AACZ,yBAAiB,KAAK,kBAAkB;AACxC,gBAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,cAAc,IAAI,gCAAgC,EAAE,MAAM;AAChE,YAAM,kBAAkB,MAAM,aAAa,aAAa;AAAA,QACtD,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAED,YAAM,YAAY,gBAAgB,IAAI,CAAC,MAAM,QAAQ,IAAI;AAAA,QACvD,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,QACvG,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,SAAS,CAAC;AAAA,QACrF,aAAa,aAAa,EAAE,SAAS,EAAE,OAAO,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,MACzF,CAAC,CAAC;AACF,YAAM,WAAW,MAAM,QAAQ,IAAI,SAAS;AAC5C,kBAAY,QAAQ,qBAAqB;AAEzC,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,4BAA4B,CAAC;AACpD,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,cAAM,QAAQ,gBAAgB,CAAC;AAC/B,cAAM,CAAC,SAAS,QAAQ,QAAQ,IAAI,SAAS,CAAC;AAC9C,cAAM,aAAa,OAAO,MAAM,eAAe,IAAI,KAAK,QAAQ,CAAC,IAAI;AACrE,cAAM,cAAc,YAAY,MAAM,gBAAgB,aAAa;AACnE,gBAAQ;AAAA,UACN,KAAK,MAAM,KAAM,OAAkB,OAAO,CAAC,CAAC,CAAC,IAC1C,UAAU,OAAO,CAAC,CAAC,cACT,YAAY,OAAO,EAAE,CAAC,SAC3B,YAAY,SAAmB,QAAQ,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,MAAM,2BAAsB,CAAC;AAC/C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAU;AACjB,UAAI,IAAI,SAAS,0BAA0B,eAAe,UAAW,OAAM;AAC3E,oBAAc,KAAK,yBAAyB;AAC5C,cAAQ,MAAM,MAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AU3oDA,SAAS,iBAAyB;AAChC,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,MAAS,SAAiB,WAAiD;AACxF,QAAM,MAAM,eAAe;AAE3B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,UAAU,CAAC;AAAA,EACpD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,EACvE;AAEA,QAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,MAAI,OAAO,QAAQ,QAAQ;AACzB,UAAM,IAAI,MAAM,yBAAyB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3F;AAEA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsBQ,qBACpB,SAC8B;AAC9B,MAAI,SAAS;AACX,UAAMC,QAAO,MAAM;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,EAAE,SAAS,QAAQ,YAAY,EAAE;AAAA,IACnC;AACA,WAAOA,MAAK;AAAA,EACd;AAEA,QAAM,OAAO,MAAM,MAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAa7D;AAED,SAAO,KAAK;AACd;;;AC/GA,SAAS,eAAAC,cAAa,aAAAC,YAAW,cAAAC,mBAAkB;AACnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAOhB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAEzB,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,mEAA8D;AAInH,SACG,QAAQ,WAAW,EACnB,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAG/B,UAAM,eAAeC,KAAI,0BAA0B,EAAE,MAAM;AAC3D,QAAI;AACF,YAAM,cAAc,MAAM,OAAO,aAAa;AAAA,QAC5C,SAAS,OAAO,EAAE;AAAA,QAClB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,UAAI,gBAAgB,IAAI;AACtB,qBAAa,KAAK,yBAAyB;AAC3C,gBAAQ,IAAIC,OAAM,OAAO,0EAA0E,CAAC;AACpG,gBAAQ,IAAIA,OAAM,OAAO,gFAAgF,CAAC;AAC1G,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,mBAAa,QAAQ,iBAAiBC,aAAY,aAAa,EAAE,CAAC,EAAE;AAAA,IACtE,SAAS,KAAK;AACZ,mBAAa,KAAK,8BAA8B;AAChD,cAAQ,MAAMD,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAaD,KAAI,gCAAgC,EAAE,MAAM;AAC/D,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AACrC,iBAAW,QAAQ,4BAA4B;AAC/C,cAAQ,IAAIC,OAAM,IAAI,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC;AAC3E,cAAQ,IAAIA,OAAM,IAAI,oCAAoC,CAAC;AAG3D,UAAI;AACF,cAAM,EAAE,kCAAkC,eAAAE,eAAc,IAAI,MAAM,OAAO,mBAAe;AACxF,cAAM,EAAE,IAAI,IAAI,MAAM,iCAAiC,QAAQ,OAAO;AACtE,YAAI,QAAQ,sEAAsE;AAChF,kBAAQ,IAAIF,OAAM,IAAI,eAAeE,eAAc,GAAG,CAAC,EAAE,CAAC;AAAA,QAC5D;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,SAAS,KAAK;AACZ,iBAAW,KAAK,6BAA6B;AAC7C,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,OAAO,EACf,YAAY,sEAAsE,EAClF,eAAe,gBAAgB,kDAAkD,EACjF,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAC/B,UAAM,QAAQ,SAAS;AACvB,UAAM,cAAc,OAAO;AAC3B,UAAM,SAASG,YAAW,KAAK,QAAQ,EAAE;AAGzC,UAAM,aAAaJ,KAAI,yBAAyB,EAAE,MAAM;AACxD,QAAI;AACF,YAAM,aAAa,MAAM,OAAO,aAAa;AAAA,QAC3C,SAAS,YAAY;AAAA,QACrB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,UAAI,aAAa,QAAQ;AACvB,mBAAW,KAAK,0BAA0BE,aAAY,YAAY,EAAE,CAAC,UAAU,KAAK,MAAM,EAAE;AAC5F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,iBAAW,QAAQ,gBAAgBA,aAAY,YAAY,EAAE,CAAC,EAAE;AAAA,IAClE,SAAS,KAAK;AACZ,iBAAW,KAAK,6BAA6B;AAC7C,cAAQ,MAAMD,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,iBAAiBD,KAAI,uCAAuC,EAAE,MAAM;AAC1E,QAAI;AACF,YAAM,cAAc,MAAM,uBAAuB;AAAA,QAC/C;AAAA,QACA;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,YAAY,SAAS,MAAM;AAAA,MACpC,CAAC;AACD,YAAM,eAAe,WAAW;AAChC,qBAAe,QAAQ,cAAc;AAAA,IACvC,SAAS,KAAK;AACZ,qBAAe,KAAK,gBAAgB;AACpC,cAAQ,MAAMC,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,eAAeD,KAAI,WAAW,KAAK,MAAM,SAAS,EAAE,MAAM;AAChE,QAAI;AACF,YAAM,YAAY,MAAM,uBAAuB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,SAAS,MAAM;AAAA,MAChC,CAAC;AACD,YAAM,eAAe,SAAS;AAG9B,YAAM,cAAc,MAAM,OAAO,aAAa;AAAA,QAC5C,SAAS,YAAY;AAAA,QACrB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,mBAAa,QAAQ,UAAU,KAAK,MAAM,eAAUE,aAAY,aAAa,EAAE,CAAC,OAAO;AACvF,cAAQ,IAAID,OAAM,IAAI,8CAA8C,CAAC;AAAA,IACvE,SAAS,KAAK;AACZ,mBAAa,KAAK,cAAc;AAChC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,WAAW,EACnB,YAAY,iEAAiE,EAC7E,eAAe,gBAAgB,sDAAsD,EACrF,OAAO,oBAAoB,gDAAgD,KAAK,EAChF,OAAO,SAAS,uCAAuC,EACvD,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAC/B,UAAM,QAAQ,SAAS;AACvB,UAAM,EAAE,SAAS,KAAK,IAAI,OAAO;AAEjC,UAAM,SAASG,YAAW,KAAK,QAAQ,EAAE;AACzC,UAAM,cAAc,OAAO,KAAK,YAAY,KAAK;AACjD,QAAI,cAAc,MAAM,cAAc,QAAQ;AAC5C,cAAQ,MAAMH,OAAM,IAAI,yBAAyB,KAAK,QAAQ,yBAAoB,CAAC;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAaD,KAAI,0BAA0B,EAAE,MAAM;AACzD,QAAI;AACJ,QAAI;AACF,oBAAc,MAAM,OAAO,aAAa;AAAA,QACtC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,iBAAW,KAAK,6BAA6B;AAC7C,cAAQ,MAAMC,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,cAAc,QAAQ;AACxB,iBAAW;AAAA,QACT,2BAA2BC,aAAY,aAAa,EAAE,CAAC,UAAU,KAAK,MAAM;AAAA,MAC9E;AACA,cAAQ,IAAID,OAAM,OAAO,gEAAgE,CAAC;AAC1F,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,eAAW,QAAQ,iBAAiBC,aAAY,aAAa,EAAE,CAAC,EAAE;AAGlE,UAAM,eAAeF,KAAI,wBAAwB,EAAE,MAAM;AACzD,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,OAAO,aAAa;AAAA,QACnC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,MAAM;AAAA,MACf,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,mBAAa,KAAK,6BAA6B;AAC/C,cAAQ,MAAMC,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,aAAa,IAAI;AACnB,mBAAa,KAAK,+CAA0C;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAU,YAAY,SAAS,eAAgB;AACrD,iBAAa;AAAA,MACX,aAAaC,aAAY,UAAU,EAAE,CAAC,oBAAoB,WAAW,QAAQA,aAAY,QAAQ,EAAE,CAAC;AAAA,IACtG;AAKA,UAAM,qBAAqBE,YAAW,OAAO,EAAE;AAC/C,QAAI,cAAc;AAClB,QAAI;AACF,oBAAc,MAAM,OAAO,aAAa;AAAA,QACtC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AACA,UAAM,gBAAgB,cAAc;AACpC,QAAI,gBAAgB,oBAAoB;AACtC,YAAM,YAAY,qBAAqB;AAEvC,YAAM,cAAc,SAAS,YAAY,WAAW,MAAM;AAC1D,cAAQ,IAAI;AACZ,cAAQ,IAAIH,OAAM,IAAI,0EAAgE,CAAC;AACvF,cAAQ,IAAIA,OAAM,IAAI,4CAA4C,CAAC;AACnE,cAAQ,IAAIA,OAAM,IAAI,mCAAmCC,aAAY,eAAe,EAAE,CAAC,eAAeA,aAAY,WAAW,EAAE,CAAC,GAAG,CAAC;AACpI,cAAQ,IAAID,OAAM,IAAI,uCAAuCC,aAAY,YAAY,EAAE,CAAC,EAAE,CAAC;AAC3F,cAAQ,IAAID,OAAM,IAAI,qEAAgE,CAAC;AACvF,cAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAAA,IAClF;AAGA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,OAAO,2EAAsE,CAAC;AAChG,YAAQ,IAAIA,OAAM,OAAO,sEAAsE,CAAC;AAChG,YAAQ,IAAIA,OAAM,OAAO,oEAAoE,CAAC;AAC9F,YAAQ,IAAIA,OAAM,OAAO,sDAAsD,CAAC;AAChF,YAAQ,IAAIA,OAAM,IAAI,gEAAgE,CAAC;AACvF,YAAQ,IAAIA,OAAM,IAAI,2FAA2F,CAAC;AAClH,YAAQ,IAAI;AAEZ,QAAI,CAAC,KAAK,KAAK;AACb,YAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,UAAI;AACF,cAAM,UAAU,MAAM,GAAG,SAAS,UAAU,KAAK,MAAM,gCAAgC,GAAG,KAAK,EAAE,YAAY;AAC7G,YAAI,WAAW,OAAO,WAAW,OAAO;AACtC,kBAAQ,IAAIA,OAAM,IAAI,YAAY,CAAC;AACnC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,UAAE;AACA,WAAG,MAAM;AAAA,MACX;AAAA,IACF;AAGA,UAAM,aAAa;AACnB,UAAM,cAAcD,KAAI,qBAAqB,KAAK,MAAM,UAAU,EAAE,MAAM;AAC1E,QAAI;AACF,YAAM,OAAO,MAAM,uBAAuB;AAAA,QACxC;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,MAAM;AAAA,MACvB,CAAC;AACD,YAAM,eAAe,IAAI;AAEzB,YAAM,YAAY,MAAM,OAAO,aAAa;AAAA,QAC1C,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AACD,YAAM,QAAQ,YAAY;AAE1B,kBAAY;AAAA,QACV,UAAUE,aAAY,QAAQ,KAAK,QAAQ,WAAW,EAAE,CAAC,WACxD,QAAQ,KAAK,cAAcA,aAAY,WAAW,EAAE,CAAC,MAAM;AAAA,MAC9D;AACA,cAAQ,IAAID,OAAM,IAAI,SAAS,IAAI,EAAE,CAAC;AACtC,cAAQ,IAAIA,OAAM,OAAO,uEAAkE,CAAC;AAC5F,cAAQ,IAAIA,OAAM,OAAO,mEAAmE,CAAC;AAC7F,cAAQ,IAAIA,OAAM,OAAO,yCAAyC,CAAC;AACnE,cAAQ,IAAIA,OAAM,IAAI,0EAA4E,CAAC;AAAA,IACrG,SAAS,KAAK;AACZ,kBAAY,KAAK,iBAAiB;AAClC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,eAAe,qBAAqB,eAAe,EACnD,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACI,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMJ,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAUD,KAAI,0BAA0B,EAAE,MAAM;AAEtD,QAAI;AAEF,YAAM,CAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,YAAM,CAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnE,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AAGD,YAAM,kBAAkB,MAAM,OAAO,aAAa;AAAA,QAChD,SAAS,OAAO,EAAE;AAAA,QAClB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,YAAY;AAAA,MACrB,CAAC;AAGD,YAAM,gBAAgB,MAAM,QAAQ;AAAA,QAClC,OAAO,IAAI,OAAO,UAAU;AAC1B,gBAAM,MAAM,MAAM,OAAO,aAAa;AAAA,YACpC,SAAS,OAAO,EAAE;AAAA,YAClB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,KAAK;AAAA,UACd,CAAC;AACD,iBAAO,EAAE,OAAO,SAAS,IAAI;AAAA,QAC/B,CAAC;AAAA,MACH;AAGA,YAAM,CAAC,QAAQ,WAAW,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpD,OAAO,aAAa;AAAA,UAClB,SAAS,OAAO,EAAE;AAAA,UAClB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,QAAQ,OAAO;AAAA,QACxB,CAAC;AAAA,QACD,OAAO,aAAa;AAAA,UAClB,SAAS,OAAO,EAAE;AAAA,UAClB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,QAAQ,OAAO;AAAA,QACxB,CAAC;AAAA,QACD,OAAO,aAAa;AAAA,UAClB,SAAS,OAAO,EAAE;AAAA,UAClB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,QAAQ,OAAO;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAGD,YAAM,cAAc,MAAM,iBAAiB;AAC3C,YAAM,SAAS,gBAAgB;AAE/B,cAAQ,KAAK;AAEb,YAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAE/E,cAAQ,IAAI;AACZ,cAAQ,IAAIC,OAAM,KAAK,yBAAyB,CAAC;AACjD,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,0BAA0BC,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AACzF,cAAQ,IAAI,0BAA0BA,aAAY,iBAAiB,EAAE,CAAC,EAAE;AAExE,cAAQ,IAAID,OAAM,KAAK,yBAAyB,CAAC;AACjD,iBAAW,EAAE,OAAO,QAAQ,KAAK,eAAe;AAC9C,cAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACjE,cAAM,QAAQ,OAAOA,OAAM,MAAM,GAAG,KAAK,QAAQ,IAAI;AACrD,gBAAQ,IAAI,OAAO,KAAK,KAAKC,aAAY,SAAS,EAAE,CAAC,OAAO;AAAA,MAC9D;AAEA,cAAQ,IAAID,OAAM,KAAK,iBAAiB,CAAC;AACzC,cAAQ,IAAI,0BAA0BC,aAAY,QAAQ,EAAE,CAAC,EAAE;AAC/D,cAAQ,IAAI,0BAA0BA,aAAY,WAAW,EAAE,CAAC,MAAM;AACtE,cAAQ,IAAI,0BAA0BA,aAAY,QAAQ,EAAE,CAAC,EAAE;AAC/D,cAAQ,IAAID,OAAM,IAAI,4DAA4D,CAAC;AAEnF,cAAQ,IAAIA,OAAM,KAAK,gBAAgB,CAAC;AACxC,cAAQ,IAAI,gBAAgB,SAAS,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC,KAAKA,OAAM,IAAI,iBAAiB,CAAC,EAAE;AACnH,cAAQ,IAAI,gBAAgB,cAAcA,OAAM,MAAM,OAAO,IAAIA,OAAM,IAAI,iBAAiB,CAAC,EAAE;AAC/F,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,QAAQ,EAChB,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAClB,UAAM,UAAUD,KAAI,2BAA2B,EAAE,MAAM;AACvD,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAChC,cAAQ,QAAQ,GAAG,OAAO,MAAM,mBAAmB;AACnD,cAAQ,IAAI;AACZ,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,MAC1B;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMC,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,OAAO,EACf,YAAY,mDAAmD,EAC/D,eAAe,mBAAmB,aAAa,EAC/C,eAAe,gBAAgB,+CAA+C,EAC9E,OAAO,mBAAmB,eAAe,EACzC,OAAO,iBAAiB,kEAA6D,EACrF,OAAO,gBAAgB,4BAA4B,KAAK,EACxD,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,UAAU,4BAA4B,KAAK,EAClD,OAAO,qBAAqB,uEAAkE,EAC9F,OAAO,OAAO,SAAS;AAEtB,UAAM,WAAyE,CAAC;AAEhF,QAAI,KAAK,QAAQ;AACf,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,OAAO,CAAC;AAAA,IACxD;AAEA,QAAI,cAAc,KAAK;AACvB,QAAI,KAAK,MAAM;AACb,UAAI;AACF,cAAM,OAAO,aAAa,KAAK,MAAM,OAAO;AAC5C,sBAAc;AAAA;AAAA,EAA0B,IAAI;AAAA;AAAA;AAAA,EAAe,KAAK,MAAM;AAAA,MACxE,SAAS,KAAK;AACZ,gBAAQ,MAAMA,OAAM,IAAI,6BAA6B,KAAK,IAAI,EAAE,CAAC;AACjE,gBAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,aAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,YAAY,CAAC;AAEpD,UAAM,UAAUD,KAAI,sBAAsB,KAAK,KAAK,MAAM,EAAE,MAAM;AAClE,QAAI;AACF,YAAM,SAAS,MAAM,eAAe;AAAA,QAClC,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,aAAa,KAAK,gBAAgB,SAAY,OAAO,KAAK,WAAW,IAAI;AAAA,QACzE,WAAW,KAAK,cAAc,SAAY,OAAO,KAAK,SAAS,IAAI;AAAA,QACnE,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK,aAAa;AAAA,MACrC,CAAC;AAED,cAAQ,QAAQ,oBAAoB;AAEpC,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,OAAO,OAAO;AAC1B,gBAAQ,IAAI;AACZ,gBAAQ,IAAIC,OAAM,IAAI,UAAU,OAAO,KAAK,cAAc,OAAO,MAAM,YAAY,QAAQ,OAAO,MAAM,gBAAgB,SAAS,OAAO,MAAM,WAAW,QAAQ,CAAC;AAAA,MACpK;AAGA,UAAI;AACF,cAAM,EAAE,kCAAkC,eAAAE,eAAc,IAAI,MAAM,OAAO,mBAAe;AACxF,cAAM,EAAE,WAAW,OAAO,WAAW,OAAO,IAAI,MAAM,OAAO,MAAM;AACnE,cAAM,EAAE,mBAAAG,mBAAkB,IAAI,MAAM,OAAO,sBAAkB;AAC7D,cAAM,EAAE,UAAU,eAAe,IAAI,MAAM,OAAO,uBAAmB;AACrE,cAAM,iBAAkB,KAAK,SAAS,OAAO,KAAK,KAAK,IAAK,KAAK,QAAQA,mBAAkB,eAAe,EAAE,EAAE,EAAE;AAChH,cAAM,aAAa,UAAU,MAAM,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE;AAC5D,cAAM,EAAE,IAAI,IAAI,MAAM;AAAA,UACpB,OAAO;AAAA,UACP,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,YAAI,QAAQ,sEAAsE;AAChF,kBAAQ,IAAIL,OAAM,IAAI,aAAaE,eAAc,GAAG,CAAC,EAAE,CAAC;AAAA,QAC1D;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,kBAAkB;AAC/B,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC3hBA,SAAS,cAAAM,aAAY,eAAAC,cAAa,aAAAC,kBAAiB;AACnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACAhB,SAAS,sBAAAC,qBAAoB,cAAAC,mBAAkB;AAiCxC,SAAS,mBACd,QACA,cACA,QACA,cACA,eACA,SACA,UACa;AACb,QAAM,cAAcC,YAAW,OAAO,QAAQ,aAAa;AAC3D,QAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,QAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,QAAM,QAAqB,CAAC;AAE5B,MAAI,CAAC,QAAQ;AAEX,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,EAAE,aAAa,WAAW;AAAA,MAC3C,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAGD,QAAI,QAAQ;AAEV,YAAM,KAAK;AAAA,QACT,QAAQ,QAAQ,EAAE;AAAA,QAClB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM;AAAA,YACJ;AAAA,cACE,SAAS,OAAO,EAAE;AAAA,cAClB,UAAU,OAAO,EAAE;AAAA,cACnB,KAAK,OAAO;AAAA,cACZ,WAAW;AAAA,cACX,UAAU;AAAA,cACV,kBAAkB;AAAA,cAClB,mBAAmB;AAAA,YACrB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,OAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AAEL,YAAM,KAAK;AAAA,QACT,QAAQ,QAAQ,EAAE;AAAA,QAClB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN,WAAW;AAAA,cACX,UAAU;AAAA,cACV,kBAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,WAAW,UAAU,OAAO,OAAO,MAAM;AAC/C,aAAW,SAAS,QAAQ;AAC1B,UAAM,KAAK;AAAA,MACT,QAAQ,OAAO,EAAE;AAAA,MACjB,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AD3GA,IAAM,aAAa,CAAC,KAAK,KAAM,GAAK;AAE7B,SAAS,0BAA0BC,UAAwB;AAChE,QAAM,YAAYA,SAAQ,QAAQ,WAAW,EAAE,YAAY,yCAAyC;AAIpG,YACG,QAAQ,UAAU,EAClB,YAAY,gFAAsE,EAClF,eAAe,qBAAqB,eAAe,EACnD,eAAe,qBAAqB,yDAAyD,EAC7F,OAAO,gBAAgB,0DAAqD,MAAM,EAClF,OAAO,oBAAoB,6BAA6B,KAAK,EAC7D,OAAO,aAAa,6CAA6C,KAAK,EACtE,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACC,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMC,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,MAAM,OAAO,KAAK,GAAG;AAC3B,QAAI,CAAC,WAAW,SAAS,GAAyB,GAAG;AACnD,cAAQ,MAAMA,OAAM,IAAI,4BAA4B,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAc,OAAO,KAAK,QAAQ;AAExC,UAAM,SAAS,gBAAgB;AAI/B,UAAM,UAAUC,KAAI,wBAAwB,EAAE,MAAM;AACpD,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,OAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACzD,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,OAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC7D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AACD,cAAQ,KAAK;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMD,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,MAAMA,OAAM,IAAI,uDAAuD,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,kBAAkBE,YAAW,KAAK,QAAQ,aAAa;AAC7D,UAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAI/E,UAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,UAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AAExE,YAAQ,IAAI;AACZ,YAAQ,IAAIF,OAAM,KAAK,oBAAoB,CAAC;AAC5C,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,oBAAoB,WAAW,KAAK,aAAa,YAAY;AACzE,YAAQ,IAAI,oBAAoB,KAAK,MAAM,IAAI,WAAW,EAAE;AAC5D,YAAQ,IAAI,oBAAoBG,aAAY,cAAc,aAAa,CAAC,IAAI,WAAW,EAAE;AACzF,YAAQ,IAAI,oBAAoBA,aAAY,gBAAgB,aAAa,CAAC,IAAI,WAAW,EAAE;AAC3F,YAAQ,IAAI,oBAAoBA,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AACnF,YAAQ,IAAI,oBAAoB,OAAO,MAAM,+BAA+B;AAC5E,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,oBAAoB,SAAS,yBAAoB,GAAG,MAAM,GAAG,WAAW,iCAAuB,GAAG,GAAG,EAAE;AACnH,cAAQ,IAAI,qBAAqB,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,IACnE;AACA,YAAQ,IAAI,oBAAoB,YAAY,EAAE;AAC9C,YAAQ,IAAI;AAEZ,QAAI,kBAAkB,QAAQ;AAC5B,cAAQ,KAAKH,OAAM,OAAO,sBAAsB,KAAK,MAAM,+BAA+BG,aAAY,QAAQ,aAAa,CAAC,GAAG,CAAC;AAChI,cAAQ,KAAKH,OAAM,OAAO,sDAAsD,CAAC;AACjF,cAAQ,IAAI;AAAA,IACd;AAIA,QAAI;AACJ,QAAI,WAAiC;AAErC,QAAI,QAAQ;AAEV,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,eAAeC,KAAI,2BAA2B,EAAE,MAAM;AAC5D,UAAI;AACF,YAAI;AAEJ,YAAI,QAAQ;AAEV,gBAAM,QAAQ,MAAM,SAAS;AAAA,YAC3B,SAAS,OAAO,EAAE;AAAA,YAClB,UAAU,OAAO,EAAE;AAAA,YACnB,UAAU;AAAA,YACV;AAAA,UACF,CAAC;AACD,sBAAY,MAAM;AAAA,QACpB,OAAO;AAEL,qBAAW;AAAA,YACT,CAAC,cAAc,OAAO,EAAE,MAAM,OAAO,EAAE,IAAI;AAAA,YAC3C,CAAC,KAAK,GAAG;AAAA;AAAA,UACX;AACA,gBAAM,QAAQ,MAAM,iBAAiB;AAAA,YACnC,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AACD,sBAAY,MAAM;AAAA,QACpB;AAEA,kBAAU,cAAc,WAAW,WAAW;AAE9C,qBAAa;AAAA,UACX,UAAUE,aAAY,WAAW,CAAC,CAAC,eAC1BA,aAAY,SAAS,CAAC,CAAC,gBAAgBA,aAAY,UAAU,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,QACjG;AAAA,MACF,SAAS,KAAK;AACZ,qBAAa,KAAK,uBAAuB;AACzC,gBAAQ,MAAMH,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAIA,UAAM,WAAW,UAAU,OAAO,OAAO,MAAM;AAC/C,QAAI,QAAQ;AACV,cAAQ,IAAIA,OAAM,IAAI,gBAAgBG,aAAY,UAAU,CAAC,CAAC,OAAO,CAAC;AACtE,cAAQ,IAAI;AAAA,IACd;AAIA,UAAM,SAAiC;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,mBAAmB,QAAQ,cAAc,QAAQ,cAAc,eAAe,SAAS,QAAQ;AAE7G,YAAQ,IAAI;AACZ,YAAQ,IAAIH,OAAM,KAAK,gBAAgB,MAAM,MAAM,IAAI,CAAC;AACxD,YAAQ,IAAI,YAAY,KAAK,CAAC;AAC9B,YAAQ,IAAI;AAIZ,QAAI,CAAC,KAAK,SAAS;AACjB,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,OAAO,qDAAqD,CAAC;AAC/E;AAAA,IACF;AAEA,UAAM,cAAcC,KAAI,8BAA8B,EAAE,MAAM;AAC9D,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,KAAK;AACvC,kBAAY,QAAQ,mBAAmB,MAAM,EAAE;AAC/C,cAAQ,IAAID,OAAM,IAAI,KAAK,eAAe,MAAM,CAAC,EAAE,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,kBAAY,KAAK,kBAAkB;AACnC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,YACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,eAAe,qBAAqB,eAAe,EACnD,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACD,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMC,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,UAAUC,KAAI,6BAA6B,EAAE,MAAM;AAEzD,QAAI;AAEF,YAAM,CAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,YAAM,CAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnE,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AAGD,YAAM,gBAAgB,MAAM,QAAQ;AAAA,QAClC,OAAO,IAAI,OAAO,UAAU;AAC1B,gBAAM,MAAM,MAAM,OAAO,aAAa;AAAA,YACpC,SAAS,OAAO,EAAE;AAAA,YAClB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,KAAK;AAAA,UACd,CAAC;AACD,iBAAO,EAAE,OAAO,SAAS,IAAI;AAAA,QAC/B,CAAC;AAAA,MACH;AAEA,cAAQ,KAAK;AAEb,YAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAC/E,YAAM,UAAU,WAAW;AAE3B,cAAQ,IAAI;AACZ,cAAQ,IAAID,OAAM,KAAK,kBAAkB,CAAC;AAC1C,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,wBAAwB,WAAW,EAAE;AACjD,cAAQ,IAAI,wBAAwBG,aAAY,cAAc,aAAa,CAAC,IAAI,WAAW,EAAE;AAC7F,cAAQ,IAAI,wBAAwBA,aAAY,gBAAgB,aAAa,CAAC,IAAI,WAAW,EAAE;AAC/F,cAAQ,IAAI,wBAAwBA,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AAEvF,cAAQ,IAAIH,OAAM,KAAK,yBAAyB,CAAC;AACjD,iBAAW,EAAE,OAAO,QAAQ,KAAK,eAAe;AAC9C,cAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACjE,cAAM,QAAQ,OAAOA,OAAM,MAAM,GAAG,KAAK,QAAQ,IAAI;AACrD,gBAAQ,IAAI,OAAO,KAAK,KAAKG,aAAY,SAAS,CAAC,CAAC,OAAO;AAAA,MAC7D;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMH,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AE5QA,OAAOI,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,WAAW;AAQpB,IAAM,wBAAwB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAKA,SAAS,eAAoB;AAE3B,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,OAAO,cAAc,QAAQ,IAAI;AAC7C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,IAAI;AAAA,IACb,SAAS,SAAS,EAAE;AAAA,IACpB,QAAQ,UAAU;AAAA,IAClB,YAAY,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AAAA,EACnD,CAAC;AACH;AAEO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,iDAAiD;AAI1G,WACG,QAAQ,MAAM,EACd,YAAY,sFAAsF,EAClG,eAAe,iBAAiB,wCAAwC,EACxE,OAAO,wBAAwB,qBAAqB,0BAA0B,EAC9E,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAG3B,UAAM,aAAa,WAAW;AAC9B,QAAI,YAAY;AACd,cAAQ,IAAIC,OAAM,OAAO,8CAA8C,UAAU,EAAE,CAAC;AACpF,cAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAChF,cAAQ,IAAI;AAAA,IACd;AAEA,UAAM,UAAUC,KAAI,4BAA4B,EAAE,MAAM;AACxD,QAAI;AACF,YAAM,MAAM,aAAa;AAGzB,cAAQ,OAAO;AACf,YAAM,QAAQ,IAAI,YAAY,KAAK,MAAM,KAAK,aAAa,KAAK,KAAK;AAGrE,cAAQ,OAAO;AACf,YAAM,WAAW,MAAM,MAAM,gBAAgB;AAE7C,cAAQ,OAAO;AACf,YAAM,SAAS,UAAU;AAEzB,YAAM,UAAU,MAAM;AACtB,UAAI,CAAC,SAAS;AACZ,gBAAQ,KAAK,gDAAgD;AAC7D,gBAAQ,IAAID,OAAM,IAAI,0CAA0C,CAAC;AACjE;AAAA,MACF;AAGA,YAAM,UAAU,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC,IAAI,OAAO;AAG9E,iBAAW,OAAO;AAElB,cAAQ,QAAQ,+BAA+B,OAAO,EAAE;AACxD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,OAAO,EAAE,CAAC;AAChD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;AAClD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,QAAQ,OAAO,EAAE,CAAC;AACxD,cAAQ,IAAIA,OAAM,IAAI,sCAAsC,CAAC;AAC7D,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,MAAM,gCAAgC,CAAC;AACzD,cAAQ,IAAIA,OAAM,IAAI,0CAA0C,OAAO,mCAAmC,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,cAAQ,KAAK,6BAA6B;AAC1C,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,2DAA2D,EACvE,eAAe,kBAAkB,wBAAwB,EACzD,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAC/B,UAAME,YAAW,eAAe,EAAE;AAClC,UAAM,UAAU,OAAO,KAAK,EAAE;AAE9B,UAAM,UAAUD,KAAI,iCAAiC,OAAO,KAAK,EAAE,MAAM;AACzE,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,aAAa;AAAA,QACtC,SAASC;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO,CAAC;AAAA,MACxB,CAAC;AAED,UAAI,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY,GAAG;AACzD,gBAAQ,KAAK,UAAU,OAAO,gBAAgB,KAAK,mBAAmB;AACtE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,iBAAW,OAAO;AAClB,cAAQ,QAAQ,UAAU,OAAO,6BAA6B;AAC9D,cAAQ,IAAIF,OAAM,IAAI,aAAa,QAAQ,OAAO,EAAE,CAAC;AACrD,cAAQ,IAAIA,OAAM,IAAI,oCAAoC,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB;AACtC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,4EAA4E,EACxF,OAAO,sBAAsB,kCAAkC,EAC/D,OAAO,iBAAiB,wEAAwE,EAChG,OAAO,gBAAgB,mDAAmD,EAC1E,OAAO,OAAO,SAAS;AACtB,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,MAAM;AAC9B,cAAQ,MAAMA,OAAM,IAAI,qDAAqD,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAUC,KAAI,gCAAgC,EAAE,MAAM;AAC5D,QAAI;AACF,YAAM,MAAM,aAAa;AACzB,YAAM,UAAmC,CAAC;AAC1C,UAAI,KAAK,OAAQ,SAAQ,gBAAgB,KAAK;AAC9C,UAAI,KAAK,KAAM,SAAQ,OAAO,KAAK;AAEnC,cAAQ,SAAS,KAAK,YAAY,QAAQ,CAAC,SAAS,EAAE,EAAE;AAExD,YAAM,UAAU,MAAM,IAAI,aAAa,OAAO;AAC9C,cAAQ,KAAK;AAEb,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,IAAID,OAAM,IAAI,yCAAyC,CAAC;AAChE,gBAAQ,IAAIA,OAAM,IAAI,8DAA8D,CAAC;AACrF;AAAA,MACF;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,KAAK,SAAS,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,GAAG,EAAE,CAAC;AACzF,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,iBAAW,KAAK,SAAS;AAEvB,cAAM,QAAQ,OAAO,EAAE,OAAO;AAC9B,cAAM,UAAU,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AAC5D,gBAAQ,IAAI,KAAKA,OAAM,KAAK,IAAI,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQA,OAAM,IAAI,WAAW,CAAC,EAAE;AACjF,gBAAQ,IAAIA,OAAM,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC;AACjD,gBAAQ,IAAIA,OAAM,IAAI,eAAe,KAAK,EAAE,CAAC;AAC7C,YAAI,EAAE,QAAQ,QAAQ;AACpB,kBAAQ,IAAIA,OAAM,IAAI,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,QACrD;AACA,YAAI,EAAE,eAAe;AACnB,kBAAQ,IAAIA,OAAM,IAAI,eAAe,EAAE,aAAa,EAAE,CAAC;AAAA,QACzD;AAAA,MACF;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,MAAM,uCAAuC,CAAC;AAChE,cAAQ,IAAIA,OAAM,IAAI,yCAAyC,CAAC;AAAA,IAClE,SAAS,KAAK;AACZ,cAAQ,KAAK,eAAe;AAC5B,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,UAAM,UAAU,WAAW;AAC3B,UAAME,YAAW,eAAe,EAAE;AAClC,UAAM,SAAS,gBAAgB;AAE/B,UAAM,UAAUD,KAAI,sBAAsB,EAAE,MAAM;AAClD,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,aAAa;AAAA,QACxC,SAASC;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,cAAQ,KAAK;AAEb,YAAM,UAAU,WAAW;AAE3B,cAAQ,IAAI;AACZ,cAAQ,IAAIF,OAAM,KAAK,2BAA2B,CAAC;AACnD,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,cAAQ,IAAI,iBAAiB,QAAQ,OAAO,EAAE;AAC9C,cAAQ,IAAI,iBAAiBE,SAAQ,EAAE;AACvC,cAAQ,IAAI,iBAAiB,QAAQ,SAAS,CAAC,EAAE;AAEjD,UAAI,SAAS;AAEX,YAAI;AACF,gBAAM,QAAQ,MAAM,OAAO,aAAa;AAAA,YACtC,SAASA;AAAA,YACT,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,OAAO,OAAO,CAAC;AAAA,UACxB,CAAC;AAED,gBAAM,UAAU,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACpE,kBAAQ,IAAI,kBAAkB,OAAO,IAAI,UAAUF,OAAM,MAAM,YAAY,IAAIA,OAAM,IAAI,eAAe,QAAQ,GAAG,CAAC,EAAE;AAGtH,cAAI,SAAS;AACX,gBAAI;AACF,oBAAM,MAAM,aAAa;AACzB,oBAAM,QAAQ,MAAM,IAAI,UAAU,GAAG,SAAS,EAAE,EAAE,IAAI,OAAO,EAAE;AAC/D,kBAAI,MAAM,KAAM,SAAQ,IAAI,iBAAiB,MAAM,IAAI,EAAE;AACzD,kBAAI,MAAM,YAAa,SAAQ,IAAI,iBAAiBA,OAAM,IAAI,MAAM,WAAW,CAAC,EAAE;AAClF,kBAAI,MAAM,cAAe,SAAQ,IAAI,iBAAiB,MAAM,aAAa,EAAE;AAAA,YAC7E,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,QAAQ;AACN,kBAAQ,IAAI,kBAAkB,OAAO,IAAIA,OAAM,IAAI,mBAAmB,CAAC,EAAE;AAAA,QAC3E;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,iBAAiBA,OAAM,IAAI,wDAAmD,CAAC,EAAE;AAAA,MAC/F;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACrRA,SAAS,aAAAG,YAAW,sBAAAC,4BAA0B;AAG9C,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,gBAAAC,qBAAoB;;;ACTtB,SAAS,oBAAoB,SAAyB;AAC3D,QAAM,IAAI,OAAO,OAAO;AACxB,MAAI,KAAK,MAAO,QAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC;AACtE,MAAI,KAAK,KAAM,QAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC;AACnE,MAAI,KAAK,GAAI,QAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC1C,SAAO,GAAG,CAAC;AACb;AAGO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,IAAI,OAAO,OAAO;AACxB,MAAI,KAAK,MAAO,QAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,MAAM,EAAE;AACnG,MAAI,KAAK,KAAM,QAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,MAAM,EAAE;AAC/F,MAAI,KAAK,GAAI,QAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC1C,SAAO,GAAG,CAAC;AACb;AAGO,SAAS,aAAa,KAAa,WAAmB,GAAW;AACtE,QAAM,MAAM,OAAO,GAAG,IAAI,MAAM;AAChC,SAAO,IAAI,eAAe,SAAS,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC;AAC3F;AAGO,SAAS,WAAW,KAAqB;AAC9C,QAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,SAAO,IAAI,IAAI,eAAe,SAAS,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC,CAAC;AAChG;AAGO,SAAS,eAAe,OAAe,MAAsB;AAClE,MAAI,CAAC,UAAU,KAAK,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,WAAW,IAAI,MAAM,KAAK,0BAA0B;AAAA,EACtE;AACA,SAAO,OAAO,KAAK;AACrB;;;AC/BA,SAAS,oBAAoB,sBAAAC,2BAA0B;AACvD,OAAOC,YAAW;AAWlB,IAAM,IAAIC,OAAM;AAChB,IAAM,IAAIA,OAAM;AAChB,IAAM,MAAMA,OAAM;AAClB,IAAM,OAAOA,OAAM,MAAM;AACzB,IAAM,QAAQA,OAAM,MAAM;AAC1B,IAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AA2CjD,IAAM,sBAAsB;AAAA,EAC1B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,cAAc,MAAM,UAAU,CAAC;AAAA,IAChD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,gBAAgB,MAAM,UAAU,CAAC;AAAA,IAClD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,gBAAgB,MAAM,UAAU,CAAC;AAAA,IAClD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,gBAAgB,MAAM,UAAU,CAAC;AAAA,IAClD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,eAAe,MAAM,UAAU,CAAC;AAAA,IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAIA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,YAAY,CAAC;AAAA,IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,YAAY,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,UAAU,CAAC;AAAA,IAC5C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAIA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,UACnC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,UACpC,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,UAC9B,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,UACrC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,UACpC,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,UAC5C,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,EAClD;AACF;AAIA,SAAS,gBAAqC;AAC5C,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,MAAM,CAAC,MAAe,UAAkB;AAC5C,QAAI,SAAS,8CAA8C;AACzD,UAAI,IAAI,KAAK,YAAY,GAAG,KAAK;AAAA,IACnC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,MAAM,MAAM;AACvB,QAAI,OAAO,MAAM,MAAM;AACvB,QAAI,OAAO,OAAO,OAAO;AACzB,QAAI,OAAO,QAAQ,QAAQ;AAC3B,QAAI,OAAO,OAAO,OAAO;AACzB,QAAI,OAAO,KAAK,KAAK;AACrB,QAAI,OAAO,MAAM,MAAM;AAEvB,UAAM,KAAK,SAAS;AACpB,QAAI,GAAG,aAAa,sBAAsB;AAC1C,QAAI,GAAG,OAAO,OAAO;AACrB,QAAI,GAAG,OAAO,OAAO;AACrB,QAAI,GAAG,QAAQ,QAAQ;AACvB,QAAI,GAAG,SAAS,SAAS;AACzB,QAAI,GAAG,QAAQ,QAAQ;AACvB,QAAI,GAAG,MAAM,MAAM;AACnB,QAAI,GAAG,OAAO,OAAO;AAErB,UAAM,MAAM,QAAQ;AACpB,QAAI,IAAI,aAAa,YAAY;AACjC,QAAI,IAAI,WAAW,UAAU;AAE7B,UAAM,KAAK,SAAS;AACpB,QAAI,GAAG,SAAS,kBAAkB;AAClC,QAAI,GAAG,UAAU,mBAAmB;AAEpC,UAAM,OAAO,UAAU;AACvB,QAAI,KAAK,QAAQ,kBAAkB;AACnC,QAAI,KAAK,SAAS,mBAAmB;AAErC,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,KAAK,KAAK;AACrB,QAAI,OAAO,SAAS,cAAc;AAClC,QAAI,OAAO,MAAM,MAAM;AAEvB,UAAM,SAAS,mBAAmB;AAClC,QAAI,OAAO,iBAAiB,wBAAwB;AACpD,QAAI,OAAO,cAAc,qBAAqB;AAC9C,QAAI,OAAO,kBAAkB,yBAAyB;AACtD,QAAI,OAAO,iBAAiB,wBAAwB;AAAA,EACtD,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAGA,SAAS,mBAAsE;AAC7E,QAAM,MAAM,oBAAI,IAAkD;AAClE,MAAI;AACF,UAAM,SAAS,OAAO;AACtB,QAAI,IAAI,OAAO,KAAK,YAAY,GAAG,EAAE,UAAU,GAAG,QAAQ,OAAO,CAAC;AAClE,QAAI,IAAI,OAAO,KAAK,YAAY,GAAG,EAAE,UAAU,IAAI,QAAQ,OAAO,CAAC;AACnE,QAAI,IAAI,OAAO,MAAM,YAAY,GAAG,EAAE,UAAU,IAAI,QAAQ,QAAQ,CAAC;AACrE,QAAI,IAAI,OAAO,OAAO,YAAY,GAAG,EAAE,UAAU,IAAI,QAAQ,SAAS,CAAC;AACvE,QAAI,IAAI,OAAO,MAAM,YAAY,GAAG,EAAE,UAAU,GAAG,QAAQ,QAAQ,CAAC;AACpE,QAAI,IAAI,OAAO,IAAI,YAAY,GAAG,EAAE,UAAU,IAAI,QAAQ,MAAM,CAAC;AACjE,QAAI,IAAI,OAAO,KAAK,YAAY,GAAG,EAAE,UAAU,IAAI,QAAQ,OAAO,CAAC;AAAA,EACrE,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAGA,SAAS,0BAA+C;AACtD,QAAM,MAAM,oBAAI,IAAoB;AACpC,MAAI;AACF,UAAM,KAAK,SAAS;AACpB,UAAM,SAAS,OAAO;AACtB,QAAI,IAAI,GAAG,MAAM,YAAY,GAAG,OAAO,KAAK,YAAY,CAAC;AACzD,QAAI,IAAI,GAAG,MAAM,YAAY,GAAG,OAAO,KAAK,YAAY,CAAC;AACzD,QAAI,IAAI,GAAG,OAAO,YAAY,GAAG,OAAO,MAAM,YAAY,CAAC;AAC3D,QAAI,IAAI,GAAG,QAAQ,YAAY,GAAG,OAAO,OAAO,YAAY,CAAC;AAC7D,QAAI,IAAI,GAAG,OAAO,YAAY,GAAG,OAAO,MAAM,YAAY,CAAC;AAC3D,QAAI,IAAI,GAAG,KAAK,YAAY,GAAG,OAAO,IAAI,YAAY,CAAC;AACvD,QAAI,IAAI,GAAG,MAAM,YAAY,GAAG,OAAO,KAAK,YAAY,CAAC;AAAA,EAC3D,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAA8B;AAC5D,QAAM,SAAS,cAAc;AAC7B,SAAO,OAAO,IAAI,KAAK,YAAY,CAAC,KAAK;AAC3C;AAIA,SAAS,UAAU,MAAsB;AACvC,SAAO,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;AAChD;AAEA,SAAS,YAAY,MAAsB;AACzC,QAAM,QAAQ,cAAc,EAAE,IAAI,KAAK,YAAY,CAAC;AACpD,QAAM,QAAQ,UAAU,IAAI;AAC5B,SAAO,QAAQ,GAAG,KAAK,KAAK,KAAK,MAAM;AACzC;AAEA,SAAS,kBAAkB,QAAgB,QAAwB;AACjE,QAAM,cAAc,iBAAiB;AAGrC,QAAM,YAAY,YAAY,IAAI,OAAO,YAAY,CAAC;AACtD,MAAI,WAAW;AACb,WAAO,mBAAmB,QAAQ,UAAU,UAAU,UAAU,MAAM;AAAA,EACxE;AAGA,QAAM,YAAY,wBAAwB;AAC1C,QAAM,aAAa,UAAU,IAAI,OAAO,YAAY,CAAC;AACrD,MAAI,YAAY;AACd,UAAM,iBAAiB,YAAY,IAAI,UAAU;AACjD,QAAI,gBAAgB;AAClB,aAAO,mBAAmB,QAAQ,eAAe,UAAU,eAAe,MAAM;AAAA,IAClF;AAAA,EACF;AAGA,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,mBAAmB,QAAgB,UAAkB,QAAwB;AACpF,QAAM,MAAM,OAAO,MAAM,IAAI,MAAM;AACnC,QAAM,YAAY,IAAI,eAAe,SAAS;AAAA,IAC5C,uBAAuB;AAAA,IACvB,uBAAuB,YAAY,IAAI,IAAI;AAAA,EAC7C,CAAC;AACD,SAAO,GAAG,SAAS,IAAI,MAAM;AAC/B;AAQO,SAAS,eAAe,QAAiB,MAA0B;AACxE,MAAI,KAAK,SAAS,GAAI,QAAO;AAE7B,QAAM,SAAS,cAAc;AAC7B,QAAM,cAAc,OAAO,YAAY;AAIvC,QAAM,aAAyB,CAAC;AAGhC,QAAM,KAAK,SAAS,MAAM,SAAS,CAAC;AACpC,MAAI,IAAI;AACN,UAAM,WAAW,CAAC,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,EACtF,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,WAAW;AAC9C,QAAI,UAAU;AACZ,iBAAW,KAAK,EAAE,KAAK,qBAAqB,SAAS,OAAO,IAAI,WAAW,KAAK,SAAS,CAAC;AAAA,IAC5F;AAEA,QAAI,GAAG,YAAY,YAAY,MAAM,aAAa;AAChD,iBAAW,KAAK,EAAE,KAAK,0BAA0B,SAAS,cAAc,CAAC;AAAA,IAC3E;AAAA,EACF;AAGA,QAAM,MAAM,SAAS,MAAM,QAAQ,CAAC;AACpC,MAAI,OAAO,IAAI,YAAY,YAAY,MAAM,aAAa;AACxD,eAAW,KAAK,EAAE,KAAK,iBAAiB,SAAS,aAAa,CAAC;AAC/D,eAAW,KAAK,EAAE,KAAK,wBAAwB,SAAS,aAAa,CAAC;AAAA,EACxE;AAGA,aAAW,KAAK,EAAE,KAAK,WAAW,SAAS,OAAO,IAAI,WAAW,KAAK,QAAQ,CAAC;AAE/E,aAAW,EAAE,KAAK,QAAQ,KAAK,YAAY;AACzC,QAAI;AACF,YAAM,UAAU,mBAAmB;AAAA,QACjC;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,OAAO,WAAW,QAAQ,MAA4B,QAAQ,cAAc,MAAM;AACxF,aAAO,GAAG,QAAQ,YAAY,IAAI,IAAI;AAAA,IACxC,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,MAA0B,cAAsB,QAAyB;AAC3F,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,QAAM,QAAkB,CAAC;AAEzB,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,KAAK,kBAAkB,KAAK,MAAM,CAAC;AAAA,IAC3C,WAAW,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI;AAC/E,YAAM,KAAK,YAAY,GAAG,CAAC;AAAA,IAC7B,WAAW,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAEzE,YAAM,UAAU,OAAO,QAAQ,GAA8B;AAC7D,YAAM,cAAwB,CAAC;AAC/B,iBAAW,CAAC,KAAK,GAAG,KAAK,SAAS;AAChC,YAAI,OAAO,QAAQ,UAAU;AAC3B,sBAAY,KAAK,GAAG,GAAG,KAAK,kBAAkB,KAAK,MAAM,CAAC,EAAE;AAAA,QAC9D,WAAW,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI;AAC/E,sBAAY,KAAK,GAAG,GAAG,KAAK,YAAY,GAAG,CAAC,EAAE;AAAA,QAChD,WAAW,OAAO,QAAQ,YAAY,IAAI,WAAW,IAAI,KAAK,QAAQ,QAAQ;AAC5E,sBAAY,KAAK,SAAS,kBAAkB,GAAG,CAAC,EAAE;AAAA,QACpD,OAAO;AACL,sBAAY,KAAK,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,EAAE;AAAA,QAC3C;AAAA,MACF;AACA,YAAM,KAAK,IAAI,YAAY,KAAK,IAAI,CAAC,GAAG;AAAA,IAC1C,WAAW,MAAM,QAAQ,GAAG,GAAG;AAC7B,YAAM,WAAY,IAAkB,IAAI,CAAC,SAAS;AAChD,YAAI,OAAO,SAAS,YAAY,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI;AAC3E,iBAAO,YAAY,IAAI;AAAA,QACzB;AACA,eAAO,OAAO,IAAI;AAAA,MACpB,CAAC;AACD,YAAM,KAAK,IAAI,SAAS,KAAK,IAAI,CAAC,GAAG;AAAA,IACvC,OAAO;AACL,YAAM,KAAK,OAAO,GAAG,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,SAAS,cAAc;AAC7B,QAAM,OAAO,QAAQ,WAAW,IAAI,IAAI,QAAQ,MAAM,CAAC,IAAI;AAC3D,QAAM,SAAmB,CAAC;AAG1B,MAAI,SAAS;AACb,SAAO,SAAS,MAAM,KAAK,QAAQ;AACjC,UAAM,OAAO,KAAK,KAAK,MAAM,QAAQ,SAAS,EAAE,CAAC;AACjD,UAAM,QAAQ,OAAO,IAAI,KAAK,YAAY,CAAC;AAC3C,WAAO,KAAK,SAAS,UAAU,IAAI,CAAC;AACpC,cAAU;AACV,QAAI,SAAS,KAAK,KAAK,QAAQ;AAC7B,gBAAU;AAAA,IACZ,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,UAAK;AAC1B;AAEA,SAAS,SAAY,IAAuB;AAC1C,MAAI;AACF,WAAO,GAAG;AAAA,EACZ,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAcA,SAAS,eAAe,QAAiB,MAA+B;AACtE,MAAI,KAAK,SAAS,GAAI,QAAO;AAE7B,QAAM,cAAc,OAAO,YAAY;AAEvC,QAAM,aAAyB,CAAC;AAEhC,QAAM,KAAK,SAAS,MAAM,SAAS,CAAC;AACpC,MAAI,IAAI;AACN,UAAM,WAAW,CAAC,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,EACtF,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,WAAW;AAC9C,QAAI,SAAU,YAAW,KAAK,EAAE,KAAK,oBAAoB,CAAC;AAC1D,QAAI,GAAG,YAAY,YAAY,MAAM,YAAa,YAAW,KAAK,EAAE,KAAK,yBAAyB,CAAC;AAAA,EACrG;AAEA,QAAM,MAAM,SAAS,MAAM,QAAQ,CAAC;AACpC,MAAI,OAAO,IAAI,YAAY,YAAY,MAAM,aAAa;AACxD,eAAW,KAAK,EAAE,KAAK,gBAAgB,CAAC;AACxC,eAAW,KAAK,EAAE,KAAK,uBAAuB,CAAC;AAAA,EACjD;AAEA,aAAW,KAAK,EAAE,KAAK,UAAU,CAAC;AAElC,aAAW,EAAE,IAAI,KAAK,YAAY;AAChC,QAAI;AACF,YAAM,UAAU,mBAAmB,EAAE,KAAgC,KAAK,CAAC;AAC3E,aAAO,EAAE,cAAc,QAAQ,cAAc,MAAM,QAAQ,KAA2B;AAAA,IACxF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,YACd,OACA,aACA,SACY;AACZ,QAAM,QAAoB,CAAC;AAC3B,QAAM,SAAS,cAAc;AAC7B,QAAM,aAAa,SAAS,OAAO,YAAY;AAE/C,QAAM,UAAU,CAAC,SAA0B;AACzC,UAAM,QAAQ,KAAK,YAAY;AAC/B,WAAO,OAAO,IAAI,KAAK,KAAK,UAAU;AAAA,EACxC;AAIA,MAAI,qBAAqB;AACzB,MAAI,kBAAkB;AAEtB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,SAAS,YAAY,CAAC;AAC5B,UAAM,UAAU,IAAI;AAGpB,QAAI,UAAU,CAAC,OAAO,SAAS;AAC7B,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,SAAS,OAAO,OAAO,YAAY,KAAK,MAAM,CAAC;AAAA,QACxD,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,QAAQ,KAAK,MAAM;AACvC,QAAI,CAAC,aAAa;AAChB,2BAAqB;AACrB,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,CAAC;AAAA,QAC7D,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,eAAe,KAAK,QAAQ,KAAK,IAAI;AAErD,QAAI,CAAC,SAAS;AACZ,wBAAkB;AAClB,UAAI,CAAC,aAAa;AAChB,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,SAAS,OAAO,wCAAwC,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,UACvF,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,iBAAiB,cAAc,QAAQ,KAAK,UAAU,GAAG;AACnE,YAAM,KAAK,QAAQ,KAAK,CAAC;AACzB,UAAI,OAAO,OAAO,YAAY,GAAG,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,GAAG;AACjE,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,SAAS,OAAO,8BAA8B,UAAU,EAAE,CAAC;AAAA,UACpE,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,QAAQ,iBAAiB,kBAAkB,QAAQ,KAAK,UAAU,GAAG;AACvE,YAAM,KAAK,QAAQ,KAAK,CAAC;AACzB,UAAI,OAAO,OAAO,YAAY,GAAG,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,GAAG;AACjE,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,SAAS,OAAO,kCAAkC,UAAU,EAAE,CAAC;AAAA,UACxE,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,QAAQ,iBAAiB,aAAa,QAAQ,KAAK,UAAU,GAAG;AAClE,YAAM,UAAU,QAAQ,KAAK,CAAC;AAC9B,UAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,IAAI,KAAK,CAAC,QAAQ,OAAO,GAAG;AAChF,cAAM,KAAK;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,SAAS,OAAO,kCAAkC,UAAU,OAAO,CAAC;AAAA,UAC7E,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAIA,MAAI,SAAS,sBAAsB,QAAW;AAC5C,UAAM,MAAM,QAAQ;AACpB,UAAM,SAAS,QAAQ,gBAAgB;AAEvC,QAAI,UAAU,MAAO,SAAS,MAAO,MAAM;AACzC,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,mBAAmB,OAAO,GAAG,IAAI,GAAG,oCAAoC,OAAO,MAAM,IAAI,GAAG;AAAA,MACvG,CAAC;AAAA,IACH,WAAW,MAAM,OAAO;AACtB,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,mBAAmB,OAAO,GAAG,IAAI,GAAG;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,qBAAqB,QAAW;AAC3C,UAAM,MAAM,QAAQ;AACpB,QAAI,MAAM,OAAO;AACf,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,qBAAqB,OAAO,GAAG,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH;AACA,QAAI,MAAM,UAAY;AACpB,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,qBAAqB,OAAO,GAAG,IAAI,KAAK;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF;AAIA,QAAM,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,UAAU;AAC5D,QAAM,aAAa,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS;AAE1D,MAAI,CAAC,eAAe,CAAC,YAAY;AAC/B,QAAI,oBAAoB;AACtB,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,iBAAiB;AACnB,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAIA,IAAM,WAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,gBAAgB;AAClB;AAEA,SAAS,gBAAwB;AAE/B,MAAI,QAAQ,IAAI,iBAAkB,QAAO,QAAQ,IAAI;AAErD,QAAM,QAAQ,SAAS;AACvB,SAAO,SAAS,MAAM,UAAU,iBAAiB,MAAM,KAAK,SAAS,MAAM;AAC7E;AAEA,eAAe,eACb,OACA,OAC2B;AAC3B,QAAM,UAAU,cAAc;AAC9B,QAAM,UAAU,SAAS,EAAE;AAE3B,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB;AAAA,IACtD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB;AAAA,MACA;AAAA,MACA,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,QACvB,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,QACR,OAAO,EAAE,MAAM,SAAS;AAAA,MAC1B,EAAE;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,gBAAgB,EAAE;AAC3E,UAAM,IAAI,MAAM,KAAK,SAAS,2BAA2B,SAAS,MAAM,EAAE;AAAA,EAC5E;AAEA,QAAM,SAAS,MAAM,SAAS,KAAK;AAanC,QAAM,cAAsC,OAAO,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,IACtE,OAAO,EAAE;AAAA,IACT,QAAS,MAAM,CAAC,GAAG,UAAU,EAAE;AAAA,IAC/B,iBAAiB,MAAM,CAAC,IAAI,eAAe,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7E,UAAW,MAAM,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,KAAK;AAAA,IAC1C,SAAS,EAAE;AAAA,IACX,SAAS,EAAE;AAAA,EACb,EAAE;AAIF,aAAW,MAAM,aAAa;AAC5B,QAAI,CAAC,GAAG,iBAAiB;AACvB,YAAM,eAAe,MAAM,GAAG,KAAK;AACnC,UAAI,cAAc;AAChB,WAAG,kBAAkB,eAAe,aAAa,QAAQ,aAAa,IAAI;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAqB,CAAC;AAC5B,aAAW,MAAM,aAAa;AAC5B,QAAI,CAAC,GAAG,SAAS;AACf,eAAS,KAAK,SAAS,GAAG,QAAQ,CAAC,OAAO,YAAY,GAAG,MAAM,CAAC,SAAS;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR,QAAQ;AAAA,IACR,cAAc,OAAO,gBAAgB;AAAA,EACvC;AACF;AAIA,eAAe,mBACb,OACA,OAC2B;AAC3B,QAAM,WAAW,mBAAmB;AACpC,QAAM,SAAS,gBAAgB;AAE/B,QAAMC,SAAQC,oBAAmB;AAAA,IAC/B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,CAAC;AAAA,EAC/E,CAAC;AAGD,QAAM,cAAsC,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,IAC/D,OAAO;AAAA,IACP,QAAQ,EAAE;AAAA,IACV,iBAAiB,eAAe,EAAE,QAAQ,EAAE,IAAI;AAAA,IAChD,UAAU,EAAE,KAAK,MAAM,GAAG,EAAE;AAAA,IAC5B,SAAS;AAAA;AAAA,IACT,SAAS;AAAA,EACX,EAAE;AAEF,MAAI;AACF,UAAM,OAAO,KAAK;AAAA,MAChB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,MAAMD;AAAA,IACR,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAG/D,eAAW,MAAM,aAAa;AAC5B,SAAG,UAAU;AAAA,IACf;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,MACA,UAAU,CAAC,mBAAmB,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,MACrD,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAIA,eAAsB,mBACpB,OACA,OACA,UACA,aAC2B;AAC3B,MAAI;AAEJ,MAAI;AACF,aAAS,MAAM,eAAe,OAAO,KAAK;AAAA,EAC5C,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAQ,IAAI,IAAI,iCAAiC,OAAO,gCAAgC,CAAC;AAEzF,aAAS,MAAM,mBAAmB,OAAO,KAAK;AAAA,EAChD;AAGA,QAAM,MAAmB,EAAE,OAAO,GAAG,YAAY;AACjD,SAAO,QAAQ,YAAY,OAAO,OAAO,aAAa,GAAG;AAEzD,SAAO;AACT;AAIO,SAAS,sBAAsB,QAA0B,UAAwB;AACtF,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,8BAAoB,QAAQ,QAAQ,CAAC;AACvD,MAAI;AAEJ,QAAM,cAAc,OAAO,WAAW,QAClC,uBACA,YAAY,IAAI,2CAA2C,CAAC;AAChE,UAAQ,IAAI,EAAE,iBAAiB,WAAW,EAAE,CAAC;AAE7C,QAAM,aAAa,OAAO,UAAU,EAAE,aAAQ,IAAID,OAAM,IAAI,aAAQ;AACpE,UAAQ,IAAI,EAAE,iBAAiB,UAAU,EAAE,CAAC;AAE5C,MAAI,OAAO,eAAe,GAAG;AAC3B,YAAQ,IAAI,EAAE,iBAAiB,OAAO,aAAa,eAAe,CAAC,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,OAAO,gBAAgB,CAAC,OAAO,SAAS;AAC1C,YAAQ,IAAIA,OAAM,IAAI,iBAAiB,OAAO,aAAa,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EAC7E;AAEA,UAAQ,IAAI;AAEZ,aAAW,MAAM,OAAO,aAAa;AACnC,UAAM,OAAO,GAAG,UAAU,EAAE,QAAG,IAAIA,OAAM,IAAI,QAAG;AAChD,UAAM,WAAW,GAAG,mBAAmB,GAAG,GAAG,QAAQ,OAAO,IAAI,WAAW,CAAC;AAC5E,YAAQ,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC;AAEzD,UAAM,QAAQ,gBAAgB,GAAG,MAAM;AACvC,UAAM,gBAAgB,QAAQ,GAAG,GAAG,MAAM,KAAK,KAAK,MAAM,GAAG;AAC7D,YAAQ,IAAI,IAAI,iBAAiB,aAAa,EAAE,CAAC;AAEjD,QAAI,GAAG,UAAU,GAAG;AAClB,cAAQ,IAAI,IAAI,iBAAiB,GAAG,QAAQ,eAAe,CAAC,EAAE,CAAC;AAAA,IACjE;AAEA,YAAQ,IAAI;AAAA,EACd;AAGA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAM,YAAY,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,UAAU;AACnE,UAAM,WAAW,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS;AACjE,UAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM;AAE3D,QAAI,UAAU,SAAS,GAAG;AACxB,cAAQ,IAAIA,OAAM,IAAI,KAAK,4BAAuB,UAAU,MAAM,GAAG,CAAC;AACtE,iBAAW,KAAK,WAAW;AACzB,cAAM,MAAM,EAAE,cAAc,SAAY,WAAW,EAAE,YAAY,CAAC,MAAM;AACxE,gBAAQ,IAAIA,OAAM,IAAI,aAAQ,GAAG,IAAI,EAAE,IAAI,WAAM,EAAE,OAAO,EAAE,CAAC;AAAA,MAC/D;AACA,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ,IAAIA,OAAM,OAAO,KAAK,sBAAiB,SAAS,MAAM,GAAG,CAAC;AAClE,iBAAW,KAAK,UAAU;AACxB,cAAM,MAAM,EAAE,cAAc,SAAY,WAAW,EAAE,YAAY,CAAC,MAAM;AACxE,gBAAQ,IAAIA,OAAM,OAAO,aAAQ,GAAG,IAAI,EAAE,IAAI,WAAM,EAAE,OAAO,EAAE,CAAC;AAAA,MAClE;AACA,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,UAAU,WAAW,KAAK,SAAS,WAAW,KAAK,MAAM,SAAS,GAAG;AACvE,cAAQ,IAAI,EAAE,KAAK,iCAA4B,CAAC;AAChD,iBAAW,KAAK,OAAO;AACrB,gBAAQ,IAAI,EAAE,cAAS,EAAE,OAAO,EAAE,CAAC;AAAA,MACrC;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,IAAIA,OAAM,OAAO,8BAAyB,CAAC;AACnD,eAAW,KAAK,OAAO,UAAU;AAC/B,cAAQ,IAAIA,OAAM,OAAO,SAAS,CAAC,EAAE,CAAC;AAAA,IACxC;AACA,YAAQ,IAAI;AAAA,EACd;AAEA,MAAI;AACN;AASA,eAAsB,oBACpB,WACA,YACA,OACA,YACA,cACe;AACf,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,oBAAW;AACrC,UAAM,EAAE,YAAAG,YAAW,IAAI,MAAM,OAAO,sBAAa;AAEjD,UAAM,QAAQ,MAAM,KAAK,SAAS,IAAI,SAAS;AAG/C,UAAM,WAAW,CAAC,GAAG,WAAW,OAAO,GAAI,cAAc,SAAS,CAAC,CAAE;AACrE,UAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,UAAU;AAC/D,UAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS;AAE7D,UAAM,eAA0B,UAAU,SAAS,IAAI,aAAa,SAAS,SAAS,IAAI,YAAY;AAGtG,UAAM,QAAkB,CAAC;AACzB,UAAM,cAAc,iBAAiB,aAAa,cAAO,iBAAiB,YAAY,iBAAO;AAC7F,UAAM,aAAa,iBAAiB,aAAa,mBAAmB,iBAAiB,YAAY,aAAa;AAE9G,UAAM,KAAK,MAAM,WAAW,cAAc,UAAU,2BAAsB;AAC1E,UAAM,KAAK,gBAAgB,UAAU,KAAK,CAAC,IAAI;AAC/C,UAAM,KAAK,eAAe,UAAU,EAAE;AACtC,UAAM,KAAK,eAAe,WAAW,WAAW,QAAQ,aAAa,UAAU,EAAE;AACjF,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,qBAAqB,WAAW,UAAU,WAAM,QAAG,EAAE;AAChE,eAAW,MAAM,WAAW,aAAa;AACvC,YAAM,OAAO,GAAG,UAAU,WAAM;AAChC,YAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,QAAQ;AAC/C,YAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK;AAC1D,YAAM,SAAS,QAAQ,KAAK,UAAU,aAAa,eAAU,KAAK,OAAO,OAAO;AAChF,YAAM,KAAK,GAAG,GAAG,QAAQ,CAAC,KAAK,IAAI,MAAM,EAAE,KAAK,MAAM,EAAE;AAAA,IAC1D;AACA,UAAM,KAAK,EAAE;AAGb,QAAI,gBAAgB,aAAa,YAAY,SAAS,GAAG;AACvD,YAAM,KAAK,wBAAwB,aAAa,UAAU,WAAM,QAAG,EAAE;AACrE,iBAAW,MAAM,aAAa,aAAa;AACzC,cAAM,OAAO,GAAG,UAAU,WAAM;AAChC,cAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,QAAQ;AAC/C,cAAM,KAAK,GAAG,GAAG,QAAQ,CAAC,KAAK,IAAI,MAAM,EAAE,IAAI;AAAA,MACjD;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,8BAAuB;AAClC,iBAAW,KAAK,WAAW;AACzB,cAAM,MAAM,EAAE,cAAc,SAAY,WAAW,EAAE,YAAY,CAAC,MAAM;AACxE,cAAM,KAAK,OAAO,EAAE,IAAI,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE;AAAA,MAClD;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,KAAK,2BAAiB;AAC5B,iBAAW,KAAK,UAAU;AACxB,cAAM,MAAM,EAAE,cAAc,SAAY,WAAW,EAAE,YAAY,CAAC,MAAM;AACxE,cAAM,KAAK,OAAO,EAAE,IAAI,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE;AAAA,MAClD;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,iBAAiB,YAAY;AAC/B,YAAM,KAAK,qBAAqB;AAChC,YAAM,KAAK,oDAA+C;AAAA,IAC5D,WAAW,iBAAiB,WAAW;AACrC,YAAM,KAAK,qBAAqB;AAChC,YAAM,KAAK,sEAAiE;AAAA,IAC9E,OAAO;AACL,YAAM,KAAK,8BAAyB;AACpC,YAAM,KAAK,mEAAmE;AAAA,IAChF;AAEA,UAAM,WAAW,MAAM,KAAK,IAAI;AAChC,UAAM,cAAc,iBAAiB,aAAa,eAAwB;AAE1E,UAAM,KAAK,aAAa,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN,MAAMA,YAAW,EAAE;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY,OAAO,UAAU;AAAA,QAC7B;AAAA,QACA,WAAW;AAAA,QACX,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QACvE,mBAAmB,WAAW,YAAY,cAAc,WAAW;AAAA,MACrE;AAAA,MACA,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACzC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAQ,IAAIH,OAAM,OAAO,uCAAkC,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,EACrF;AACF;;;AF78BA,IAAMI,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAEjD,SAAS,gBAAgB,IAAoB;AAC3C,MAAI,OAAO,GAAI,QAAO;AACtB,SAAO,IAAI,KAAK,OAAO,EAAE,IAAI,GAAI,EAAE,eAAe;AACpD;AAEA,SAAS,eAAe,MAA2B;AACjD,QAAM,MAAMI,cAAa,MAAM,OAAO;AACtC,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,SAAO,OAAO,IAAI,CAAC,OAAO;AAAA,IACxB,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE;AAAA,IACR,OAAO,OAAO,EAAE,SAAS,GAAG;AAAA,EAC9B,EAAE;AACJ;AAEO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,2DAAsD;AAI/G,WACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,eAAe,qBAAqB,oCAAoC,EACxE,eAAe,iBAAiB,eAAe,EAC/C,eAAe,wBAAwB,qCAAqC,EAC5E,eAAe,2BAA2B,oCAAoC,EAC9E,eAAe,yBAAyB,wCAAwC,EAChF,eAAe,0BAA0B,6CAA6C,EACtF,eAAe,yBAAyB,gDAAgD,EACxF,OAAO,wBAAwB,4DAAuD,EACtF,OAAO,cAAc,+CAA+C,EACpE,OAAO,WAAW,uDAAuD,EACzE,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAACC,WAAU,KAAK,GAAG;AACrB,gBAAQ,MAAMR,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,oBAAoB,eAAe,KAAK,gBAAgB,iBAAiB;AAC/E,YAAM,mBAAmB,cAAc,KAAK,QAAQ;AACpD,YAAM,eAAe,eAAe,KAAK,YAAY;AACrD,YAAM,cAAc,eAAe,KAAK,WAAW;AAGnD,UAAI,cAAc,KAAK,eAAe;AAEtC,UAAI,CAAC,aAAa;AAChB,cAAMS,WAAUC,KAAI,EAAE,MAAMT,GAAE,+BAA+B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACxF,YAAI;AACF,gBAAM,UAAU,WAAW;AAC3B,gBAAM,WAA8B;AAAA,YAClC,QAAQ;AAAA,YACR,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,YAClB,OAAO,WAAW;AAAA,YAClB,YAAY,CAAC;AAAA,YACb,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAEA,gBAAM,eAAe;AAAA,YACnB,GAAG;AAAA,YACH,UAAU,QAAQ;AAAA,YAClB;AAAA,YACA,mBAAmB,OAAO,iBAAiB;AAAA,YAC3C,kBAAkB,OAAO,gBAAgB;AAAA,YACzC,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,UACzC;AAEA,wBAAc,MAAM,eAAe,YAA4C;AAC/E,UAAAQ,SAAQ,QAAQV,GAAE,oBAAoBG,KAAI,WAAW,CAAC,EAAE,CAAC;AAAA,QAC3D,SAAS,KAAK;AACZ,UAAAO,SAAQ,KAAKT,OAAM,OAAO,iDAA4C,CAAC;AACvE,gBAAM,OAAO,KAAK,UAAU,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,aAAa,MAAM,CAAC;AACrF,wBAAc,gCAAgC,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ,CAAC;AAAA,QACpF;AAAA,MACF;AAGA,cAAQ,IAAI;AACZ,cAAQ,IAAII,OAAM,2BAAsB,CAAC;AACzC,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,uBAAuBE,MAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AACvD,cAAQ,IAAIF,GAAE,uBAAuBF,GAAE,KAAK,CAAC,EAAE,CAAC;AAChD,cAAQ,IAAIE,GAAE,uBAAuB,OAAO,iBAAiB,IAAI,GAAG,GAAG,CAAC;AACxE,cAAQ,IAAIA,GAAE,uBAAuB,oBAAe,gBAAgB,CAAC,EAAE,CAAC;AACxE,cAAQ,IAAIA,GAAE,uBAAuB,aAAa,MAAM,cAAc,YAAY,MAAM,SAAS,CAAC;AAClG,cAAQ,IAAIA,GAAE,uBAAuBC,KAAI,YAAY,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAAQ,WAAW,CAAC,EAAE,CAAC;AACrH,MAAAG,KAAI;AAGJ,UAAI,KAAK,UAAU;AAEjB,YAAI,oBAAiC,EAAE,OAAO,mBAAmB,iBAAiB;AAClF,YAAI;AACF,gBAAM,YAAY,MAAM,kBAAkB;AAC1C,8BAAoB,EAAE,GAAG,mBAAmB,gBAAgB,UAAU;AAAA,QACxE,QAAQ;AAAA,QAAiD;AAEzD,cAAM,aAAaK,KAAI,EAAE,MAAMT,GAAE,6BAA6B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACzF,cAAM,aAAa,MAAM,mBAAmB,OAAO,cAAc,WAAW,iBAAiB;AAC7F,mBAAW,KAAK;AAChB,8BAAsB,YAAY,SAAS;AAE3C,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,gBAAgBS,KAAI,EAAE,MAAMT,GAAE,gCAAgC,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAC/F,gBAAM,eAAe,MAAM,mBAAmB,OAAO,aAAa,cAAc,iBAAiB;AACjG,wBAAc,KAAK;AACnB,gCAAsB,cAAc,YAAY;AAEhD,cAAI,CAAC,aAAa,WAAW,CAAC,KAAK,OAAO;AACxC,oBAAQ,MAAMD,OAAM,IAAI,wEAAmE,CAAC;AAC5F,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,QACF;AAEA,YAAI,CAAC,WAAW,WAAW,CAAC,KAAK,OAAO;AACtC,kBAAQ,MAAMA,OAAM,IAAI,uEAAkE,CAAC;AAC3F,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAGA,cAAM,mBAAmB,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,UAAU;AAC5E,YAAI,oBAAoB,CAAC,KAAK,OAAO;AACnC,kBAAQ,MAAMA,OAAM,IAAI,mEAA8D,CAAC;AACvF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAGA,YAAM,UAAUU,KAAI,EAAE,MAAMT,GAAE,wBAAwB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,SAAS,MAAM,QAAQ,OAAO,aAAa,mBAAmB,kBAAkB,cAAc,WAAW;AAC/G,cAAQ,QAAQF,GAAE,oBAAoB,CAAC;AAEvC,cAAQ,IAAI;AACZ,cAAQ,IAAIK,OAAM,2BAAsB,CAAC;AACzC,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,mBAAmBF,GAAE,IAAI,OAAO,UAAU,EAAE,CAAC,EAAE,CAAC;AAC9D,cAAQ,IAAIE,GAAE,mBAAmBC,KAAI,eAAe,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;AACpE,MAAAG,KAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,oBAAoB,qEAAqE,KAAK,EACrG,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUU,KAAI,sBAAsB,EAAE,MAAM;AAClD,QAAI;AACF,YAAM,QAAQ,MAAM,cAAc;AAClC,UAAI,UAAU,IAAI;AAChB,gBAAQ,KAAK;AACb,gBAAQ,IAAIR,KAAI,2BAA2B,CAAC;AAC5C;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,QAAS,KAAK,MAAiB,YAAY,IAAI;AACxE,YAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,YAAM,aAAa,gBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,MAAM,WAAW;AAGnF,YAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AACzE,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,IAAI,IAAI,OAAO,OAAO;AACpB,gBAAM,CAAC,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;AAC5E,iBAAO,EAAE,GAAG,GAAG,eAAe,MAAM;AAAA,QACtC,CAAC;AAAA,MACH;AAEA,YAAM,YAAY,QAAQ,OAAO,CAAC,MAAM;AACtC,YAAI,eAAe,EAAE,MAAM,YAAY,MAAM,YAAa,QAAO;AACjE,YAAI,gBAAgB,SAAS,cAAc,KAAK,EAAE,kBAAkB,WAAY,QAAO;AACvF,eAAO;AAAA,MACT,CAAC;AAED,cAAQ,KAAK;AAEb,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,IAAIA,KAAI,8BAA8B,CAAC;AAC/C;AAAA,MACF;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAIC,MAAK,cAAc,UAAU,MAAM,GAAG,CAAC;AACnD,cAAQ,IAAID,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAC/B,cAAQ;AAAA,QACNA,KAAI,QAAQ,IACZA,KAAI,QAAQ,OAAO,EAAE,CAAC,IACtBA,KAAI,QAAQ,OAAO,EAAE,CAAC,IACtBA,KAAI,sBAAsB,OAAO,EAAE,CAAC,IACpCA,KAAI,MAAM,OAAO,CAAC,CAAC,IACnBA,KAAI,WAAW,OAAO,EAAE,CAAC,IACzBA,KAAI,SAAS;AAAA,MACf;AACA,cAAQ,IAAIA,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAE/B,iBAAW,KAAK,WAAW;AACzB,cAAM,QAAQ,gBAAgB,EAAE,aAAa,KAAK;AAClD,cAAM,UAAU,EAAE,oBAAoB,KAClC,IAAI,KAAK,OAAO,EAAE,iBAAiB,IAAI,GAAI,EAAE,mBAAmB,IAChE;AACJ,cAAM,QAAQ,GAAG,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;AACjE,cAAM,MAAM,GAAG,OAAO,EAAE,iBAAiB,IAAI,GAAG;AAChD,cAAM,MAAM,oBAAe,EAAE,gBAAgB;AAC7C,cAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,YAAY,CAAC;AAEzE,gBAAQ;AAAA,UACN,KAAK,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GACxB,MAAM,OAAO,EAAE,CAAC,GAChB,MAAM,OAAO,EAAE,CAAC,GAChB,MAAM,OAAO,EAAE,CAAC,GAChB,IAAI,OAAO,CAAC,CAAC,GACb,IAAI,OAAO,EAAE,CAAC,GACd,OAAO;AAAA,QACZ;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,SAAS,QAAQ,aAAa,EAC9B,OAAO,OAAO,UAAU;AACvB,UAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,QAAI;AACF,YAAM,KAAK,eAAe,OAAO,aAAa;AAC9C,YAAM,IAAI,MAAM,YAAY,EAAE;AAC9B,YAAM,QAAQ,MAAM,iBAAiB,EAAE;AACvC,YAAM,SAAS,MAAM,kBAAkB;AAEvC,cAAQ,KAAK;AAEb,YAAM,aAAa,gBAAgB,KAAK,KAAK;AAC7C,YAAM,aAAa,EAAE,WAAW,EAAE;AAClC,YAAM,eAAe,aAAa,KAAK,GAAG,OAAO,OAAO,gBAAgB,IAAI,GAAG,MAAM;AAErF,cAAQ,IAAI;AACZ,cAAQ,IAAIN,OAAM,sBAAiB,EAAE,EAAE,EAAE,CAAC;AAC1C,MAAAC,KAAI;AAGJ,UAAI,EAAE,eAAe,EAAE,YAAY,WAAW,SAAS,GAAG;AACxD,YAAI;AACF,gBAAM,OAAO,MAAM,cAAc,EAAE,WAAW;AAC9C,kBAAQ,IAAIJ,GAAE,uBAAuBE,MAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AACvD,kBAAQ,IAAIF,GAAE,uBAAuBC,KAAI,KAAK,WAAW,CAAC,EAAE,CAAC;AAAA,QAC/D,QAAQ;AACN,kBAAQ,IAAID,GAAE,uBAAuBC,KAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,QAC5D;AAAA,MACF,WAAW,EAAE,aAAa;AACxB,gBAAQ,IAAID,GAAE,uBAAuBC,KAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,MAC5D;AAEA,cAAQ,IAAID,GAAE,uBAAuBE,MAAK,UAAU,CAAC,EAAE,CAAC;AACxD,cAAQ,IAAIF,GAAE,uBAAuBF,GAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AACrD,cAAQ,IAAIE,GAAE,uBAAuBF,GAAE,EAAE,KAAK,CAAC,EAAE,CAAC;AAClD,cAAQ,IAAIE,GAAE,uBAAuB,OAAO,EAAE,iBAAiB,IAAI,GAAG,GAAG,CAAC;AAC1E,cAAQ,IAAIA,GAAE,uBAAuB,oBAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAE1E,cAAQ,IAAI;AACZ,cAAQ,IAAIG,OAAM,cAAc,CAAC;AACjC,cAAQ,IAAIH,GAAE,uBAAuB,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC5E,cAAQ,IAAIA,GAAE,uBAAuB,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAClE,cAAQ,IAAIA,GAAE,uBAAuB,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAIA,GAAE,uBAAuB,gBAAgB,EAAE,UAAU,CAAC,EAAE,CAAC;AAErE,cAAQ,IAAI;AACZ,cAAQ,IAAIG,OAAM,SAAS,CAAC;AAC5B,cAAQ,IAAIH,GAAE,uBAAuB,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;AAChE,cAAQ,IAAIA,GAAE,uBAAuB,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAIA,GAAE,uBAAuB,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAIA,GAAE,uBAAuB,YAAY,EAAE,CAAC;AAEpD,UAAI,UAAU,eAAe,YAAY,UAAU,eAAe,SAAS;AACzE,YAAI;AACF,gBAAM,MAAM,MAAM,mBAAmB,EAAE;AACvC,kBAAQ,IAAI;AACZ,kBAAQ,IAAIG,OAAM,WAAW,CAAC;AAE9B,kBAAQ,IAAIH,GAAE,uBAAuB,WAAW,GAAG,CAAC,EAAE,CAAC;AAAA,QACzD,QAAQ;AAAA,QAAoB;AAAA,MAC9B;AAEA,YAAM,YAAY,MAAM,gBAAgB,EAAE;AAC1C,YAAM,aAAa,MAAM,mBAAmB,EAAE;AAE9C,cAAQ,IAAI;AACZ,cAAQ,IAAIG,OAAM,oBAAoB,UAAU,MAAM,GAAG,CAAC;AAC1D,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAQ,IAAIF,KAAI,MAAM,CAAC,YAAY,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;AACzD,gBAAQ,IAAIA,KAAI,eAAe,UAAU,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,cAAc,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,MAClG;AACA,cAAQ,IAAIE,OAAM,uBAAuB,WAAW,MAAM,GAAG,CAAC;AAC9D,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,gBAAQ,IAAIF,KAAI,MAAM,CAAC,YAAY,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;AAC1D,gBAAQ,IAAIA,KAAI,eAAe,WAAW,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,cAAc,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,MACpG;AAEA,MAAAG,KAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB;AACtC,cAAQ,MAAML,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,eAAe,qBAAqB,aAAa,EACjD,eAAe,mCAAmC,0CAA0C,EAC5F,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AACxD,YAAM,aAAa,OAAO,KAAK,OAAO,EAAE,YAAY;AACpD,YAAM,UAAU,eAAe,SAAS,eAAe,QACnD,UAAU,MACV,eAAe,QAAQ,eAAe,YACpC,UAAU,UACV,eAAe,YACb,UAAU,UACV;AACR,UAAI,YAAY,MAAM;AACpB,gBAAQ,MAAMA,OAAM,IAAI,0BAA0B,KAAK,OAAO,6BAA6B,CAAC;AAC5F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,UAAU,WAAW;AAE3B,YAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,SAAS;AACpC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,eAAe;AAC9E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,eAAe,MAAM,SAAS,YAAY,QAAQ,OAAO;AAC/D,UAAI,cAAc;AAChB,gBAAQ,KAAK,yCAAyC;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,cAAc,YAAY,QAAQ,OAAO;AAC9D,cAAQ,KAAK;AAEb,cAAQ,IAAI;AACZ,cAAQ,IAAIN,OAAM,oBAAe,CAAC;AAClC,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,iBAAiB,UAAU,EAAE,CAAC;AAC5C,cAAQ,IAAIA,GAAE,gBAAgBF,GAAE,EAAE,KAAK,CAAC,EAAE,CAAC;AAC3C,cAAQ,IAAIE;AAAA,QACV,gBACE,YAAY,UAAU,MAAMF,GAAE,KAAK,IAC/B,YAAY,UAAU,UAAUC,OAAM,IAAI,SAAS,IACjDE,KAAI,SAAS,CACrB;AAAA,MACF,CAAC;AACD,cAAQ,IAAID,GAAE,gBAAgB,aAAa,MAAM,CAAC,SAAS,CAAC;AAC5D,MAAAI,KAAI;AAEJ,YAAM,cAAcK,KAAI,EAAE,MAAMT,GAAE,oBAAoB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,OAAO,MAAM,KAAK,YAAY,OAAO;AAC3C,kBAAY,QAAQF,GAAE,WAAW,CAAC;AAClC,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAMF,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,SAAS,EACjB,YAAY,8BAA8B,EAC1C,eAAe,qBAAqB,aAAa,EACjD,OAAO,aAAa,kDAAkD,EACtE,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AAExD,YAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,UAAU;AACrC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,gBAAgB;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,UAAI,KAAK,QAAQ;AACf,cAAM,IAAI,MAAM,YAAY,UAAU;AACtC,cAAM,YAAY,MAAM,gBAAgB,UAAU;AAClD,cAAM,gBAA6B;AAAA,UACjC,OAAO,EAAE;AAAA,UACT,mBAAmB,EAAE;AAAA,UACrB,kBAAkB,EAAE;AAAA,QACtB;AACA,gBAAQ,OAAOT,GAAE,yBAAyB;AAC1C,cAAM,SAAS,MAAM,mBAAmB,EAAE,OAAO,WAAW,WAAW,aAAa;AACpF,gBAAQ,KAAK;AACb,8BAAsB,QAAQ,SAAS;AACvC,cAAM,cAAc,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,UAAU;AACnE,gBAAQ,KAAK,OAAO,WAAW,CAAC,cAAc,IAAI,CAAC;AAAA,MACrD;AAEA,cAAQ,OAAOA,GAAE,uBAAuB;AACxC,YAAM,OAAO,MAAM,gBAAgB,UAAU;AAC7C,cAAQ,QAAQF,GAAE,mBAAmB,CAAC;AAEtC,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAE5C,UAAI;AACF,cAAM,MAAM,MAAM,mBAAmB,UAAU;AAE/C,gBAAQ,IAAIA,KAAI,uBAAuB,WAAW,GAAG,CAAC,EAAE,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAAwB;AAEhC,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAMF,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,2DAA2D,EACvE,eAAe,qBAAqB,aAAa,EACjD,OAAO,kBAAkB,mEAAmE,EAC5F,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AACxD,YAAM,UAAU,WAAW;AAE3B,YAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,UAAU;AACrC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,gBAAgB;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,aAAa,QAAQ,QAAQ,YAAY,MAAM,EAAE,SAAS,YAAY;AAC5E,YAAM,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;AAChD,YAAM,kBAAkB,EAAE,aAAa,MAAM,OAAO,EAAE,aAAa,EAAE;AAErE,UAAI;AAEJ,UAAI,cAAc,CAAC,iBAAiB;AAElC,gBAAQ,OAAOT,GAAE,wBAAwB;AACzC,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQF,GAAE,qBAAqB,CAAC;AAAA,MAC1C,WAAW,mBAAmB,CAAC,KAAK,OAAO;AAEzC,gBAAQ,OAAOE,GAAE,8BAA8B;AAC/C,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQF,GAAE,0BAA0B,CAAC;AAAA,MAC/C,WAAW,mBAAmB,KAAK,OAAO;AAExC,gBAAQ,OAAOE,GAAE,uBAAuB;AACxC,cAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,eAAO,MAAM,gBAAgB,YAAY,KAAK;AAC9C,gBAAQ,QAAQF,GAAE,mBAAmB,CAAC;AAAA,MACxC,OAAO;AACL,gBAAQ,KAAK,mEAAmE;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAMF,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAiBH,WACG,QAAQ,WAAW,EAAE,QAAQ,KAAK,CAAC,EACnC;AAAA,IACC;AAAA,EACF,EACC,eAAe,qBAAqB,wBAAwB,EAC5D,OAAO,SAAS,mCAAmC,EACnD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AACxD,YAAM,UAAU,WAAW;AAE3B,YAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAG/C,UAAI,UAAU,eAAe,UAAU;AACrC,gBAAQ;AAAA,UACN,YAAY,UAAU,OAAO,gBAAgB,KAAK,KAAK,SAAS;AAAA,QAClE;AACA,gBAAQ;AAAA,UACNR;AAAA,YACE;AAAA,UAMF;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;AAChD,YAAM,YAAY,EAAE,aAAa,EAAE;AACnC,UAAI,EAAE,eAAe,MAAM,MAAM,WAAW;AAC1C,gBAAQ,KAAK,wCAAwC;AACrD,cAAM,YAAY,YAAY;AAC9B,gBAAQ;AAAA,UACNA;AAAA,YACE;AAAA,uBAA0B,IAAI,KAAK,OAAO,SAAS,IAAI,GAAI,EAAE,eAAe,CAAC,SAAS,oBAAe,SAAS,CAAC;AAAA;AAAA,UACjH;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,QAAQ,EAAE;AAChB,YAAM,SAAS,MAAM,kBAAkB,KAAK;AAC5C,UAAI,WAAW,YAAY;AACzB,gBAAQ;AAAA,UACN,SAAS,KAAK,uBAAuB,MAAM,SAAS,UAAU;AAAA,QAChE;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,aAAa,MAAM,cAAc,KAAK;AAC5C,UAAI,QAAQ,QAAQ,YAAY,MAAM,WAAW,YAAY,GAAG;AAC9D,gBAAQ,KAAK,8CAA8C;AAC3D,gBAAQ;AAAA,UACNA,KAAI;AAAA,iBAAoB,UAAU;AAAA,iBAAoB,QAAQ,OAAO;AAAA,CAAI;AAAA,QAC3E;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAKA,YAAM,QAAQ,MAAM,gBAAgB;AACpC,YAAM,eAAeS,qBAAmB;AAAA,QACtC,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,KAAK;AAAA,MACd,CAAC;AACD,YAAM,gBAA6B;AAAA,QACjC,EAAE,QAAQ,OAAO,MAAM,cAAc,OAAO,GAAG;AAAA,MACjD;AAEA,cAAQ,KAAK;AAGb,cAAQ,IAAI;AACZ,cAAQ,IAAIR,MAAK,cAAc,CAAC;AAChC,MAAAE,KAAI;AACJ,cAAQ,IAAI,mBAAmB,UAAU,EAAE;AAC3C,cAAQ,IAAI,mBAAmB,KAAK,EAAE;AACtC,cAAQ,IAAI,mBAAmB,KAAK,EAAE;AACtC,cAAQ,IAAI,mBAAmB,gBAAgB,KAAK,CAAC,qBAAqB;AAC1E,cAAQ,IAAI,mBAAmB,QAAQ,OAAO,uBAAkB;AAChE,cAAQ,IAAI;AACZ,cAAQ,IAAID,OAAM,yCAAyC,CAAC;AAC5D,cAAQ,IAAIF,KAAI,eAAe,KAAK,EAAE,CAAC;AACvC,cAAQ,IAAIA,KAAI,eAAe,YAAY,kBAAkB,KAAK,GAAG,CAAC;AACtE,cAAQ,IAAIA,KAAI,eAAe,CAAC;AAChC,cAAQ,IAAI;AACZ,cAAQ;AAAA,QACNA;AAAA,UACE;AAAA,QAIF;AAAA,MACF;AACA,cAAQ,IAAI;AAEZ,UAAI,KAAK,QAAQ;AACf,gBAAQ,IAAIH,GAAE,yDAAoD,CAAC;AACnE;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,KAAK;AACb,gBAAQ,OAAO,MAAMC,OAAM,OAAO,mBAAmB,CAAC;AACtD,cAAM,SAAS,MAAM,IAAI,QAAgB,CAACY,aAAY;AACpD,kBAAQ,MAAM,OAAO;AACrB,kBAAQ,MAAM,YAAY,OAAO;AACjC,kBAAQ,MAAM,KAAK,QAAQ,CAAC,MAAMA,SAAQ,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,QAC3E,CAAC;AACD,gBAAQ,MAAM,MAAM;AACpB,YAAI,WAAW,OAAO,WAAW,OAAO;AACtC,kBAAQ,IAAIV,KAAI,gBAAgB,CAAC;AACjC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,OAAOQ,KAAI,iCAAiC,EAAE,MAAM;AAC1D,YAAM,OAAO,MAAM,gBAAgB,YAAY,aAAa;AAC5D,WAAK,QAAQX,GAAE,uCAAkC,CAAC;AAClD,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAG5C,YAAM,cAAc,MAAM,kBAAkB,KAAK;AACjD,UAAI,gBAAgB,IAAI;AACtB,gBAAQ,IAAIH,GAAE,oCAA+B,CAAC;AAAA,MAChD,OAAO;AACL,gBAAQ;AAAA,UACNC,OAAM;AAAA,YACJ,mDAA8C,WAAW;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAMA,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,eAAe,qBAAqB,aAAa,EACjD,OAAO,eAAe,4DAA4D,EAClF,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AAExD,YAAM,UAAUU,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,WAAW,UAAU,eAAe,WAAW;AAC1E,gBAAQ,KAAK,uBAAuB,gBAAgB,KAAK,CAAC,EAAE;AAC5D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI;AAEJ,UAAI,KAAK,WAAW;AAClB,gBAAQ,OAAOT,GAAE,yBAAyB;AAC1C,eAAO,MAAM,gBAAgB,UAAU;AACvC,gBAAQ,QAAQF,GAAE,qBAAqB,CAAC;AAAA,MAC1C,OAAO;AACL,YAAI,UAAU,eAAe,SAAS,UAAU,eAAe,SAAS;AACtE,kBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,kDAA6C;AAC5G,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,gBAAQ,OAAOE,GAAE,wBAAwB;AACzC,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQF,GAAE,oBAAoB,CAAC;AAAA,MACzC;AAEA,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAMF,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,UAAU,EAClB,YAAY,6DAA6D,EACzE,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,0BAA0B,iCAAiC,EAClE,OAAO,yBAAyB,oCAAoC,EACpE,OAAO,wBAAwB,qCAAqC,EACpE,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,UAAI;AACJ,UAAI;AACJ,UAAI,kBAA+B,CAAC;AACpC,UAAI,cAA2B,CAAC;AAChC,UAAI;AAEJ,UAAI,KAAK,IAAI;AAEX,qBAAa,eAAe,KAAK,IAAI,aAAa;AAClD,cAAMS,WAAUC,KAAI,qBAAqB,EAAE,MAAM;AAEjD,cAAM,IAAI,MAAM,YAAY,UAAU;AACtC,gBAAQ,EAAE;AACV,uBAAe,MAAM,gBAAgB,UAAU;AAC/C,0BAAkB,MAAM,mBAAmB,UAAU;AAErD,sBAAc;AAAA,UACZ;AAAA,UACA,mBAAmB,EAAE;AAAA,UACrB,kBAAkB,EAAE;AAAA,QACtB;AAEA,YAAI;AACF,gBAAM,YAAY,MAAM,kBAAkB;AAC1C,sBAAY,iBAAiB;AAAA,QAC/B,QAAQ;AAAA,QAAkB;AAE1B,QAAAD,SAAQ,KAAK;AACb,gBAAQ,IAAIP,KAAI;AAAA,yBAA4B,UAAU,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC;AAAA,MAC7F,WAAW,KAAK,cAAc;AAE5B,YAAI,CAAC,KAAK,SAAS,CAACM,WAAU,KAAK,KAAK,GAAG;AACzC,kBAAQ,MAAMR,OAAM,IAAI,2DAAsD,CAAC;AAC/E,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,gBAAQ,KAAK;AACb,uBAAe,eAAe,KAAK,YAAY;AAC/C,YAAI,KAAK,aAAa;AACpB,4BAAkB,eAAe,KAAK,WAAW;AAAA,QACnD;AACA,sBAAc,EAAE,MAAM;AAAA,MACxB,OAAO;AACL,gBAAQ,MAAMA,OAAM,IAAI,gEAA2D,CAAC;AACpF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,UAAUU,KAAI,EAAE,MAAMT,GAAE,6BAA6B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACtF,YAAM,aAAa,MAAM,mBAAmB,OAAO,cAAc,WAAW,WAAW;AACvF,cAAQ,KAAK;AACb,4BAAsB,YAAY,SAAS;AAG3C,UAAI;AACJ,UAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAM,gBAAgBS,KAAI,EAAE,MAAMT,GAAE,gCAAgC,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAC/F,uBAAe,MAAM,mBAAmB,OAAO,iBAAiB,cAAc,WAAW;AACzF,sBAAc,KAAK;AACnB,8BAAsB,cAAc,YAAY;AAAA,MAClD;AAGA,UAAI,KAAK,UAAU,eAAe,QAAW;AAC3C,cAAM,gBAAgBS,KAAI,EAAE,MAAMT,GAAE,uBAAuB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACtF,cAAM,oBAAoB,KAAK,QAAQ,YAAY,OAAO,YAAY,YAAY;AAClF,sBAAc,QAAQF,GAAE,0BAA0B,CAAC;AAAA,MACrD;AAGA,YAAM,cAAc,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,UAAU,MACjE,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,UAAU,KAAK;AAEjE,UAAI,CAAC,WAAW,WAAY,gBAAgB,CAAC,aAAa,WAAY,aAAa;AACjF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAMC,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AG11BA,OAAOa,YAAW;AAClB,OAAOC,UAAS;AAiBhB,IAAMC,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAE1C,SAAS,yBAAyBI,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,0CAA0C;AAInG,WACG,QAAQ,MAAM,EACd,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,UAAM,UAAUC,KAAI,0BAA0B,EAAE,MAAM;AACtD,QAAI;AACF,YAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACzC,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,MACtB,CAAC;AAED,cAAQ,KAAK;AAEb,cAAQ,IAAI;AACZ,cAAQ,IAAIH,OAAM,8BAAyB,CAAC;AAC5C,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,2BAA2BF,GAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;AACnE,cAAQ,IAAIE,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC;AACrF,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC;AACxF,cAAQ,IAAIF,GAAE,6BAA6BE,MAAK,GAAG,OAAO,OAAO,gBAAgB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;AAC/F,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,GAAG,OAAO,OAAO,oBAAoB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;AACjG,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,IAAI,mBAAe,OAAO,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;AAClG,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC;AAEvF,cAAQ,IAAI;AACZ,cAAQ,IAAIC,OAAM,wBAAwB,OAAO,MAAM,GAAG,CAAC;AAC3D,UAAI,OAAO,WAAW,GAAG;AACvB,gBAAQ,IAAIF,KAAI,UAAU,CAAC;AAAA,MAC7B,OAAO;AACL,mBAAW,KAAK,QAAQ;AACtB,kBAAQ,IAAID,GAAE,OAAOF,GAAE,CAAC,CAAC,EAAE,CAAC;AAAA,QAC9B;AAAA,MACF;AAEA,MAAAM,KAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,8BAA8B;AAC3C,cAAQ,MAAML,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,mBAAmB,EAC3B,YAAY,oCAAoC,EAChD,eAAe,iBAAiB,8BAA8B,EAC9D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,0BAA0B,EAAE,MAAM;AACtD,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC1E,cAAQ,QAAQR,GAAE,gCAAgC,KAAK,OAAO,kFAAkF,CAAC;AACjJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,6BAA6B;AAC1C,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,sBAAsB,EAC9B,YAAY,uCAAuC,EACnD,eAAe,iBAAiB,iCAAiC,EACjE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,6BAA6B,EAAE,MAAM;AACzD,QAAI;AACF,YAAM,OAAO,MAAM,mBAAmB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC7E,cAAQ,QAAQR,GAAE,mCAAmC,KAAK,OAAO,kFAAkF,CAAC;AACpJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,gCAAgC;AAC7C,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,oBAAoB,EAC5B,YAAY,4CAA4C,EACxD,eAAe,aAAa,6CAA6C,EACzE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,2BAA2B,EAAE,MAAM;AACvD,QAAI;AACF,YAAM,OAAO,MAAM,oBAAoB,eAAe,KAAK,KAAK,KAAK,CAAC;AACtE,cAAQ,QAAQR,GAAE,iCAAiC,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AAC5J,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,8BAA8B;AAC3C,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,aAAa,EACrB,YAAY,iDAAiD,EAC7D,eAAe,aAAa,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,oBAAoB,EAAE,MAAM;AAChD,QAAI;AACF,YAAM,OAAO,MAAM,wBAAwB,eAAe,KAAK,KAAK,KAAK,CAAC;AAC1E,cAAQ,QAAQR,GAAE,sCAAsC,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AACjK,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,kBAAkB,EAC1B,YAAY,uDAAuD,EACnE,eAAe,iBAAiB,6BAA6B,EAC7D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,uBAAuB,eAAe,KAAK,SAAS,SAAS,CAAC;AACjF,cAAQ,QAAQR,GAAE,wCAAwC,KAAK,OAAO,kFAAkF,CAAC;AACzJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,cAAc,EACtB,YAAY,iDAAiD,EAC7D,eAAe,iBAAiB,yBAAyB,EACzD,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,qBAAqB,EAAE,MAAM;AACjD,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC5E,cAAQ,QAAQR,GAAE,kCAAkC,KAAK,OAAO,kFAAkF,CAAC;AACnJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,wBAAwB;AACrC,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,kBAAkB,EAC1B,YAAY,0CAA0C,EACtD,eAAe,aAAa,yDAAyD,EACrF,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,eAAe,KAAK,KAAK,KAAK,CAAC;AACpE,cAAQ,QAAQR,GAAE,+BAA+B,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AAC1J,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC1MA,OAAOQ,YAAW;AAClB,OAAOC,UAAS;AAEhB,SAAS,eAAAC,cAAa,aAAAC,YAAW,cAAAC,mBAAkB;AAMnD,IAAMC,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAM,OAAOA,OAAM;AACnB,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAGjD,IAAM,wBAAwB;AAAA;AAAA,EAE5B,EAAE,MAAM,YAAY,MAAM,mBAAmB,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC5I,EAAE,MAAM,YAAY,MAAM,0BAA0B,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC3G,EAAE,MAAM,YAAY,MAAM,yBAAyB,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC1G,EAAE,MAAM,YAAY,MAAM,wBAAwB,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA;AAAA,EAEzG,EAAE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC1I,EAAE,MAAM,YAAY,MAAM,4BAA4B,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAChI,EAAE,MAAM,YAAY,MAAM,2BAA2B,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC/H,EAAE,MAAM,YAAY,MAAM,0BAA0B,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA;AAAA,EAE9H,EAAE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA;AAAA,EAErH,EAAE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO;AAAA,EAClI,EAAE,MAAM,YAAY,MAAM,oBAAoB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,iBAAiB,OAAO;AAAA,EAClI,EAAE,MAAM,YAAY,MAAM,gBAAgB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO;AAAA,EACjI,EAAE,MAAM,YAAY,MAAM,gBAAgB,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO;AAAA,EACtJ,EAAE,MAAM,YAAY,MAAM,oBAAoB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO;AAAA;AAAA,EAErI,EAAE,MAAM,YAAY,MAAM,uBAAuB,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAAA,EAC3H,EAAE,MAAM,YAAY,MAAM,gCAAgC,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,iBAAiB,aAAa;AAC3J;AAEA,IAAMI,aAAY;AAAA,EAChB,EAAE,MAAM,YAAY,MAAM,WAAW,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,iBAAiB,aAAa;AAAA,EACpJ,EAAE,MAAM,YAAY,MAAM,aAAa,QAAQ,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO;AAAA,EAC9H,EAAE,MAAM,YAAY,MAAM,YAAY,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,QAAQ,CAAC,GAAG,iBAAiB,OAAO;AAC1G;AAEA,SAAS,eAAe,MAAc,MAAwB;AAC5D,MAAI,SAAS,8CAA8C;AACzD,YAAQ,MAAMN,OAAM,IAAI,GAAG,IAAI,uBAAuB,WAAW,CAAC,iDAAiD,CAAC;AACpH,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,WAAoB;AAC3B,SAAO,eAAe,qBAAqB,SAAS,EAAE,iBAAiB;AACzE;AAEA,SAAS,OAAgB;AACvB,SAAO,eAAe,cAAc,SAAS,EAAE,UAAU;AAC3D;AAEA,eAAe,oBAAoB,QAA+B;AAChE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,KAAK,gBAAgB;AAC3B,QAAM,OAAO,OAAO,QAAS;AAC7B,QAAM,UAAW,MAAM,GAAG,aAAa;AAAA,IACrC,SAAS,KAAK;AAAA,IACd,KAAK,CAAC,EAAE,MAAM,YAAY,MAAM,aAAa,QAAQ,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO,CAAC;AAAA,IAC1J,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,SAAS,CAAC;AAAA,EACzB,CAAC;AACD,MAAI,WAAW,OAAQ;AACvB,QAAM,UAAUO,KAAI,mBAAmB,EAAE,MAAM;AAC/C,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,cAAc;AAAA,MACtC,SAAS,KAAK;AAAA,MAAG,KAAKD;AAAA,MAAW,cAAc;AAAA,MAAW,MAAM,CAAC,SAAS,GAAG,MAAM,OAAO,EAAE;AAAA,MAAG,OAAO;AAAA,MAAM,SAAS,OAAO;AAAA,IAC9H,CAAC;AACD,UAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,YAAQ,QAAQ,uBAAuB;AAAA,EACzC,SAAS,KAAK;AACZ,YAAQ,KAAK,sBAAsB;AACnC,UAAM;AAAA,EACR;AACF;AAEO,SAAS,yBAAyBE,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,kDAAkD;AAI3G,WACG,QAAQ,kBAAkB,EAC1B,YAAY,mFAAmF,EAC/F,OAAO,OAAO,eAAwB;AACrC,UAAM,KAAK,gBAAgB;AAC3B,QAAI;AACJ,QAAI,YAAY;AACd,UAAI,CAACC,WAAU,UAAU,GAAG;AAC1B,gBAAQ,MAAMT,OAAM,IAAI,iBAAiB,CAAC;AAC1C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,eAAS;AAAA,IACX,OAAO;AACL,YAAM,SAAS,gBAAgB;AAC/B,eAAS,OAAO,QAAS;AAAA,IAC3B;AAEA,UAAM,UAAUO,KAAI,YAAY,EAAE,MAAM;AACxC,QAAI;AACF,YAAM,CAAC,OAAO,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpD,GAAG,aAAa,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,QAClH,GAAG,aAAa,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,QACrH,GAAG,aAAa,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC;AAAA,MACnH,CAAC;AACD,YAAM,cAAe,MAAM,GAAG,aAAa;AAAA,QACzC,SAAS,SAAS;AAAA,QAAG,KAAK;AAAA,QAAuB,cAAc;AAAA,QAAoB,MAAM,CAAC,MAAM;AAAA,MAClG,CAAC;AACD,cAAQ,KAAK;AAEb,cAAQ,IAAI;AACZ,cAAQ,IAAIH,OAAM,0BAAqB,CAAC;AACxC,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,2BAA2BF,GAAE,MAAM,CAAC,EAAE,CAAC;AACrD,cAAQ,IAAIE,GAAE,2BAA2B,SAASF,GAAE,KAAK,IAAIG,KAAI,IAAI,CAAC,EAAE,CAAC;AACzE,cAAQ,IAAID,GAAE,2BAA2BE,MAAKO,aAAY,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AAC7E,cAAQ,IAAIT,GAAE,2BAA2BE,MAAKO,aAAY,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC;AACnF,cAAQ,IAAIT,GAAE,2BAA2BE,MAAK,GAAG,OAAO,UAAU,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;AAChF,MAAAE,KAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,gBAAgB;AAC7B,cAAQ,MAAML,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,gBAAgB,EACxB,YAAY,wEAAwE,EACpF,OAAO,mBAAmB,qDAAqD,GAAG,EAClF,OAAO,OAAO,WAAmB,SAA8B;AAC9D,UAAM,SAASW,YAAW,WAAW,EAAE;AACvC,UAAM,UAAU,OAAO,KAAK,OAAO;AACnC,UAAM,oBAAoB,MAAM;AAChC,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUJ,KAAI,WAAW,SAAS,UAAU,EAAE,MAAM;AAC1D,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc;AAAA,QACtC,SAAS,SAAS;AAAA,QAAG,KAAK;AAAA,QAAuB,cAAc;AAAA,QAAmB,MAAM,CAAC,QAAQ,OAAO;AAAA,QAAG,OAAO;AAAA,QAAM,SAAS,OAAO;AAAA,MAC1I,CAAC;AACD,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,eAAe,IAAI,EAAE;AAAA,IACvC,SAAS,KAAK;AACZ,cAAQ,KAAK,cAAc;AAC3B,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,kBAAkB,EAC1B,YAAY,4DAA4D,EACxE,OAAO,OAAO,WAAmB;AAChC,UAAM,KAAK,EAAE,SAAS,0BAA0B,QAAQ,yBAAyB,OAAO,uBAAuB,EAAE,MAAM;AACvH,QAAI,CAAC,IAAI;AACP,cAAQ,MAAMA,OAAM,IAAI,mBAAmB,MAAM,kCAAkC,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUO,KAAI,GAAG,MAAM,KAAK,EAAE,MAAM;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,IAAW,MAAM,CAAC,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AACrK,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,GAAG,MAAM,mBAAmB,IAAI,EAAE;AAAA,IACpD,SAAS,KAAK;AACZ,cAAQ,KAAK,GAAG,MAAM,SAAS;AAC/B,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,8BAA8B,EACtC,YAAY,oDAAoD,EAChE,OAAO,OAAO,UAAkB,cAAsB;AACrD,QAAI,CAACS,WAAU,QAAQ,GAAG;AACxB,cAAQ,MAAMT,OAAM,IAAI,0BAA0B,CAAC;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAASW,YAAW,WAAW,EAAE;AACvC,UAAM,oBAAoB,MAAM;AAChC,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUJ,KAAI,cAAc,SAAS,YAAY,QAAQ,KAAK,EAAE,MAAM;AAC5E,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,iBAAiB,MAAM,CAAC,UAAU,MAAM,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AAC3L,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,kBAAkB,IAAI,EAAE;AAAA,IAC1C,SAAS,KAAK;AACZ,cAAQ,KAAK,mBAAmB;AAChC,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,gCAAgC,EACxC,YAAY,yDAAyD,EACrE,OAAO,OAAO,UAAkB,WAAmB;AAClD,QAAI,CAACS,WAAU,QAAQ,GAAG;AACxB,cAAQ,MAAMT,OAAM,IAAI,0BAA0B,CAAC;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,KAAK,EAAE,SAAS,4BAA4B,QAAQ,2BAA2B,OAAO,yBAAyB,EAAE,MAAM;AAC7H,QAAI,CAAC,IAAI;AACP,cAAQ,MAAMA,OAAM,IAAI,mBAAmB,MAAM,kCAAkC,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUO,KAAI,GAAG,MAAM,KAAK,EAAE,MAAM;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,IAAW,MAAM,CAAC,QAAQ,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AAC7K,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,GAAG,MAAM,mBAAmB,IAAI,EAAE;AAAA,IACpD,SAAS,KAAK;AACZ,cAAQ,KAAK,GAAG,MAAM,SAAS;AAC/B,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,sBAAsB,EAC9B,YAAY,gGAAgG,EAC5G,OAAO,OAAO,WAAmB;AAChC,UAAM,MAAM,OAAO,MAAM;AACzB,QAAI,MAAM,OAAO;AACf,cAAQ,MAAMA,OAAM,IAAI,yCAAyC,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUO,KAAI,yBAAyB,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,MAAM;AAC5E,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,iBAAiB,MAAM,CAAC,GAAG,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AAC9K,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,uBAAuB,IAAI,EAAE;AAAA,IAC/C,SAAS,KAAK;AACZ,cAAQ,KAAK,sBAAsB;AACnC,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,6BAA6B,EACrC,YAAY,0FAA0F,EACtG,OAAO,OAAO,WAAmB;AAChC,UAAM,MAAM,OAAO,MAAM;AACzB,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUO,KAAI,aAAa,EAAE,MAAM;AACzC,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,uBAAuB,MAAM,CAAC,GAAG,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AACpL,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,gBAAgB,IAAI,EAAE;AAAA,IACxC,SAAS,KAAK;AACZ,cAAQ,KAAK,cAAc;AAC3B,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,yCAAyC,EACjD,YAAY,uFAAuF,EACnG,OAAO,OAAO,UAAkB,WAAmB;AAClD,QAAI,CAACS,WAAU,QAAQ,GAAG;AACxB,cAAQ,MAAMT,OAAM,IAAI,0BAA0B,CAAC;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,MAAM,OAAO,MAAM;AACzB,UAAM,SAAS,gBAAgB;AAC/B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,UAAUO,KAAI,6BAA6B,EAAE,MAAM;AACzD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,cAAc,EAAE,SAAS,SAAS,GAAG,KAAK,uBAAuB,cAAc,gCAAgC,MAAM,CAAC,UAAU,GAAG,GAAG,OAAO,MAAM,SAAS,OAAO,QAAS,CAAC;AACvM,YAAM,GAAG,0BAA0B,EAAE,KAAK,CAAC;AAC3C,cAAQ,QAAQ,gBAAgB,IAAI,EAAE;AAAA,IACxC,SAAS,KAAK;AACZ,cAAQ,KAAK,cAAc;AAC3B,cAAQ,MAAMP,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,YAAY,EACpB,YAAY,4EAA4E,EACxF,OAAO,YAAY;AAClB,UAAM,SAAS,gBAAgB;AAC/B,UAAM,OAAO,OAAO,QAAS;AAC7B,UAAM,MAAM,kCAAkC,IAAI;AAClD,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,6BAAwB,CAAC;AAC3C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,iEAAiE,CAAC;AAChF,YAAQ,IAAIA,GAAE,kEAAkE,CAAC;AACjF,YAAQ,IAAI;AACZ,YAAQ,IAAIF,GAAE,KAAK,GAAG,EAAE,CAAC;AACzB,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK,kEAAkE,CAAC;AACpF,YAAQ,IAAI,KAAK,uDAAuD,CAAC;AACzE,IAAAM,KAAI;AACJ,YAAQ,IAAI;AAAA,EACd,CAAC;AACL;;;ArBrVA,IAAI;AAAE,aAAW;AAAG,QAAQ;AAAC;AAE7B,IAAMO,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,iBAAiB;AAkC1D,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAe;AAC/B;AAEA,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAe;AAC/B;AAKA,IAAMC,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAEjD,SAAS,gBAAgB,OAAe,MAAuB;AAC7D,MAAI,CAACI,WAAU,KAAK,GAAG;AACrB,YAAQ,MAAMN,OAAM,IAAI,WAAW,IAAI,aAAa,KAAK,EAAE,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAGA,SAAS,aAAa,MAA0B;AAC9C,MAAI,KAAK,OAAO;AACd,IAAS,gBAAgB,gBAAgB,KAAK,OAAO,OAAO,CAAC;AAAA,EAC/D;AAEF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,6CAA6C,EACzD,QAAQ,WAAW,EACnB;AAAA,EACC,IAAI,OAAO,qBAAqB,gBAAgB,EAC7C,QAAQ,cAAc,EACtB,QAAQ,MAAM;AACnB,EACC,OAAO,aAAa,+CAA+C,KAAK,EACxE,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,OAAO,YAAY,gBAAgB;AACzC,MAAI,UAAkB,KAAK;AAC3B,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,iBAAiB;AAC7B,QAAI,YAAY,QAAQ;AACtB,cAAQ;AAAA,QACNA,OAAM,OAAO,oDAAoD;AAAA,MACnE;AAAA,IACF,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,OAAkB;AAC7B,MAAI,WAAW,MAAM,QAAQ;AAC3B,YAAQ,IAAIA,OAAM,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC;AAAA,EAC/C;AACF,CAAC;AAGH,IAAM,YAAY,QAAQ,QAAQ,WAAW;AAE7C,UACG,QAAQ,QAAQ,EAChB,YAAY,sDAAsD,EAClE,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,+BAA+B,6CAA6C,EACnF,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,wBAAwB,0CAA0C,EACzE,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,iBAAiB,mCAAmC,KAAK,EAChE,OAAO,aAAa,mDAAmD,KAAK,EAC5E,OAAO,OAAO,SAAS;AACtB,MAAI;AAEF,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,2BAAsB,CAAC;AACzC,IAAAC,KAAI;AAEJ,UAAM,SAAS,WAAW;AAC1B,YAAQ,IAAIH,KAAI,cAAc,OAAO,OAAO,EAAE,CAAC;AAC/C,YAAQ,IAAIA,KAAI,cAAc,SAAS,EAAE,IAAI,EAAE,CAAC;AAChD,IAAAG,KAAI;AAIJ,UAAM,eAAe,WAAW;AAEhC,UAAM,iBAAiB,KAAK;AAE5B,UAAM,OAAO,KAAK,SAAS,kBACtB,MAAM;AAAE,YAAM,IAAI,MAAM,iDAAiD;AAAA,IAAG,GAAG,IAChF,MAAM,MAAM;AAAA,MACV,SAASN,GAAE,gBAAgB;AAAA,MAC3B,UAAU,CAAC,MAAc,EAAE,SAAS,KAAK;AAAA,IAC3C,CAAC;AAEL,UAAM,YAAY,KAAK,cAAc,iBACjC,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE,IACjE,MAAM,MAAM;AAAA,MACV,SAASA,GAAE,eAAe;AAAA,MAC1B,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE;AAAA,MAC1E,UAAU,CAAC,MAAc,EAAE,UAAU,KAAK;AAAA,IAC5C,CAAC;AAEL,UAAM,cAAc,KAAK,gBAAgB,iBACrC,GAAG,IAAI,iCACP,MAAM,MAAM;AAAA,MACV,SAASA,GAAE,aAAa;AAAA,MACxB,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAEL,UAAM,aAAa,KAAK,YAAY,eAC/B,iBACG,OAAO,YAAY,IACnB,MAAM,MAAM,EAAE,SAASA,GAAE,qBAAqB,GAAG,SAAS,OAAO,YAAY,EAAE,CAAC,IACnF,iBACG,MACA,MAAM,MAAM,EAAE,SAASA,GAAE,qBAAqB,GAAG,UAAU,CAAC,MAAc,QAAQ,KAAK,CAAC,KAAK,mBAAmB,CAAC;AAGzH,UAAM,eAAe,KAAK,iBAAiB,SAAY,KAAK,eAAgB,iBACxE,OACA,MAAM,QAAQ;AAAA,MACZ,SAASA,GAAE,qCAAqC;AAAA,MAChD,SAAS;AAAA,IACX,CAAC;AAIL,UAAM,gBAAyC;AAAA,MAC7C,MAAM,OAAO,EAAE;AAAA,MACf,MAAM,OAAO,EAAE;AAAA,IACjB;AAEA,QAAI;AACJ,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,UAAI,cAAc,KAAK,GAAG;AACxB,gBAAQ,cAAc,KAAK;AAAA,MAC7B,WAAW,KAAK,MAAM,WAAW,IAAI,KAAK,KAAK,MAAM,WAAW,IAAI;AAClE,gBAAQ,KAAK;AAAA,MACf,OAAO;AACL,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI;AACtD,gBAAQ,MAAMC,OAAM,IAAI,oBAAoB,KAAK,KAAK,oBAAoB,SAAS,oBAAoB,CAAC;AACxG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,WAAW,gBAAgB;AAEzB,cAAQ,OAAO,EAAE,SAAS,+CACtB,cAAc,OACd,cAAc;AAAA,IACpB,OAAO;AAEL,YAAM,cAAc,MAAM,OAAO;AAAA,QAC/B,SAASD,GAAE,iDAAiD;AAAA,QAC5D,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,OAAO,QAAQ,aAAa,wBAAwB;AAAA,UACpE,EAAE,MAAM,QAAQ,OAAO,QAAQ,aAAa,8BAA8B;AAAA,QAC5E;AAAA,MACF,CAAC;AACD,cAAQ,cAAc,WAAW;AAAA,IACnC;AAEA,UAAM,eAAe,gBAAgB;AACrC,UAAM,CAAC,UAAU,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,MACtF,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,IACtF,CAAC;AACD,UAAM,SAAS,KAAK,WAAW;AAG/B,YAAQ,IAAI;AACZ,YAAQ,IAAIK,OAAM,iBAAY,CAAC;AAC/B,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,mBAAmBE,MAAK,IAAI,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAIF,GAAE,mBAAmBF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACvE,YAAQ,IAAIE,GAAE,mBAAmBC,KAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAID,GAAE,oBAAoB,UAAU,EAAE,CAAC;AAC/C,YAAQ,IAAIA,GAAE,mBAAmB,WAAW,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;AAC1E,YAAQ,IAAIA,GAAE,mBAAmB,MAAM,EAAE,CAAC;AAC1C,YAAQ,IAAIA,GAAE,oBAAoB,eAAeF,GAAE,KAAK,IAAIC,OAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;AAC1F,IAAAK,KAAI;AAEJ,QAAI,CAAC,gBAAgB;AACnB,YAAM,KAAK,MAAM,QAAQ,EAAE,SAASN,GAAE,mBAAmB,GAAG,SAAS,KAAK,CAAC;AAC3E,UAAI,CAAC,IAAI;AACP,gBAAQ,IAAIG,KAAI,cAAc,CAAC;AAC/B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,cAAc,KAAK,eAAe;AAEtC,QAAI,CAAC,aAAa;AAChB,YAAMK,WAAUC,KAAI,EAAE,MAAMP,GAAE,+BAA+B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACxF,UAAI;AACF,cAAM,WAA8B;AAAA,UAClC,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,SAAS,EAAE;AAAA,UAClB,YAAY,CAAC;AAAA,UACb,OAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,UACA,OAAO,CAAC;AAAA,QACV;AACA,sBAAc,MAAM,eAAe,QAAQ;AAC3C,QAAAM,SAAQ,QAAQR,GAAE,oBAAoBG,KAAI,WAAW,CAAC,EAAE,CAAC;AAAA,MAC3D,SAAS,KAAK;AACZ,QAAAK,SAAQ,KAAKP,OAAM,OAAO,iDAA4C,CAAC;AACvE,cAAM,OAAO,KAAK,UAAU,EAAE,MAAM,aAAa,WAAW,OAAO,aAAa,cAAc,WAAW,qBAAqB,CAAC;AAC/H,sBAAc,gCAAgC,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ,CAAC;AAAA,MACpF;AAAA,IACF;AAGA,UAAM,aAAa,MAAiB,gBAAgB,SAAS;AAC7D,QAAI,eAAe,MAAM;AACvB,YAAM,eAAe,MAAiB,aAAa,UAAU;AAC7D,YAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AAEvD,UAAI,aAAa,QAAQ,YAAY,MAAM,eAAe;AACxD,gBAAQ,MAAMA,OAAM,IAAI;AAAA,sBAAoB,SAAS;AAAA,CAA4C,CAAC;AAClG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,cAAQ,IAAIA,OAAM,OAAO;AAAA,sBAAoB,SAAS;AAAA,CAAwC,CAAC;AAE/F,YAAMO,WAAUC,KAAI,EAAE,MAAMP,GAAE,mBAAmB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAG5E,YAAMQ,WAAU,SAAS,EAAE;AAC3B,uBAAiBA,UAAS,SAAS,aAAa,KAAK;AACrD,mBAAaA,UAAS,EAAE,WAAW,OAAO,aAAa,OAAO,MAAM,UAAU,CAAC;AAC/E,0BAAoBA,UAAS,SAAS;AAGtC,MAAAF,SAAQ,OAAON,GAAE,gCAAgC;AACjD,UAAI;AACF,QAAS,gBAAgB,aAAa,KAAK;AAC3C,cAAM,iBAAiB,MAAe,QAAQ,WAAW,EAAE,OAAO;AAClE,YAAI,CAAC,gBAAgB;AACnB,UAAAM,SAAQ,OAAON,GAAE,iCAAiC;AAClD,gBAAe,cAAc,OAAO,UAAU,GAAG,WAAW,EAAE,OAAO;AAAA,QACvE;AAAA,MACF,QAAQ;AAAA,MAAkB;AAG1B,MAAAM,SAAQ,OAAON,GAAE,wBAAwB;AACzC,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAI;AACF,gBAAM,KAAK,SAAS,YAAY,SAAS;AAAA,QAE3C,QAAQ;AAEN,UAAAM,SAAQ,OAAON,GAAE,wBAAwB;AACzC,gBAAM,UAAU,MAAM,KAAK,qBAAqB,YAAY,WAAW,KAAK,UAAU;AACtF,gBAAM,cAAc,WAAW,eAAe,SAAS,aAAa,KAAgB;AACpF,uBAAa,WAAW,OAAO;AAAA,QACjC;AAAA,MACF,QAAQ;AACN,gBAAQ,KAAKD,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AAGA,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,aAAK,uBAAuB,WAAW,UAAU,GAAG,YAAY,CAAC;AAAA,MACnE,QAAQ;AAAA,MAAkB;AAE1B,MAAAO,SAAQ,KAAK;AACb,cAAQ,IAAI;AACZ,cAAQ,IAAIH,OAAM,kCAA6B,CAAC;AAChD,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,eAAeF,GAAE,IAAI,UAAU,EAAE,CAAC,EAAE,CAAC;AACnD,cAAQ,IAAIE,GAAE,eAAeF,GAAE,aAAa,KAAK,CAAC,EAAE,CAAC;AACrD,cAAQ,IAAIE,GAAE,eAAeF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACnE,cAAQ,IAAIE,GAAE,eAAeC,KAAI,iBAAiB,SAAS,EAAE,CAAC,EAAE,CAAC;AACjE,YAAMQ,YAAW,WAAW,IAAI,QAAQ,WAAW,CAAC,KAAK;AACzD,cAAQ,IAAIT,GAAE,eAAeF,GAAE,iCAAiC,SAAS,GAAGW,SAAQ,EAAE,CAAC,EAAE,CAAC;AAC1F,MAAAL,KAAI;AACJ,cAAQ,IAAIN,GAAE,sEAAiE,CAAC;AAChF,cAAQ,IAAI;AACZ;AAAA,IACF;AAGA,UAAM,UAAUS,KAAI,EAAE,MAAMP,GAAE,gCAAgC,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAEzF,UAAM,SAAS,MAAiB,gBAAgB;AAAA,MAC9C,gBAAgB,OAAO,UAAU;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,UAAU,SAAS,EAAE;AAC3B,qBAAiB,SAAS,SAAS,OAAO,KAAK;AAC/C,iBAAa,SAAS,EAAE,WAAW,OAAO,OAAO,OAAO,MAAM,UAAU,CAAC;AACzE,wBAAoB,SAAS,SAAS;AAItC,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAC5C,YAAQ,OAAOA,GAAE,iCAAiC;AAClD,QAAI;AACF,MAAS,gBAAgB,OAAO,KAAK;AACrC,YAAM,iBAAiB,WAAW,EAAE;AACpC,YAAe;AAAA,QACb,OAAO,UAAU;AAAA,QACjB;AAAA;AAAA,MACF;AAAA,IACF,SAAS,QAAQ;AAEf,cAAQ,KAAKD,OAAM,OAAO,mGAAyF,CAAC;AAAA,IACtH;AAEA,YAAQ,OAAOC,GAAE,oBAAoB;AAGrC,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,UAAU,MAAM,KAAK,qBAAqB,YAAY,WAAW,KAAK,UAAU;AACtF,mBAAa,WAAW,OAAO;AAC/B,UAAI;AACF,cAAM,cAAc,WAAW,eAAe,SAAS,OAAO,KAAgB;AAAA,MAChF,QAAQ;AAAA,MAAwC;AAAA,IAClD,QAAQ;AACN,cAAQ,KAAKD,OAAM,OAAO,6CAAwC,CAAC;AACnE,cAAQ,KAAKA,OAAM,IAAI,yCAAyC,SAAS,OAAO,CAAC;AAAA,IACnF;AAGA,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,KAAK,uBAAuB,WAAW,UAAU,GAAG,YAAY,CAAC;AACpF,UAAI,WAAW,cAAc,WAAW,YAAY;AAClD,gBAAQ,IAAID,GAAE,sEAAiE,CAAC;AAAA,MAClF,WAAW,CAAC,WAAW,YAAY;AACjC,gBAAQ,IAAIG,KAAI,sEAAsE,YAAY,gBAAgB,CAAC;AAAA,MACrH;AAAA,IACF,QAAQ;AAAA,IAAkB;AAE1B,YAAQ,KAAK;AAGb,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,4BAAuB,CAAC;AAC1C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,eAAeF,GAAE,IAAI,OAAO,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,YAAQ,IAAIE,GAAE,eAAeF,GAAE,OAAO,KAAK,CAAC,EAAE,CAAC;AAC/C,YAAQ,IAAIE,GAAE,eAAeF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACnE,YAAQ,IAAIE,GAAE,eAAeC,KAAI,YAAY,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAAQ,WAAW,CAAC,EAAE,CAAC;AAC7G,YAAQ,IAAID,GAAE,eAAeC,KAAI,eAAe,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;AAChE,YAAQ,IAAID,GAAE,eAAeC,KAAI,iBAAiB,SAAS,EAAE,CAAC,EAAE,CAAC;AACjE,UAAM,WAAW,WAAW,IAAI,QAAQ,WAAW,CAAC,KAAK;AACzD,YAAQ,IAAID,GAAE,eAAeF,GAAE,iCAAiC,SAAS,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;AAC1F,IAAAM,KAAI;AACJ,YAAQ,IAAIN,GAAE,sEAAiE,CAAC;AAChF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMC,OAAM,IAAI;AAAA,WAAS,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,mEAAmE,EAC/E,OAAO,uBAAuB,2BAA2B,EACzD,OAAO,gBAAgB,yEAAyE,EAChG,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AAcF,QAAI,aAAoB,CAAC;AAEzB,QAAI,KAAK,WAAW;AAElB,YAAM,kBAAkB,QAAQ,IAAI,mBAAmB;AACvD,YAAM,UAAU,eAAe,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC,gBAAgB,qBAAqB,kBAAkB,EAAE,SAAS,CAAC,CAAC;AACtI,iBAAW,OAAO,SAAS;AACzB,gBAAQ,OAAO,gBAAgB,GAAG;AAClC,YAAI;AACF,gBAAM,OAAO,MAAM,YAAY,KAAK,MAAiB,oBAAoB,CAAC;AAC1E,qBAAW,KAAK,MAAM;AACpB,uBAAW,KAAK;AAAA,cACd,IAAI,EAAE,GAAG,SAAS;AAAA,cAClB,OAAO,EAAE;AAAA,cACT,SAAS,EAAE;AAAA,cACX,aAAa,EAAE;AAAA,cACf,WAAW,EAAE,UAAU,SAAS;AAAA,cAChC,WAAW,EAAE;AAAA,cACb,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI,KAAK,SAAS;AAChB,cAAM,IAAI,OAAO,KAAK,OAAO,EAAE,YAAY;AAC3C,qBAAa,WAAW,OAAO,CAAC,MAAM,EAAE,QAAQ,YAAY,MAAM,CAAC;AAAA,MACrE;AAAA,IACF,WAAW,QAAQ,IAAI,cAAc;AACnC,YAAM,SAAS,MAAkBG,qBAAoB,KAAK,OAAO;AACjE,mBAAa;AAAA,IACf,OAAO;AACL,YAAM,SAAS,MAAiB,oBAAoB;AACpD,mBAAa,OAAO,IAAI,CAAC,OAAO;AAAA,QAC9B,IAAI,EAAE,GAAG,SAAS;AAAA,QAClB,OAAO,EAAE;AAAA,QACT,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,EAAE,UAAU,SAAS;AAAA,QAChC,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,IACJ;AAEA,YAAQ,KAAK;AAEb,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAIX,OAAM,IAAI,6BAA6B,CAAC;AACpD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,sBAAsB,WAAW,MAAM,GAAG,CAAC;AAClE,QAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,KAAK,WAAW;AAChD,cAAQ,IAAIA,OAAM,IAAI,iDAAiD,CAAC;AAAA,IAC1E;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,IAAIA,OAAM,IAAI,4FAA4F,CAAC;AAAA,IACrH;AACA,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,eAAW,KAAK,YAAY;AAC1B,YAAM,KAAK,OAAO,EAAE,cAAc,WAAW,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS;AACrF,YAAM,OAAO,IAAI,KAAK,KAAK,GAAI,EAAE,mBAAmB;AACpD,YAAM,UAAU,EAAE,YAAY,GAAG,EAAE,SAAS,uBAAuB;AACnE,YAAM,WAAW,EAAE,QAAQA,OAAM,IAAI,IAAI,EAAE,KAAK,KAAK,IAAI;AACzD,cAAQ,IAAI,KAAK,QAAQ,IAAI,EAAE,EAAE,KAAKA,OAAM,KAAK,WAAW,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;AAC9E,UAAI,QAAS,SAAQ,IAAI,gBAAgBA,OAAM,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;AACtE,cAAQ,IAAI,gBAAgB,EAAE,OAAO,EAAE;AACvC,cAAQ,IAAI,gBAAgB,IAAI,EAAE;AAClC,UAAI,EAAE,eAAe;AACnB,gBAAQ,IAAI,iBAAiB,EAAE,aAAa,OAAO;AAAA,MACrD;AACA,UAAI,EAAE,aAAa;AACjB,gBAAQ,IAAI,iBAAiBA,OAAM,IAAI,EAAE,WAAW,CAAC,EAAE;AAAA,MACzD;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,2BAA2B;AACxC,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,8CAA8C,EAC1D,SAAS,QAAQ,gCAAgC,EACjD,OAAO,OAAO,UAAU;AACvB,QAAM,UAAUQ,KAAI,2BAA2B,EAAE,MAAM;AACvD,MAAI;AACF,QAAI;AACJ,QAAI,iBAAiE;AACrE,QAAI,eAAgD;AAEpD,QAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,WAAK,OAAO,KAAK;AAAA,IACnB,OAAO;AAGL,UAAI;AACF,cAAM,WAAW,MAAM,iBAAiB,KAAK;AAC7C,aAAK,SAAS;AAAA,MAChB,QAAQ;AACN,gBAAQ,OAAO;AACf,cAAM,OAAO,MAAM,4BAA4B,KAAK;AACpD,YAAI,KAAK,WAAW,GAAG;AACrB,kBAAQ,KAAK,cAAc,KAAK,oCAAoC;AACpE,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,SAAS,WAAW;AAC1B,cAAM,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK,KAAK,CAAC;AAChE,aAAK,QAAQ,OAAO;AAIpB,uBAAe,MAAM;AAAA,UAAY,QAAQ;AAAA,UAAS,MACrC,aAAa,QAAQ,OAAO,EAAE;AAAA,QAC3C;AACA,yBAAiB;AAAA,UACf,SAAS,QAAQ;AAAA,UACjB,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,QAAQ,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,gBAAiB,MAAiB,aAAa,EAAE;AAC9D,YAAQ,KAAK;AACb,QAAI,gBAAgB;AAClB,YAAM,SAAS,eAAe,OAAO,SAAS,IAC1C,cAAc,eAAe,OAAO,KAAK,IAAI,CAAC,MAC9C;AACJ,cAAQ,IAAIR,OAAM,OAAO,qBAAqBA,OAAM,KAAK,eAAe,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;AAC5F,cAAQ,IAAIA,OAAM,IAAI,yBAAyB,eAAe,OAAO,mCAAmC,CAAC;AACzG,cAAQ,IAAI;AAAA,IACd;AAEA,QAAI,CAAC,KAAK,SAAS,KAAK,UAAU,8CAA8C;AAC9E,cAAQ,IAAIA,OAAM,IAAI,cAAc,EAAE,aAAa,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,IAAI,GAAI,EAAE,mBAAmB;AACxE,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,cAAc,KAAK,EAAE,EAAE,CAAC;AAC/C,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,QAAI,KAAK,WAAW;AAClB,cAAQ,IAAI,iBAAiBA,OAAM,KAAK,GAAG,KAAK,SAAS,oBAAoB,CAAC,EAAE;AAAA,IAClF;AACA,YAAQ,IAAI,iBAAiBA,OAAM,KAAK,KAAK,KAAK,CAAC,EAAE;AACrD,YAAQ,IAAI,iBAAiB,KAAK,OAAO,EAAE;AAC3C,YAAQ,IAAI,iBAAiB,IAAI,EAAE;AACnC,YAAQ,IAAI,iBAAiB,KAAK,SAASA,OAAM,MAAM,KAAK,IAAIA,OAAM,IAAI,IAAI,CAAC,EAAE;AACjF,QAAI,KAAK,aAAa;AACpB,cAAQ,IAAI,iBAAiBA,OAAM,IAAI,KAAK,WAAW,CAAC,EAAE;AAAA,IAC5D;AAGA,QAAI,KAAK,WAAW;AAClB,YAAM,cAAc,iBAAiB,KAAK,SAAS;AACnD,UAAI,aAAa;AACf,gBAAQ,IAAI,iBAAiBA,OAAM,KAAK,WAAW,CAAC,EAAE;AAAA,MACxD;AAAA,IACF;AAIA,IAAS,gBAAgB,KAAK,KAAK;AACnC,UAAM,YAAY,iBACd,MAAM,YAAY,eAAe,SAAS,MAAe,aAAa,CAAC,IACvE,MAAe,aAAa;AAChC,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,eAAe,CAAC;AACvC,YAAQ,IAAI,2BAA2B,UAAU,WAAW,EAAE;AAC9D,YAAQ,IAAI,2BAA2B,UAAU,UAAU,EAAE;AAC7D,YAAQ,IAAI,2BAA2B,UAAU,iBAAiB,EAAE;AACpE,YAAQ,IAAI,2BAA2B,OAAO,UAAU,gBAAgB,IAAI,GAAG,GAAG;AAClF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,+BAA+B;AAC5C,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,iBAAiB,EACzB,YAAY,0CAA0C,EACtD,eAAe,aAAa,cAAc,EAC1C,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,eAAe,yCAAyC,EAC/D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,EAAE,MAAMP,GAAE,sBAAsB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAC/E,MAAI;AACF,UAAM,cAAc,OAAO,KAAK,EAAE;AAClC,QAAI,cAAc,KAAK;AAEvB,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,MAAiB,aAAa,WAAW;AACtD,UAAI,CAAC,KAAK,SAAS,KAAK,UAAU,8CAA8C;AAC9E,gBAAQ,KAAK,cAAc,KAAK,EAAE,aAAa;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,YAAM,cAAc,KAAK,eAAe,GAAG,IAAI,mCAA8B,KAAK,SAAS;AAE3F,cAAQ,OAAOA,GAAE,+BAA+B;AAChD,YAAM,WAA8B;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,OAAO,SAAS,EAAE;AAAA,QAClB,YAAY,CAAC;AAAA,QACb,OAAO,CAAC;AAAA,QACR,OAAO,CAAC;AAAA,MACV;AACA,oBAAc,MAAM,eAAe,QAAQ;AAC3C,cAAQ,OAAOA,GAAE,+BAA+B;AAAA,IAClD;AAEA,UAAM,OAAO,MAAiB,eAAe,aAAa,WAAW;AACrE,YAAQ,QAAQF,GAAE,kBAAkB,CAAC;AACrC,YAAQ,IAAIG,KAAI,WAAW,WAAW,EAAE,CAAC;AACzC,YAAQ,IAAIA,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,mBAAmB,EAC3B,YAAY,4CAA4C,EACxD,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,yBAAyB,oBAAoB,EAC5D,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,wBAAwB,EAAE,MAAM;AACpD,MAAI;AACF,UAAM,YAAY,gBAAgB,KAAK,WAAW,WAAW;AAC7D,UAAM,OAAO,MAAe,iBAAiB,SAAS;AACtD,YAAQ,QAAQ,uBAAuB,IAAI,EAAE;AAC7C,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,iBAAiB;AAC9B,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,kBAAkB,EAC1B,YAAY,6DAA6D,EACzE,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,yBAAyB,mBAAmB,EAC3D,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,YAAY,gBAAgB,KAAK,WAAW,WAAW;AAC7D,UAAM,OAAO,MAAe,gBAAgB,SAAS;AACrD,YAAQ,QAAQ,sBAAsB,IAAI,EAAE;AAC5C,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,gBAAgB;AAC7B,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,uDAAuD,EACnE,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,mBAAmB,sEAAsE,EAChG,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AAEF,iBAAa,IAAI;AACjB,UAAM,eAAwB,gBAAgB;AAG9C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,sBAAsB,YAAY;AACvE,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,QAAQ,YAAY,MAAM,eAAe;AAC3C,cAAQ,KAAK,2CAA2C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,gBAAgB,KAAK,QAAQ,QAAQ;AAGzD,QAAI;AACJ,QAAI,KAAK,SAAS;AAChB,gBAAU,OAAO,KAAK,OAAO;AAAA,IAC/B,OAAO;AACL,YAAM,EAAE,gBAAAI,gBAAe,IAAI,MAAM,OAAO,yBAAoB;AAC5D,YAAMC,YAAWD,gBAAe,EAAE;AAGlC,UAAIC,cAAa,8CAA8C;AAC7D,kBAAU;AAAA,MACZ,OAAO;AACL,gBAAQ,OAAO;AACf,cAAM,SAAS,gBAAgB;AAE/B,cAAM,UAAU,MAAM,OAAO,aAAa;AAAA,UACxC,SAASA;AAAA,UACT,KAAK,CAAC;AAAA,YACJ,MAAM;AAAA,YACN,MAAM;AAAA,YACN,iBAAiB;AAAA,YACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,YAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,UACzC,CAAC;AAAA,UACD,cAAc;AAAA,UACd,MAAM,CAAC,WAAW;AAAA,QACpB,CAAC;AAED,YAAI,YAAY,IAAI;AAClB,kBAAQ,KAAK,oDAAoD;AACjE,kBAAQ,MAAMb,OAAM,IAAI,wDAAwD,CAAC;AACjF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,UAAU,MAAM,OAAO,aAAa;AAAA,UACxC,SAASa;AAAA,UACT,KAAK,CAAC;AAAA,YACJ,MAAM;AAAA,YACN,MAAM;AAAA,YACN,iBAAiB;AAAA,YACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,GAAG,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,YAC/E,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,UACzC,CAAC;AAAA,UACD,cAAc;AAAA,UACd,MAAM,CAAC,aAAa,EAAE;AAAA,QACxB,CAAC;AAED,kBAAU;AACV,gBAAQ,IAAIb,OAAM,IAAI,yBAAyB,OAAO,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AAEA,YAAQ,OAAO;AACf,UAAM,OAAO,MAAe,cAAc,SAAS,WAAW;AAC9D,YAAQ,QAAQ,qBAAqB,IAAI,EAAE;AAC3C,YAAQ,IAAIA,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAGlD,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,QAAQ,MAAM,KAAK,SAAS,YAAY,SAAS;AACvD,YAAM,KAAK,UAAU,OAAO,KAAK,MAAM;AACvC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,OAAO,GAAG,SAAS,KAAK,OAAO;AAAA,QAC1D,WAAW;AAAA,QACX,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MACzC,CAAC;AACD,cAAQ,IAAIA,OAAM,IAAI,oBAAoB,SAAS,EAAE,CAAC;AAAA,IACxD,QAAQ;AACN,cAAQ,KAAKA,OAAM,OAAO,4CAAuC,CAAC;AAClE,cAAQ,KAAKA,OAAM,IAAI,8CAA8C,SAAS,OAAO,CAAC;AAAA,IACxF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,OAAO,EACf,YAAY,sDAAsD,EAClE,OAAO,sBAAsB,wCAAwC,EACrE,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,YAAY,KAAK,aAAa,oBAAoB,SAAS,EAAE,EAAE,GAAG;AACxE,QAAI,CAAC,WAAW;AACd,cAAQ,MAAMA,OAAM,IAAI,0FAA0F,CAAC;AACnH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,gBAAgB,MAAM,iBAAiB,SAAS;AAEtD,UAAM,UAAU,WAAW;AAC3B,UAAM,WAAW,UAAU,QAAQ,OAAO,KAAK;AAC/C,UAAM,eAAe,iCAAiC,SAAS,GAAG,QAAQ;AAE1E,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,+BAA0B,CAAC;AAC7C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,iBAAiBF,GAAE,YAAY,CAAC,EAAE,CAAC;AACjD,YAAQ,IAAIE,GAAE,iBAAiBC,KAAI,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACvE,YAAQ,IAAID,GAAE,iBAAiBC,KAAI,cAAc,KAAK,CAAC,EAAE,CAAC;AAC1D,YAAQ,IAAID,GAAE,iBAAiBC,KAAI,uCAAuC,SAAS,EAAE,CAAC,EAAE,CAAC;AACzF,IAAAG,KAAI;AAGJ,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAoB;AAClD,YAAM,YAAY,MAAM,OAAO,IAAS,GAAG,SAAS;AACpD,YAAM,MAAM,aAAa,WAAW,WAAW;AAC/C,YAAM,OAAO,KAAK,GAAG;AACrB,WAAK,OAAO,MAAM,YAAY;AAC9B,WAAK,OAAO,IAAI;AAChB,cAAQ,IAAIN,GAAE,4CAAuC,CAAC;AAAA,IACxD,QAAQ;AAAA,IAER;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMC,OAAM,IAAI,YAAO,oBAAoB,GAAG,CAAC,EAAE,CAAC;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,UACG,QAAQ,MAAM,EACd,YAAY,0DAA0D,EACtE,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,mBAAmB,sCAAsC,EAChE,OAAO,oBAAoB,0BAA0B,mCAAmC,EACxF,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,wBAAwB,EAAE,MAAM;AACpD,MAAI;AACF,UAAM,YAAY,KAAK,aAAa,oBAAoB,SAAS,EAAE,EAAE,GAAG;AACxE,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,mFAAmF;AAChG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS;AACZ,cAAQ,KAAK,8DAA8D;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAIM;AACJ,QAAI;AACF,MAAAA,aAAY,MAAM,iBAAiB,SAAS;AAAA,IAC9C,QAAQ;AAEN,cAAQ,OAAO;AACf,YAAM,OAAO,MAAM,4BAA4B,SAAS;AACxD,cAAQ,KAAK,cAAc,SAAS,kBAAkB,WAAW,CAAC,EAAE;AACpE,UAAI,KAAK,WAAW,GAAG;AACrB,gBAAQ,MAAMd,OAAM,IAAI,qCAAqC,CAAC;AAAA,MAChE,WAAW,KAAK,WAAW,GAAG;AAC5B,gBAAQ,MAAMA,OAAM,OAAO,qBAAqBA,OAAM,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAC9E,gBAAQ,MAAMA,OAAM,IAAI,8BAA8B,KAAK,CAAC,EAAE,OAAO,+BAA+B,SAAS,EAAE,CAAC;AAAA,MAClH,OAAO;AACL,cAAM,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AACnD,gBAAQ,MAAMA,OAAM,OAAO,sBAAsBA,OAAM,KAAK,MAAM,CAAC,EAAE,CAAC;AACtE,gBAAQ,MAAMA,OAAM,IAAI,uDAAuD,CAAC;AAAA,MAClF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,gBAAgB,WAAW,EAAE;AAGnC,YAAQ,OAAO;AACf,IAAS,gBAAgBc,WAAU,KAAK;AACxC,UAAM,eAAe,MAAe,QAAQ,aAAa;AACzD,QAAI,cAAc;AAChB,cAAQ,QAAQ,sDAAsD;AAEtE,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,KAAK,cAAc;AACzB,gBAAQ,IAAId,OAAM,IAAI,uBAAuB,CAAC;AAAA,MAChD,QAAQ;AACN,gBAAQ,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AAEA,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,aAAa,KAAK,uBAAuB,WAAW,UAAU,GAAG,YAAY,CAAC;AACpF,YAAI,WAAW,cAAc,WAAW,YAAY;AAClD,kBAAQ,IAAIA,OAAM,MAAM,yCAAoC,CAAC;AAAA,QAC/D,WAAW,CAAC,WAAW,YAAY;AACjC,kBAAQ,IAAIA,OAAM,IAAI,sEAAsE,YAAY,gBAAgB,CAAC;AAAA,QAC3H;AAAA,MACF,QAAQ;AAAA,MAAkB;AAC1B;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,UAAM,kBAAkB,MAAa,kBAAkBc,WAAU,OAAO;AACxE,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,CAAC,MAAM,EAAE,SAAS,YAAY,MAAM,cAAc,YAAY,KACzD,EAAE,QAAQ,MAAM,YAAY,MAAMA,WAAU,MAAM,YAAY;AAAA,IACrE;AACA,QAAI,iBAAiB;AACnB,cAAQ,QAAQ,4DAA4D;AAC5E,cAAQ,IAAId,OAAM,IAAI,kBAAkB,gBAAgB,GAAG,EAAE,CAAC;AAC9D,cAAQ,IAAIA,OAAM,IAAI,kBAAkB,IAAI,KAAK,gBAAgB,OAAO,GAAI,EAAE,eAAe,CAAC,EAAE,CAAC;AAEjG,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,KAAK,cAAc;AACzB,gBAAQ,IAAIA,OAAM,IAAI,uBAAuB,CAAC;AAAA,MAChD,QAAQ;AACN,gBAAQ,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AACA;AAAA,IACF;AAEA,YAAQ,OAAO;AACf,UAAM,kBAAkB,KAAK,MAAM,SAAS,KAAK,KAAK,EAAE,IAAI;AAC5D,UAAM,EAAE,KAAK,KAAK,IAAI,MAAa;AAAA,MACjCc,WAAU;AAAA,MACV,OAAO,OAAO;AAAA,MACdA,WAAU;AAAA,MACVA,WAAU;AAAA,MACV,KAAK;AAAA,MACL;AAAA,IACF;AAGA,QAAI;AACF,cAAQ,OAAO;AACf,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,KAAK,cAAc;AACzB,cAAQ,QAAQ,4CAA4C;AAAA,IAC9D,QAAQ;AACN,cAAQ,QAAQ,sBAAsB;AACtC,cAAQ,KAAKd,OAAM,OAAO,oGAA0F,CAAC;AAAA,IACvH;AAGA,iBAAa,SAAS,EAAE,IAAI,EAAE,WAAW,OAAOc,WAAU,OAAO,MAAM,QAAQ,CAAC;AAChF,wBAAoB,SAAS,EAAE,IAAI,SAAS;AAG5C,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,KAAK,uBAAuB,WAAW,UAAU,GAAG,YAAY,CAAC;AACpF,UAAI,WAAW,cAAc,WAAW,YAAY;AAClD,gBAAQ,IAAIf,GAAE,wEAAmE,CAAC;AAAA,MACpF,WAAW,CAAC,WAAW,YAAY;AACjC,gBAAQ,IAAIG,KAAI,sEAAsE,YAAY,gBAAgB,CAAC;AAAA,MACrH;AAAA,IACF,QAAQ;AAAA,IAAkB;AAE1B,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,iCAA4B,CAAC;AAC/C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,mBAAmBF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACvE,YAAQ,IAAIE,GAAE,oBAAoB,OAAO,EAAE,CAAC;AAC5C,YAAQ,IAAIA,GAAE,mBAAmBC,KAAIY,WAAU,OAAO,CAAC,EAAE,CAAC;AAC1D,YAAQ,IAAIb,GAAE,mBAAmBC,KAAI,GAAG,CAAC,EAAE,CAAC;AAC5C,YAAQ,IAAID,GAAE,mBAAmBC,KAAW,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;AAElE,YAAQ,IAAID,GAAE,mBAAmBC,KAAW,kBAAkB,IAAI,CAAC,CAAC,EAAE,CAAC;AACvE,IAAAG,KAAI;AACJ,YAAQ,IAAIN,GAAE,sEAAiE,CAAC;AAChF,YAAQ,IAAIA,GAAE,uCAAkC,CAAC;AACjD,YAAQ,IAAIG,KAAI,+CAA+C,SAAS,EAAE,CAAC;AAC3E,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,UAAU,EAClB,YAAY,2DAA2D,EACvE,OAAO,sBAAsB,qBAAqB,EAClD,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,0BAA0B,EAAE,MAAM;AACtD,MAAI;AACF,QAAI;AACJ,QAAI;AACJ,QAAI;AAGJ,UAAM,oBAAoB,KAAK,aAAa,oBAAoB,SAAS,EAAE,EAAE,GAAG;AAChF,QAAI,mBAAmB;AACrB,YAAM,gBAAgB,MAAM,iBAAiB,iBAAiB;AAC9D,uBAAiB,cAAc;AAC/B,kBAAY;AACZ,uBAAiB,cAAc;AAAA,IACjC,OAAO;AACL,mBAAa,IAAI;AACjB,uBAA0B,gBAAgB;AAC1C,YAAM,gBAAgB,MAAM,sBAAsB,cAAc;AAChE,uBAAiB,cAAc;AAC/B,kBAAY,cAAc;AAAA,IAC5B;AAGA,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,eAAe,YAAY,MAAM,eAAe;AAClD,cAAQ,KAAK,mDAAmD;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,OAAO;AACf,UAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,kBAAkB,cAAc;AAAA,MAChC,eAAe,cAAc;AAAA,IACtC,CAAC;AAGD,UAAM,eAAe,IAAI;AAAA,MACvB,UACG,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,YAAY,MAAM,eAAe,YAAY,CAAC,EAC5E,IAAI,CAAC,MAAM,EAAE,QAAQ,QAAQ,SAAS,CAAC;AAAA,IAC5C;AACA,UAAM,WAAW,YAAY;AAAA,MAC3B,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,QAAQ,QAAQ,SAAS,CAAC,KAChD,EAAE,QAAQ,MAAM,YAAY,MAAM,eAAe,YAAY;AAAA,IACpE;AAEA,YAAQ,KAAK;AAEb,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAIN,KAAI,iCAAiC,CAAC;AAClD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,mCAA8B,SAAS,MAAM,GAAG,CAAC;AACnE,IAAAC,KAAI;AAEJ,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,OAAO,IAAI,KAAK,IAAI,OAAO,GAAI,EAAE,eAAe;AACtD,YAAM,WAAkB,cAAc,IAAI,QAAQ,OAAO;AACzD,YAAM,eAAsB,oBAAoB,IAAI,QAAQ,OAAO;AACnE,cAAQ,IAAIJ,GAAE,KAAK,IAAI,CAAC,YAAY,IAAI,QAAQ,OAAO,IAAIC,KAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;AACtF,cAAQ,IAAIA,KAAI,sBAAsB,YAAY,GAAG,CAAC;AACtD,UAAI,aAAa,MAAM;AACrB,gBAAQ,IAAIH,GAAE,4BAA4B,QAAQ,EAAE,CAAC;AAAA,MACvD;AACA,cAAQ,IAAIG,KAAI,qBAAqB,IAAI,EAAE,CAAC;AAC5C,cAAQ,IAAIA,KAAI,qBAAqB,IAAI,GAAG,EAAE,CAAC;AAC/C,cAAQ,IAAI;AAAA,IACd;AAEA,YAAQ,IAAIH,GAAE,eAAe,CAAC;AAC9B,YAAQ,IAAIG,KAAI,gEAAgE,CAAC;AACjF,YAAQ,IAAIH,GAAE,cAAc,CAAC;AAC7B,YAAQ,IAAIG,KAAI,mDAAmD,CAAC;AACpE,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,yBAAyB;AACtC,YAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,wEAAwE,EACpF,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,sBAAsB,8CAA8C,EAC3E,eAAe,mBAAmB,oCAAoC,EACtE,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AAEF,UAAM,mBAAmB,KAAK,aAAa,oBAAoB,SAAS,EAAE,EAAE,GAAG;AAC/E,QAAI,oBAAoB,CAAC,KAAK,OAAO;AACnC,YAAM,gBAAgB,MAAM,iBAAiB,gBAAgB;AAC7D,MAAS,gBAAgB,cAAc,KAAK;AAAA,IAC9C,OAAO;AACL,mBAAa,IAAI;AAAA,IACnB;AACA,UAAM,eAAwB,gBAAgB;AAE9C,UAAM,cAAc,gBAAgB,KAAK,QAAQ,QAAQ;AAGzD,UAAM,EAAE,SAAS,WAAW,IAAI,YAAY,IAAI,MAAM,sBAAsB,YAAY;AACxF,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,QAAQ,YAAY,MAAM,eAAe;AAC3C,cAAQ,KAAK,+CAA+C;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,YAAQ,OAAO;AACf,QAAI,qBAAqB;AACzB,QAAI;AACF,YAAM,UAAU,MAAe;AAAA,QAC7B,OAAO,KAAK,OAAO;AAAA,QACnB;AAAA,MACF;AACA,2BAAqB;AACrB,cAAQ,IAAIN,KAAI,uBAAuB,eAAe,OAAO,CAAC,EAAE,CAAC;AAAA,IACnE,SAAS,QAAQ;AACf,YAAM,MAAM,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM;AACpE,UAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,wBAAwB,GAAG;AACxE,gBAAQ,IAAIA,KAAI,qDAAgD,CAAC;AAAA,MACnE,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,oBAAoB;AACtB,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAAA,IAC9C;AAGA,YAAQ,OAAO;AACf,UAAM,oBAAoB,MAAa,eAAe,WAAW,EAAE,OAAO;AAC1E,UAAM,kBAAkB,kBAAkB;AAAA,MACxC,CAAC,MAAM,EAAE,QAAQ,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE,QAAQ,MAAM,YAAY,MAAM,aAAa,YAAY;AAAA,IAClH;AAEA,QAAI;AACJ,QAAI,iBAAiB;AACnB,oBAAc,gBAAgB;AAC9B,cAAQ,IAAIA,KAAI,uDAAkD,CAAC;AAAA,IACrE,OAAO;AACL,cAAQ,OAAO;AACf,YAAM,SAAS,MAAa;AAAA,QAC1B;AAAA,QACA,OAAO,KAAK,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AACA,oBAAc,OAAO;AAAA,IACvB;AAGA,QAAI;AACF,cAAQ,OAAO;AACf,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,QAAQ,MAAM,KAAK,SAAS,YAAY,SAAS;AACvD,YAAM,KAAK,UAAU,OAAO,KAAK,MAAM;AACvC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,OAAO;AAAA,QAC/D,WAAW;AAAA,QACX,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MACzC,CAAC;AACD,cAAQ,IAAIA,KAAI,oBAAoB,SAAS,EAAE,CAAC;AAAA,IAClD,QAAQ;AACN,cAAQ,KAAKF,OAAM,OAAO,4CAAuC,CAAC;AAClE,cAAQ,KAAKA,OAAM,IAAI,8CAA8C,SAAS,OAAO,CAAC;AAAA,IACxF;AAEA,YAAQ,QAAQ,+BAA+B;AAC/C,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,yBAAoB,CAAC;AACvC,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,oBAAoB,KAAK,OAAO,EAAE,CAAC;AACjD,YAAQ,IAAIA,GAAE,mBAAmBF,GAAE,KAAK,MAAM,CAAC,EAAE,CAAC;AAClD,YAAQ,IAAIE,GAAE,mBAAmBC,KAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAID,GAAE,mBAAmBC,KAAW,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC;AAC1E,IAAAG,KAAI;AAAA,EACN,SAAS,KAAK;AACZ,YAAQ,KAAK,iBAAiB;AAC9B,YAAQ,MAAML,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,eAAe,uBAAuB,wCAAwC,EAC9E,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,yBAAyB,EAAE,MAAM;AACrD,MAAI;AAIF,UAAM,OAAO,MAAa,kBAAkB,KAAK,WAA4B;AAC7E,YAAQ,QAAQ,uBAAuB;AACvC,YAAQ,IAAIN,KAAI,KAAY,kBAAkB,IAAI,CAAC,EAAE,CAAC;AAAA,EACxD,SAAS,KAAK;AACZ,YAAQ,KAAK,kBAAkB;AAC/B,YAAQ,MAAMF,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,OAAO,EACf,YAAY,wEAAmE,EAC/E,OAAO,sBAAsB,8BAA8B,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,YAAY,KAAK,aAAa,oBAAoB,SAAS,EAAE,EAAE,GAAG;AACxE,MAAI,CAAC,WAAW;AACd,YAAQ,MAAMA,OAAM,IAAI,qDAAqD,CAAC;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAUQ,KAAI,gBAAgB,EAAE,MAAM;AAC5C,MAAI;AAEF,QAAI,eAAe;AACnB,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,SAAS,KAAK,yBAAyB,WAAW,UAAU,CAAC;AACnE,qBAAe,OAAO;AAAA,IACxB,QAAQ;AAAA,IAAkB;AAG1B,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,uBAAkB;AACxD,iBAAa,SAAS;AAEtB,YAAQ,QAAQ,gBAAgB;AAChC,QAAI,cAAc;AAChB,cAAQ,IAAIT,GAAE,sCAAiC,CAAC;AAAA,IAClD;AACA,YAAQ,IAAIA,GAAE,gCAA2B,CAAC;AAC1C,YAAQ,IAAI;AACZ,YAAQ,IAAIC,OAAM,IAAI,mEAAmE,CAAC;AAC1F,YAAQ,IAAIA,OAAM,IAAI,iEAA4D,CAAC;AACnF,YAAQ,IAAIA,OAAM,IAAI,uDAAuD,CAAC;AAC9E,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,cAAc;AAC3B,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,aAAa,EACrB,YAAY,mFAAmF,EAC/F,OAAO,sBAAsB,qBAAqB,EAClD,OAAO,qBAAqB,eAAe,EAC3C,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,UAAU,SAAS,EAAE;AAC3B,UAAM,cAAc,cAAc,OAAO;AAEzC,QAAI,CAAC,KAAK,aAAa,CAAC,KAAK,OAAO;AAElC,YAAM,UAAU,oBAAoB,OAAO;AAC3C,UAAI,YAAY,WAAW,GAAG;AAC5B,gBAAQ,IAAIE,KAAI,sDAAsD,CAAC;AACvE;AAAA,MACF;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAIE,OAAM,0BAAqB,CAAC;AACxC,MAAAC,KAAI;AACJ,iBAAW,KAAK,aAAa;AAC3B,cAAM,YAAY,SAAS,cAAc,EAAE;AAC3C,cAAM,SAAS,YAAYN,GAAE,SAAI,IAAI;AACrC,gBAAQ,IAAIE,GAAE,KAAK,EAAE,SAAS,qBAAqB,MAAM,KAAKC,KAAI,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;AACnF,gBAAQ,IAAIA,KAAI,cAAc,EAAE,KAAK,EAAE,CAAC;AAAA,MAC1C;AACA,MAAAG,KAAI;AACJ,UAAI,YAAY,SAAS,GAAG;AAC1B,gBAAQ,IAAIH,KAAI,kEAAkE,CAAC;AAAA,MACrF;AACA,cAAQ,IAAI;AACZ;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,KAAK,WAAW;AAElB,YAAM,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,cAAc,KAAK,SAAS;AACpE,UAAI,CAAC,OAAO;AAEV,cAAM,gBAAgB,MAAM,iBAAiB,KAAK,SAAS;AAC3D,qBAAa,SAAS,EAAE,WAAW,KAAK,WAAW,OAAO,cAAc,OAAO,MAAM,QAAQ,CAAC;AAAA,MAChG;AACA,eAAS,KAAK;AAAA,IAChB,WAAW,KAAK,OAAO;AAErB,YAAM,QAAQ,YAAY;AAAA,QACxB,CAAC,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,MAAM,YAAY;AAAA,MAC1D;AACA,UAAI,OAAO;AACT,iBAAS,MAAM;AAAA,MACjB,OAAO;AAEL,cAAM,gBAAgB,MAAM,sBAAsB,gBAAgB,KAAK,OAAO,OAAO,CAAC;AACtF,qBAAa,SAAS,EAAE,WAAW,cAAc,WAAW,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAC9F,iBAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAMF,OAAM,IAAI,6DAA6D,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,wBAAoB,SAAS,MAAM;AACnC,YAAQ,IAAID,GAAE;AAAA,oCAAkC,MAAM;AAAA,CAAsB,CAAC;AAAA,EAC/E,SAAS,KAAK;AACZ,YAAQ,MAAMC,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QAAQ,QAAQ,OAAO;AAExC,SACG,QAAQ,SAAS,EACjB,YAAY,sBAAsB,EAClC,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,qBAAqB,oCAAoC,EACxE,OAAO,aAAa,+DAA0D,EAC9E,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,WAAW,MAAe,iBAAiB;AACjD,QAAM,SAASe,YAAW,KAAK,QAAQ,QAAQ;AAG/C,MAAI;AACF,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAe,iBAAiB,MAAM;AAAA,IACxC;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAMf,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUQ,KAAI,cAAc,KAAK,MAAM,KAAK,EAAE,MAAM;AAC1D,MAAI;AACF,QAAI;AACJ,QAAI,KAAK,QAAQ;AACf,cAAQ,OAAO,6BAA6B,KAAK,MAAM;AACvD,aAAO,MAAe,mBAAmB,MAAM;AAAA,IACjD,OAAO;AACL,aAAO,MAAe,QAAQ,MAAM;AAAA,IACtC;AACA,YAAQ,QAAQ,cAAc,IAAI,EAAE;AACpC,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,gBAAgB;AAC7B,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,OAAO,MAAe,aAAa;AACzC,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIR,OAAM,KAAK,YAAY,CAAC;AACpC,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,yBAAyB,KAAK,OAAO,EAAE;AACnD,YAAQ,IAAI,yBAAyB,KAAK,WAAW,EAAE;AACvD,YAAQ,IAAI,yBAAyB,KAAK,UAAU,EAAE;AACtD,YAAQ,IAAI,yBAAyB,KAAK,iBAAiB,EAAE;AAC7D,YAAQ,IAAI,yBAAyB,OAAO,KAAK,gBAAgB,IAAI,GAAG,GAAG;AAC3E,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,2BAA2B;AACxC,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,uCAAuC,EACnD,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,oBAAoB,EAAE,MAAM;AAChD,MAAI;AACF,UAAM,UAAU,MAAe,WAAW,KAAK,OAA8B;AAC7E,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIR,OAAM,KAAK,aAAa,CAAC;AACrC,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,mBAAmB,QAAQ,OAAO,SAAS,CAAC,EAAE;AAC1D,YAAQ,IAAI,mBAAmB,QAAQ,WAAW,EAAE;AACpD,YAAQ,IAAI,mBAAmB,QAAQ,cAAc,EAAE;AACvD,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAMA,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,yDAAyD,EACrE,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,qBAAqB,sDAAsD,EAClF,OAAO,wBAAwB,yDAAyD,EACxF,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AAIjB,QAAM,gBAAgB,MAAe,iBAAiB;AACtD,QAAM,gBAAgB,gBAAgB;AAEtC,MAAI;AACJ,MAAI;AACF,QAAI,KAAK,QAAQ;AACf,eAASe,YAAW,KAAK,QAAQ,aAAa;AAAA,IAChD,OAAO;AACL,eAAS,MAAe,gBAAgB;AACxC,UAAI,WAAW,IAAI;AACjB,gBAAQ,MAAMf,OAAM,IAAI,mCAA8B,CAAC;AACvD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,YAAY,CAACM,WAAU,KAAK,QAAQ,GAAG;AAC9C,YAAQ,MAAMN,OAAM,IAAI;AAAA,qCAAmC,KAAK,QAAQ;AAAA,CAAI,CAAC;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAe,gBAAgB,MAAM;AAAA,EACvC,SAAS,KAAK;AACZ,YAAQ,MAAMA,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAgBgB,aAAY,QAAQ,aAAa;AACvD,QAAM,UAAUR,KAAI,aAAa,aAAa,YAAY,EAAE,MAAM;AAClE,MAAI;AACF,UAAM,EAAE,MAAM,UAAU,IAAI,MAAe;AAAA,MACzC;AAAA,MACA,KAAK;AAAA,IACP;AACA,YAAQ,QAAQ,aAAa,IAAI,EAAE;AACnC,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAClD,YAAQ,IAAI,sBAAsBgB,aAAY,WAAW,aAAa,CAAC,EAAE;AAAA,EAC3E,SAAS,KAAK;AACZ,YAAQ,KAAK,eAAe;AAC5B,YAAQ,MAAMhB,OAAM,IAAI,oBAAoB,GAAG,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,gDAA2C;AACpG,iCAAiC,QAAQ;AAGzC,QACG,QAAQ,WAAW,EACnB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAM,EAAE,iBAAiB,eAAe,IAAI,MAAM,OAAO,wBAA+B;AACxF,QAAM,YAAY,CAAC,IAAI,iBAAiB,GAAG,IAAI,gBAAgB,GAAG,IAAI,gBAAgB,GAAG,IAAI,eAAe,CAAC;AAC7G,aAAW,KAAK,WAAW;AACzB,UAAM,OAAO,EAAE,KAAK;AACpB,YAAQ,IAAI;AAAA,EAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG;AAC3C,YAAQ,IAAI,mBAAmB,KAAK,aAAa,KAAK,IAAI,CAAC,EAAE;AAC7D,YAAQ,IAAI,aAAa,KAAK,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/E;AACF,CAAC;AAGH,IAAI;AACF,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,oBAAoB;AAClE,uBAAqB,OAAO;AAC9B,QAAQ;AACN,UACG,QAAQ,sCAAsC,EAC9C,YAAY,iDAA4C,EACxD,OAAO,MAAM;AACZ,YAAQ,MAAMA,OAAM,IAAI,yBAAyB,CAAC;AAClD,YAAQ,MAAMA,OAAM,IAAI,yCAAyC,CAAC;AAClE,YAAQ,MAAMA,OAAM,IAAI,4CAA4C,CAAC;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;AAGA,IAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,uBAAuB;AACxE,wBAAwB,OAAO;AAG/B,uBAAuB,OAAO;AAG9B,0BAA0B,OAAO;AAGjC,yBAAyB,OAAO;AAGhC,yBAAyB,OAAO;AAGhC,yBAAyB,OAAO;AAGhC,yBAAyB,OAAO;AAGhC,IAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,wBAAwB;AAC1E,yBAAyB,OAAO;AAGhC,IAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qBAAqB;AACpE,sBAAsB,OAAO;AAG7B,IAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qBAAqB;AACpE,sBAAsB,OAAO;AAG7B,IAAM,YAAY,QAAQ,QAAQ,QAAQ;AAE1C,UACG,QAAQ,KAAK,EACb,YAAY,qEAAqE,EACjF,OAAO,uBAAuB,kCAAkC,EAChE,OAAO,qBAAqB,gCAAgC,EAC5D,OAAO,eAAe,+CAA+C,EACrE,OAAO,oBAAoB,gEAAgE,EAC3F,OAAO,2BAA2B,uDAAuD,EACzF,OAAO,0BAA0B,6BAA6B,EAC9D,OAAO,oCAAoC,8DAA8D,EACzG,OAAO,CAAC,SAAS;AAChB,MAAI,QAAQ;AAEZ,MAAI,KAAK,YAAY;AACnB,kBAAc,KAAK,UAAU;AAC7B,UAAM,UAAU,WAAW;AAC3B,YAAQ,IAAIA,OAAM,MAAM,8CAA8C,CAAC;AACvE,YAAQ,IAAIA,OAAM,IAAI,aAAa,QAAQ,OAAO,EAAE,CAAC;AACrD,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,UAAU,SAAS,EAAE;AAC3B,qBAAiB,SAAS,SAAS,KAAK,KAAK;AAC7C,YAAQ,IAAIA,OAAM,MAAM,iDAAiD,OAAO,GAAG,CAAC;AACpF,YAAQ,IAAIA,OAAM,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;AAC/C,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,KAAK;AACZ,UAAM,UAAU,WAAW;AAC3B,oBAAgB,SAAS,KAAK,GAAG;AACjC,YAAQ,IAAIA,OAAM,MAAM,qBAAqB,OAAO,EAAE,CAAC;AACvD,YAAQ,IAAIA,OAAM,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;AAC3C,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,UAAU;AACjB,gBAAY,KAAK,QAAQ;AACzB,YAAQ,IAAIA,OAAM,MAAM,qDAAqD,CAAC;AAC9E,YAAQ,IAAIA,OAAM,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;AACtD,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,eAAe;AACtB,qBAAiB,KAAK,aAAa;AACnC,YAAQ,IAAIA,OAAM,MAAM,kDAAkD,CAAC;AAC3E,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,cAAc;AACrB,oBAAgB,KAAK,YAAY;AACjC,YAAQ,IAAIA,OAAM,MAAM,iDAAiD,CAAC;AAC1E,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,WAAW;AAClB,UAAM,QAAQ,KAAK,UAAU,MAAM,GAAG;AACtC,QAAI,MAAM,WAAW,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AAChD,cAAQ,IAAIA,OAAM,IAAI,4CAA4C,CAAC;AACnE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,iBAAa,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC/B,YAAQ,IAAIA,OAAM,MAAM,4BAA4B,MAAM,CAAC,CAAC,EAAE,CAAC;AAC/D,YAAQ,IAAIA,OAAM,IAAI,eAAe,MAAM,CAAC,CAAC,EAAE,CAAC;AAChD,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAIA,OAAM,IAAI,wHAAwH,CAAC;AAC/I,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,OAAO,MAAM;AACZ,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,SAAS,EAAE;AAC3B,QAAM,YAAY,kBAAkB,OAAO;AAC3C,QAAM,SAAS,WAAW;AAC1B,QAAM,YAAY,OAAO,MAAM,OAAO;AAEtC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,iBAAiB,CAAC;AACzC,UAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,UAAQ,IAAI,iBAAiBA,OAAM,KAAK,OAAO,CAAC,WAAW,OAAO,GAAG;AACrE,UAAQ,IAAI,iBAAiB,YAAYA,OAAM,MAAM,SAAS,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AACxF,UAAQ,IAAI,iBAAiB,OAAO,aAAaA,OAAM,MAAM,YAAY,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AACnG,UAAQ,IAAI,iBAAiB,OAAO,WAAWA,OAAM,IAAI,SAAS,CAAC,EAAE;AACrE,UAAQ,IAAI,iBAAiB,UAAU,SAASA,OAAM,IAAI,SAAS,CAAC,EAAE;AACtE,UAAQ,IAAI,iBAAiB,iBAAiB,IAAIA,OAAM,MAAM,oBAAoB,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AAC5G,UAAQ,IAAI,iBAAiB,gBAAgB,IAAIA,OAAM,MAAM,oBAAoB,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AAG3G,QAAM,eAAe,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAChF,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,eAAe,CAAC;AACvC,eAAW,CAAC,KAAK,GAAG,KAAK,cAAc;AACrC,cAAQ,IAAI,OAAO,GAAG,KAAKA,OAAM,KAAK,GAAG,CAAC,EAAE;AAAA,IAC9C;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,wCAAwC,CAAC;AAC/D,UAAQ,IAAI;AACd,CAAC;AAEH,QAAQ,MAAM;","names":["parseUnits","formatUnits","isAddress","chalk","ora","encodeAbiParameters","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","maxUint256","buildInitData","encodeAbiParameters","buildExecuteCalls","maxUint256","encodeFunctionData","buildSettleCalls","concat","encodeAbiParameters","encoded","buildInitData","buildExecuteCalls","buildSettleCalls","strategy","propose","parseDuration","getActiveSyndicates","data","formatUnits","isAddress","parseUnits","chalk","ora","program","ora","chalk","formatUnits","getEasScanUrl","parseUnits","isAddress","getChainContracts","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","parseUnits","parseUnits","encodeFunctionData","program","isAddress","chalk","ora","parseUnits","formatUnits","chalk","ora","program","chalk","ora","registry","isAddress","encodeFunctionData","chalk","ora","readFileSync","encodeFunctionData","chalk","chalk","input","encodeFunctionData","getAccount","G","chalk","W","DIM","BOLD","LABEL","SEP","readFileSync","program","isAddress","spinner","ora","encodeFunctionData","resolve","chalk","ora","G","chalk","W","DIM","BOLD","LABEL","SEP","program","ora","chalk","ora","formatUnits","isAddress","parseUnits","G","chalk","W","DIM","BOLD","LABEL","SEP","ERC20_ABI","ora","program","isAddress","formatUnits","parseUnits","require","G","chalk","W","DIM","BOLD","LABEL","SEP","isAddress","spinner","ora","chainId","refParam","getActiveSyndicates","AGENT_REGISTRY","registry","syndicate","parseUnits","formatUnits"]}