levr-sdk 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -13
- package/dist/esm/abis/LevrFactory_v1.js +63 -0
- package/dist/esm/abis/LevrGovernor_v1.js +15 -24
- package/dist/esm/abis/LevrStaking_v1.js +7 -1
- package/dist/esm/abis/StateView.js +149 -0
- package/dist/esm/abis/V3QuoterV2.js +26 -0
- package/dist/esm/abis/index.js +4 -0
- package/dist/esm/balance.js +48 -4
- package/dist/esm/balance.js.map +1 -1
- package/dist/esm/client/hook/index.js +14 -3
- package/dist/esm/client/hook/index.js.map +1 -1
- package/dist/esm/client/hook/use-fee-receivers.js +11 -30
- package/dist/esm/client/hook/use-fee-receivers.js.map +1 -1
- package/dist/esm/client/hook/use-governance.js +20 -274
- package/dist/esm/client/hook/use-governance.js.map +1 -1
- package/dist/esm/client/hook/use-pool.js +26 -0
- package/dist/esm/client/hook/use-pool.js.map +1 -0
- package/dist/esm/client/hook/use-prepare.js +6 -3
- package/dist/esm/client/hook/use-prepare.js.map +1 -1
- package/dist/esm/client/hook/use-project.js +28 -16
- package/dist/esm/client/hook/use-project.js.map +1 -1
- package/dist/esm/client/hook/use-proposal.js +48 -0
- package/dist/esm/client/hook/use-proposal.js.map +1 -0
- package/dist/esm/client/hook/use-stake.js +29 -215
- package/dist/esm/client/hook/use-stake.js.map +1 -1
- package/dist/esm/client/hook/use-swap.js +23 -19
- package/dist/esm/client/hook/use-swap.js.map +1 -1
- package/dist/esm/client/hook/use-user.js +25 -0
- package/dist/esm/client/hook/use-user.js.map +1 -0
- package/dist/esm/client/levr-provider.js +73 -108
- package/dist/esm/client/levr-provider.js.map +1 -1
- package/dist/esm/client/query-keys.js +10 -22
- package/dist/esm/client/query-keys.js.map +1 -1
- package/dist/esm/constants.js +42 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/fee-receivers.js +28 -13
- package/dist/esm/fee-receivers.js.map +1 -1
- package/dist/esm/governance.js +35 -399
- package/dist/esm/governance.js.map +1 -1
- package/dist/esm/index.js +7 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pool-key.js +152 -0
- package/dist/esm/pool-key.js.map +1 -0
- package/dist/esm/pool.js +70 -0
- package/dist/esm/pool.js.map +1 -0
- package/dist/esm/project.js +415 -118
- package/dist/esm/project.js.map +1 -1
- package/dist/esm/proposal.js +156 -0
- package/dist/esm/proposal.js.map +1 -0
- package/dist/esm/quote/index.js +98 -0
- package/dist/esm/quote/index.js.map +1 -0
- package/dist/esm/quote/v3.js +62 -0
- package/dist/esm/quote/v3.js.map +1 -0
- package/dist/esm/quote/v4.js +228 -0
- package/dist/esm/quote/v4.js.map +1 -0
- package/dist/esm/stake.js +34 -237
- package/dist/esm/stake.js.map +1 -1
- package/dist/esm/treasury.js +162 -0
- package/dist/esm/treasury.js.map +1 -0
- package/dist/esm/usd-price.js +149 -0
- package/dist/esm/usd-price.js.map +1 -0
- package/dist/esm/user.js +153 -0
- package/dist/esm/user.js.map +1 -0
- package/dist/esm/util.js +45 -1
- package/dist/esm/util.js.map +1 -1
- package/dist/types/abis/LevrFactory_v1.d.ts +48 -0
- package/dist/types/abis/LevrGovernor_v1.d.ts +12 -18
- package/dist/types/abis/LevrStaking_v1.d.ts +5 -1
- package/dist/types/abis/StateView.d.ts +278 -0
- package/dist/types/abis/V3QuoterV2.d.ts +39 -0
- package/dist/types/abis/index.d.ts +2 -0
- package/dist/types/balance.d.ts +19 -6
- package/dist/types/balance.d.ts.map +1 -1
- package/dist/types/client/hook/index.d.ts +12 -4
- package/dist/types/client/hook/index.d.ts.map +1 -1
- package/dist/types/client/hook/use-fee-receivers.d.ts +6 -16
- package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -1
- package/dist/types/client/hook/use-governance.d.ts +4 -93
- package/dist/types/client/hook/use-governance.d.ts.map +1 -1
- package/dist/types/client/hook/use-pool.d.ts +12 -0
- package/dist/types/client/hook/use-pool.d.ts.map +1 -0
- package/dist/types/client/hook/use-prepare.d.ts +1 -2
- package/dist/types/client/hook/use-prepare.d.ts.map +1 -1
- package/dist/types/client/hook/use-project.d.ts +8 -1
- package/dist/types/client/hook/use-project.d.ts.map +1 -1
- package/dist/types/client/hook/use-proposal.d.ts +18 -0
- package/dist/types/client/hook/use-proposal.d.ts.map +1 -0
- package/dist/types/client/hook/use-stake.d.ts +14 -168
- package/dist/types/client/hook/use-stake.d.ts.map +1 -1
- package/dist/types/client/hook/use-swap.d.ts +5 -9
- package/dist/types/client/hook/use-swap.d.ts.map +1 -1
- package/dist/types/client/hook/use-user.d.ts +13 -0
- package/dist/types/client/hook/use-user.d.ts.map +1 -0
- package/dist/types/client/levr-provider.d.ts +41 -68
- package/dist/types/client/levr-provider.d.ts.map +1 -1
- package/dist/types/client/query-keys.d.ts +14 -26
- package/dist/types/client/query-keys.d.ts.map +1 -1
- package/dist/types/constants.d.ts +18 -0
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/fee-receivers.d.ts +29 -2
- package/dist/types/fee-receivers.d.ts.map +1 -1
- package/dist/types/governance.d.ts +8 -108
- package/dist/types/governance.d.ts.map +1 -1
- package/dist/types/index.d.ts +7 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/pool-key.d.ts +121 -0
- package/dist/types/pool-key.d.ts.map +1 -0
- package/dist/types/pool.d.ts +590 -0
- package/dist/types/pool.d.ts.map +1 -0
- package/dist/types/project.d.ts +61 -11
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/proposal.d.ts +1161 -0
- package/dist/types/proposal.d.ts.map +1 -0
- package/dist/types/quote/index.d.ts +97 -0
- package/dist/types/quote/index.d.ts.map +1 -0
- package/dist/types/quote/v3.d.ts +78 -0
- package/dist/types/quote/v3.d.ts.map +1 -0
- package/dist/types/quote/v4.d.ts +95 -0
- package/dist/types/quote/v4.d.ts.map +1 -0
- package/dist/types/stake.d.ts +41 -87
- package/dist/types/stake.d.ts.map +1 -1
- package/dist/types/treasury.d.ts +16 -0
- package/dist/types/treasury.d.ts.map +1 -0
- package/dist/types/types.d.ts +15 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/usd-price.d.ts +141 -0
- package/dist/types/usd-price.d.ts.map +1 -0
- package/dist/types/user.d.ts +188 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/util.d.ts +17 -0
- package/dist/types/util.d.ts.map +1 -1
- package/package.json +5 -2
- package/dist/esm/client/hook/use-balance.js +0 -56
- package/dist/esm/client/hook/use-balance.js.map +0 -1
- package/dist/esm/client/hook/use-projects.js +0 -22
- package/dist/esm/client/hook/use-projects.js.map +0 -1
- package/dist/esm/client/hook/use-proposals.js +0 -31
- package/dist/esm/client/hook/use-proposals.js.map +0 -1
- package/dist/esm/projects.js +0 -212
- package/dist/esm/projects.js.map +0 -1
- package/dist/esm/proposals.js +0 -98
- package/dist/esm/proposals.js.map +0 -1
- package/dist/esm/quote-v4.js +0 -169
- package/dist/esm/quote-v4.js.map +0 -1
- package/dist/types/client/hook/use-balance.d.ts +0 -18
- package/dist/types/client/hook/use-balance.d.ts.map +0 -1
- package/dist/types/client/hook/use-projects.d.ts +0 -6
- package/dist/types/client/hook/use-projects.d.ts.map +0 -1
- package/dist/types/client/hook/use-proposals.d.ts +0 -16
- package/dist/types/client/hook/use-proposals.d.ts.map +0 -1
- package/dist/types/projects.d.ts +0 -20
- package/dist/types/projects.d.ts.map +0 -1
- package/dist/types/proposals.d.ts +0 -20
- package/dist/types/proposals.d.ts.map +0 -1
- package/dist/types/quote-v4.d.ts +0 -54
- package/dist/types/quote-v4.d.ts.map +0 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { encodeAbiParameters, keccak256, zeroAddress } from "viem";
|
|
2
|
+
import { StateView } from "./abis/index.js";
|
|
3
|
+
import { UNISWAP_V4_STATE_VIEW } from "./constants.js";
|
|
4
|
+
/**
|
|
5
|
+
* @description Sort two token addresses for pool key (currency0 < currency1)
|
|
6
|
+
*/
|
|
7
|
+
export const sortTokens = (tokenA, tokenB) => {
|
|
8
|
+
return tokenA.toLowerCase() < tokenB.toLowerCase() ? [tokenA, tokenB] : [tokenB, tokenA];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* @description Default pool configuration
|
|
12
|
+
* 0.3% fee tier is the most common on Uniswap
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_POOL_CONFIG = {
|
|
15
|
+
fee: 3000, // 0.3% fee tier (most common)
|
|
16
|
+
tickSpacing: 60, // Corresponds to 0.3% fee tier
|
|
17
|
+
hooks: zeroAddress, // No hooks by default
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @description Create a pool key for two tokens
|
|
21
|
+
* @param token0 First token address
|
|
22
|
+
* @param token1 Second token address
|
|
23
|
+
* @param fee Fee tier (in hundredths of a bip, e.g. 3000 = 0.3%). Defaults to 3000 (0.3%)
|
|
24
|
+
* @param tickSpacing Tick spacing. Defaults to 60 (for 0.3% fee tier)
|
|
25
|
+
* @param hooks Hooks address. Defaults to zero address (no hooks)
|
|
26
|
+
* @returns Properly sorted PoolKey
|
|
27
|
+
*/
|
|
28
|
+
export const createPoolKey = (token0, token1, fee = DEFAULT_POOL_CONFIG.fee, tickSpacing = DEFAULT_POOL_CONFIG.tickSpacing, hooks = DEFAULT_POOL_CONFIG.hooks) => {
|
|
29
|
+
const [currency0, currency1] = sortTokens(token0, token1);
|
|
30
|
+
return {
|
|
31
|
+
currency0,
|
|
32
|
+
currency1,
|
|
33
|
+
fee,
|
|
34
|
+
tickSpacing,
|
|
35
|
+
hooks,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* @description Calculate pool ID from pool key (keccak256 of abi.encode(PoolKey))
|
|
40
|
+
* @param poolKey Pool key
|
|
41
|
+
* @returns Pool ID as bytes32
|
|
42
|
+
*/
|
|
43
|
+
export const getPoolId = (poolKey) => {
|
|
44
|
+
return keccak256(encodeAbiParameters([
|
|
45
|
+
{
|
|
46
|
+
type: "tuple",
|
|
47
|
+
components: [
|
|
48
|
+
{ name: "currency0", type: "address" },
|
|
49
|
+
{ name: "currency1", type: "address" },
|
|
50
|
+
{ name: "fee", type: "uint24" },
|
|
51
|
+
{ name: "tickSpacing", type: "int24" },
|
|
52
|
+
{ name: "hooks", type: "address" },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
], [poolKey]));
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* @description Common fee tiers and their corresponding tick spacings
|
|
59
|
+
* Ordered by preference: 0.3% is most common for major pairs, then 0.05%, then 1%
|
|
60
|
+
* From Uniswap V4 documentation
|
|
61
|
+
*/
|
|
62
|
+
export const COMMON_FEE_TIERS = [
|
|
63
|
+
{ fee: 3000, tickSpacing: 60 }, // 0.3% - Most common for major pairs like WETH/USDC
|
|
64
|
+
{ fee: 500, tickSpacing: 10 }, // 0.05%
|
|
65
|
+
{ fee: 10000, tickSpacing: 200 }, // 1%
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* @description Discover an existing pool by trying common fee tiers
|
|
69
|
+
* @param params Discovery parameters
|
|
70
|
+
* @returns Pool data if found, null otherwise
|
|
71
|
+
*
|
|
72
|
+
* @remarks
|
|
73
|
+
* This function tries to find an initialized pool by:
|
|
74
|
+
* 1. Trying common fee tiers (0.05%, 0.3%, 1%)
|
|
75
|
+
* 2. Querying StateView contract to check if pool exists and has liquidity
|
|
76
|
+
* 3. Returning the first valid pool found
|
|
77
|
+
*
|
|
78
|
+
* Uses Uniswap V4's StateView contract to fetch pool state:
|
|
79
|
+
* - getSlot0(): sqrtPriceX96, tick, protocol/LP fees
|
|
80
|
+
* - getLiquidity(): pool liquidity
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const pool = await discoverPool({
|
|
85
|
+
* publicClient,
|
|
86
|
+
* token0: WETH_ADDRESS,
|
|
87
|
+
* token1: USDC_ADDRESS,
|
|
88
|
+
* })
|
|
89
|
+
* if (pool) {
|
|
90
|
+
* console.log('Found pool:', pool.poolKey)
|
|
91
|
+
* console.log('Liquidity:', pool.liquidity)
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export const discoverPool = async ({ publicClient, token0, token1, hooks = zeroAddress, feeTiers = COMMON_FEE_TIERS, }) => {
|
|
96
|
+
const chainId = publicClient.chain?.id;
|
|
97
|
+
if (!chainId)
|
|
98
|
+
throw new Error("Chain ID not found on public client");
|
|
99
|
+
const stateViewAddress = UNISWAP_V4_STATE_VIEW(chainId);
|
|
100
|
+
if (!stateViewAddress) {
|
|
101
|
+
throw new Error(`StateView address not found for chain ID ${chainId}`);
|
|
102
|
+
}
|
|
103
|
+
// Check ALL fee tiers and select the most liquid pool
|
|
104
|
+
let bestPool = null;
|
|
105
|
+
let maxLiquidity = 0n;
|
|
106
|
+
for (const { fee, tickSpacing } of feeTiers) {
|
|
107
|
+
try {
|
|
108
|
+
const poolKey = createPoolKey(token0, token1, fee, tickSpacing, hooks);
|
|
109
|
+
const poolId = getPoolId(poolKey);
|
|
110
|
+
// Query pool state from StateView contract
|
|
111
|
+
const [slot0Result, liquidityResult] = await Promise.all([
|
|
112
|
+
publicClient.readContract({
|
|
113
|
+
address: stateViewAddress,
|
|
114
|
+
abi: StateView,
|
|
115
|
+
functionName: "getSlot0",
|
|
116
|
+
args: [poolId],
|
|
117
|
+
}),
|
|
118
|
+
publicClient.readContract({
|
|
119
|
+
address: stateViewAddress,
|
|
120
|
+
abi: StateView,
|
|
121
|
+
functionName: "getLiquidity",
|
|
122
|
+
args: [poolId],
|
|
123
|
+
}),
|
|
124
|
+
]);
|
|
125
|
+
const [sqrtPriceX96, tick] = slot0Result;
|
|
126
|
+
const liquidity = liquidityResult;
|
|
127
|
+
// In V4, getLiquidity() returns current tick liquidity which can be 0
|
|
128
|
+
// even if pool has liquidity in other ticks. Check if pool is initialized by sqrtPrice
|
|
129
|
+
const poolInitialized = sqrtPriceX96 > 0n;
|
|
130
|
+
// Select pool with most liquidity
|
|
131
|
+
if (poolInitialized && liquidity > maxLiquidity) {
|
|
132
|
+
maxLiquidity = liquidity;
|
|
133
|
+
bestPool = {
|
|
134
|
+
poolKey,
|
|
135
|
+
sqrtPriceX96,
|
|
136
|
+
liquidity,
|
|
137
|
+
tick: Number(tick),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
// Pool doesn't exist or error querying, try next fee tier
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return bestPool;
|
|
147
|
+
};
|
|
148
|
+
export const findLiquidPool = async (params) => {
|
|
149
|
+
const pool = await discoverPool(params);
|
|
150
|
+
return pool?.poolKey ?? null;
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=pool-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-key.js","sourceRoot":"","sources":["../../src/pool-key.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/pool.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { StateView } from "./abis/index.js";
|
|
2
|
+
import { UNISWAP_V4_STATE_VIEW } from "./constants.js";
|
|
3
|
+
import { getPoolId } from "./pool-key.js";
|
|
4
|
+
// ========================================
|
|
5
|
+
// HELPER UTILS (for composition in larger multicalls)
|
|
6
|
+
// ========================================
|
|
7
|
+
/**
|
|
8
|
+
* Helper: Get pool state contracts for multicall composition
|
|
9
|
+
*/
|
|
10
|
+
export function poolStateContracts(params) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
address: params.stateViewAddress,
|
|
14
|
+
abi: StateView,
|
|
15
|
+
functionName: "getSlot0",
|
|
16
|
+
args: [params.poolId],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
address: params.stateViewAddress,
|
|
20
|
+
abi: StateView,
|
|
21
|
+
functionName: "getLiquidity",
|
|
22
|
+
args: [params.poolId],
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
// ========================================
|
|
27
|
+
// MAIN POOL DATA FUNCTION
|
|
28
|
+
// ========================================
|
|
29
|
+
/**
|
|
30
|
+
* Get pool-specific data including liquidity, price, and fees
|
|
31
|
+
* Uses StateView contract for efficient state queries
|
|
32
|
+
*/
|
|
33
|
+
export async function pool({ publicClient, project }) {
|
|
34
|
+
if (Object.values({ publicClient, project }).some((value) => !value)) {
|
|
35
|
+
throw new Error("Invalid pool params");
|
|
36
|
+
}
|
|
37
|
+
if (!project.pool?.poolKey)
|
|
38
|
+
return null;
|
|
39
|
+
const chainId = publicClient.chain?.id;
|
|
40
|
+
if (!chainId)
|
|
41
|
+
throw new Error("Chain ID not found on public client");
|
|
42
|
+
const stateViewAddress = UNISWAP_V4_STATE_VIEW(chainId);
|
|
43
|
+
if (!stateViewAddress) {
|
|
44
|
+
throw new Error(`StateView address not found for chain ID ${chainId}`);
|
|
45
|
+
}
|
|
46
|
+
const poolKey = project.pool.poolKey;
|
|
47
|
+
const poolId = getPoolId(poolKey);
|
|
48
|
+
// Use helper to get contracts and execute multicall
|
|
49
|
+
const contracts = poolStateContracts({ stateViewAddress, poolId });
|
|
50
|
+
const results = await publicClient.multicall({ contracts });
|
|
51
|
+
const slot0Result = results[0].result;
|
|
52
|
+
const liquidityResult = results[1].result;
|
|
53
|
+
const [sqrtPriceX96, tick, protocolFee, lpFee] = slot0Result;
|
|
54
|
+
const liquidity = liquidityResult;
|
|
55
|
+
// Determine fee display from project
|
|
56
|
+
const feeDisplay = project.pool.feeDisplay;
|
|
57
|
+
return {
|
|
58
|
+
poolKey,
|
|
59
|
+
sqrtPriceX96,
|
|
60
|
+
tick: Number(tick),
|
|
61
|
+
liquidity: {
|
|
62
|
+
raw: liquidity,
|
|
63
|
+
formatted: liquidity.toString(),
|
|
64
|
+
},
|
|
65
|
+
protocolFee: Number(protocolFee),
|
|
66
|
+
lpFee: Number(lpFee),
|
|
67
|
+
feeDisplay,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAmBtC,2CAA2C;AAC3C,sDAAsD;AACtD,2CAA2C;AAE3C;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAGlC;IACC,OAAO;QACL;YACE,OAAO,EAAE,MAAM,CAAC,gBAAgB;YAChC,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,UAAmB;YACjC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;SACtB;QACD;YACE,OAAO,EAAE,MAAM,CAAC,gBAAgB;YAChC,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,cAAuB;YACrC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;SACtB;KACF,CAAA;AACH,CAAC;AAED,2CAA2C;AAC3C,0BAA0B;AAC1B,2CAA2C;AAE3C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAc;IAC9D,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,CAAA;IAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAA;IACtC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEpE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAEjC,oDAAoD;IACpD,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAE3D,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAA0C,CAAA;IACzE,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAgB,CAAA;IAEnD,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,GAAG,WAAW,CAAA;IAC5D,MAAM,SAAS,GAAG,eAAe,CAAA;IAEjC,qCAAqC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAA;IAE1C,OAAO;QACL,OAAO;QACP,YAAY;QACZ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,SAAS,EAAE;YACT,GAAG,EAAE,SAAS;YACd,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;SAChC;QACD,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;QACpB,UAAU;KACX,CAAA;AACH,CAAC"}
|