@ring-protocol/smart-order-router 0.5.29 → 0.5.31

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 (24) hide show
  1. package/build/main/routers/alpha-router/alpha-router.js +7 -2
  2. package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
  3. package/build/main/routers/alpha-router/functions/best-swap-route.js +73 -49
  4. package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
  5. package/build/main/routers/alpha-router/functions/compute-all-routes.js +128 -23
  6. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
  7. package/build/main/routers/alpha-router/quoters/mixed-quoter.js +10 -8
  8. package/build/main/tsconfig.tsbuildinfo +1 -1
  9. package/build/main/util/amounts.d.ts +1 -1
  10. package/build/main/util/methodParameters.js +53 -12
  11. package/build/main/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
  12. package/build/main/util/mixedRouteFilterOutV4Pools.js +28 -3
  13. package/build/module/routers/alpha-router/alpha-router.js +7 -2
  14. package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
  15. package/build/module/routers/alpha-router/functions/best-swap-route.js +74 -50
  16. package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
  17. package/build/module/routers/alpha-router/functions/compute-all-routes.js +125 -22
  18. package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +8 -1
  19. package/build/module/routers/alpha-router/quoters/mixed-quoter.js +10 -8
  20. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  21. package/build/module/util/methodParameters.js +58 -16
  22. package/build/module/util/mixedRouteFilterOutV4Pools.d.ts +20 -0
  23. package/build/module/util/mixedRouteFilterOutV4Pools.js +26 -2
  24. package/package.json +3 -3
@@ -5,6 +5,6 @@ export declare class CurrencyAmount extends CurrencyAmountRaw<Currency> {
5
5
  export declare const MAX_UINT160 = "0xffffffffffffffffffffffffffffffffffffffff";
6
6
  export declare function parseAmount(value: string, currency: Currency): CurrencyAmount;
7
7
  export declare function parseFeeAmount(feeAmountStr: string): FeeAmount;
8
- export declare function unparseFeeAmount(feeAmount: FeeAmount): "10000" | "3000" | "500" | "400" | "300" | "200" | "100";
8
+ export declare function unparseFeeAmount(feeAmount: FeeAmount): "100" | "10000" | "3000" | "500" | "400" | "300" | "200";
9
9
  export declare function getApplicableV3FeeAmounts(chainId: ChainId): FeeAmount[];
10
10
  export declare function getApplicableV4FeesTickspacingsHooks(chainId: ChainId): Array<[number, number, string]>;
@@ -14,6 +14,10 @@ const v4_sdk_1 = require("@ring-protocol/v4-sdk");
14
14
  const lodash_1 = __importDefault(require("lodash"));
15
15
  const __1 = require("..");
16
16
  function buildTrade(tokenInCurrency, fewTokenInToken, tokenOutCurrency, fewTokenOutToken, tradeType, routeAmounts) {
17
+ // fewTokenInToken/fewTokenOutToken 保留参数以维持 API 兼容性,
18
+ // 但 FewV2 路由现在统一使用 tokenInCurrency/tokenOutCurrency
19
+ void fewTokenInToken;
20
+ void fewTokenOutToken;
17
21
  /// Removed partition because of new mixedRoutes
18
22
  const v4RouteAmounts = lodash_1.default.filter(routeAmounts, (routeAmount) => routeAmount.protocol === router_sdk_1.Protocol.V4);
19
23
  const v3RouteAmounts = lodash_1.default.filter(routeAmounts, (routeAmount) => routeAmount.protocol === router_sdk_1.Protocol.V3);
@@ -101,12 +105,12 @@ function buildTrade(tokenInCurrency, fewTokenInToken, tokenOutCurrency, fewToken
101
105
  });
102
106
  const fewV2Routes = lodash_1.default.map(ringFewV2RouteAmounts, (routeAmount) => {
103
107
  const { route, amount, quote } = routeAmount;
104
- // The route, amount and quote are all in terms of wrapped tokens.
105
- // When constructing the Trade object the inputAmount/outputAmount must
106
- // use native currencies if specified by the user. This is so that the Trade knows to wrap/unwrap.
108
+ // FewV2 路由内部使用 fewToken,但 trade 对外的 inputAmount/outputAmount
109
+ // 必须使用用户指定的原始 currency(与 V2/V3/V4 保持一致),
110
+ // 否则 Trade.outputAmount reduce 聚合多个路由时会因 currency 不匹配而崩溃。
107
111
  if (tradeType == sdk_core_1.TradeType.EXACT_INPUT) {
108
- const amountCurrency = __1.CurrencyAmount.fromFractionalAmount(fewTokenInToken, amount.numerator, amount.denominator);
109
- const quoteCurrency = __1.CurrencyAmount.fromFractionalAmount(fewTokenOutToken, quote.numerator, quote.denominator);
112
+ const amountCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenInCurrency, amount.numerator, amount.denominator);
113
+ const quoteCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenOutCurrency, quote.numerator, quote.denominator);
110
114
  const ringFewRouteV2SDK = new few_v2_sdk_1.Route(route.pairs, amountCurrency.currency, quoteCurrency.currency);
111
115
  return {
112
116
  fewRouteV2: ringFewRouteV2SDK,
@@ -115,8 +119,8 @@ function buildTrade(tokenInCurrency, fewTokenInToken, tokenOutCurrency, fewToken
115
119
  };
116
120
  }
117
121
  else {
118
- const quoteCurrency = __1.CurrencyAmount.fromFractionalAmount(fewTokenInToken, quote.numerator, quote.denominator);
119
- const amountCurrency = __1.CurrencyAmount.fromFractionalAmount(fewTokenOutToken, amount.numerator, amount.denominator);
122
+ const quoteCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenInCurrency, quote.numerator, quote.denominator);
123
+ const amountCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenOutCurrency, amount.numerator, amount.denominator);
120
124
  const ringFewRouteV2SDK = new few_v2_sdk_1.Route(route.pairs, quoteCurrency.currency, amountCurrency.currency);
121
125
  return {
122
126
  fewRouteV2: ringFewRouteV2SDK,
@@ -135,9 +139,16 @@ function buildTrade(tokenInCurrency, fewTokenInToken, tokenOutCurrency, fewToken
135
139
  // use native currencies if specified by the user. This is so that the Trade knows to wrap/unwrap.
136
140
  const amountCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenInCurrency, amount.numerator, amount.denominator);
137
141
  const quoteCurrency = __1.CurrencyAmount.fromFractionalAmount(tokenOutCurrency, quote.numerator, quote.denominator);
138
- // we cannot retain fake pools for mixed routes,
139
- // when we generate the ur swap calldata
140
- const routeRaw = new router_sdk_1.MixedRouteSDK(route.pools, amountCurrency.currency, quoteCurrency.currency);
142
+ // 必须保留桥接池(retainFakePools=true)!
143
+ //
144
+ // 原因:MixedRouteSDK 构造函数默认会过滤掉 tickSpacing=0 V4Pool。
145
+ // 但桥接池承载了 token 空间转换信息(如 USDC→fwUSDC),如果被过滤掉,
146
+ // token 路径会断裂:V3 输出 USDC,而下一个 FewV2 池期望 fwUSDC。
147
+ //
148
+ // 在执行阶段,Universal Router 的 addMixedSwap 会识别这些桥接池,
149
+ // 将它们转换为 WRAP_FEW_TOKEN / UNWRAP_FEW_TOKEN 等命令。
150
+ const routeRaw = new router_sdk_1.MixedRouteSDK(route.pools, amountCurrency.currency, quoteCurrency.currency, true // retainFakePools — 保留桥接池,不要过滤
151
+ );
141
152
  return {
142
153
  mixedRoute: routeRaw,
143
154
  inputAmount: amountCurrency,
@@ -157,11 +168,41 @@ function buildTrade(tokenInCurrency, fewTokenInToken, tokenOutCurrency, fewToken
157
168
  return trade;
158
169
  }
159
170
  exports.buildTrade = buildTrade;
171
+ /**
172
+ * 判断 trade 是否需要 Universal Router(而非 SwapRouter02)来编码 calldata。
173
+ *
174
+ * SwapRouter02 不支持 V4Pool 编码。当 trade 中包含任何 V4Pool 实例时
175
+ * (无论是真实 V4 池还是桥接池),都必须使用 Universal Router。
176
+ *
177
+ * 常见触发场景:mixed 路由包含 fewToken 桥接池(V4Pool, tickSpacing=0)。
178
+ */
179
+ function tradeRequiresUniversalRouter(trade) {
180
+ return trade.swaps.some((swap) => {
181
+ var _a;
182
+ if (swap.route.protocol === router_sdk_1.Protocol.V4)
183
+ return true;
184
+ if (swap.route.protocol === router_sdk_1.Protocol.MIXED) {
185
+ return (_a = swap.route.pools) === null || _a === void 0 ? void 0 : _a.some((pool) => pool instanceof v4_sdk_1.Pool);
186
+ }
187
+ return false;
188
+ });
189
+ }
160
190
  function buildSwapMethodParameters(trade, swapConfig, chainId) {
191
+ // 自动切换逻辑:SwapRouter02 无法编码 V4Pool(会抛出 UNSUPPORTED_PROTOCOL)。
192
+ // 当 trade 包含 V4Pool 实例(包括桥接池)时,自动升级到 Universal Router。
193
+ const needsUniversalRouter = tradeRequiresUniversalRouter(trade);
161
194
  if (swapConfig.type == __1.SwapType.UNIVERSAL_ROUTER) {
162
195
  return Object.assign(Object.assign({}, universal_router_sdk_1.SwapRouter.swapCallParameters(trade, swapConfig)), { to: (0, universal_router_sdk_1.UNIVERSAL_ROUTER_ADDRESS)(swapConfig.version, chainId) });
163
196
  }
164
- else if (swapConfig.type == __1.SwapType.SWAP_ROUTER_02) {
197
+ if (needsUniversalRouter) {
198
+ // 用户请求了 SwapRouter02,但 trade 含 V4Pool → 自动切换到 Universal Router
199
+ return Object.assign(Object.assign({}, universal_router_sdk_1.SwapRouter.swapCallParameters(trade, {
200
+ slippageTolerance: swapConfig.slippageTolerance,
201
+ recipient: swapConfig.recipient,
202
+ deadlineOrPreviousBlockhash: swapConfig.deadline,
203
+ })), { to: (0, universal_router_sdk_1.UNIVERSAL_ROUTER_ADDRESS)(universal_router_sdk_1.UniversalRouterVersion.V1_2, chainId) });
204
+ }
205
+ if (swapConfig.type == __1.SwapType.SWAP_ROUTER_02) {
165
206
  const { recipient, slippageTolerance, deadline, inputTokenPermit } = swapConfig;
166
207
  return Object.assign(Object.assign({}, router_sdk_1.SwapRouter.swapCallParameters(trade, {
167
208
  recipient,
@@ -173,4 +214,4 @@ function buildSwapMethodParameters(trade, swapConfig, chainId) {
173
214
  throw new Error(`Unsupported swap type ${swapConfig}`);
174
215
  }
175
216
  exports.buildSwapMethodParameters = buildSwapMethodParameters;
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kUGFyYW1ldGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsL21ldGhvZFBhcmFtZXRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBS21DO0FBQ25DLHNEQUE4RTtBQUM5RSw4RUFJNkM7QUFDN0MsMERBQXVFO0FBQ3ZFLGtEQUE0RDtBQUM1RCxrREFBNEQ7QUFDNUQsa0RBQTREO0FBQzVELG9EQUF1QjtBQUV2QiwwQkFZWTtBQUVaLFNBQWdCLFVBQVUsQ0FDeEIsZUFBeUIsRUFDekIsZUFBc0IsRUFDdEIsZ0JBQTBCLEVBQzFCLGdCQUF1QixFQUN2QixTQUFxQixFQUNyQixZQUFtQztJQUVuQyxnREFBZ0Q7SUFDaEQsTUFBTSxjQUFjLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQzdCLFlBQVksRUFDWixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxxQkFBUSxDQUFDLEVBQUUsQ0FDdEQsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUM3QixZQUFZLEVBQ1osQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUsscUJBQVEsQ0FBQyxFQUFFLENBQ3RELENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FDN0IsWUFBWSxFQUNaLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLHFCQUFRLENBQUMsRUFBRSxDQUN0RCxDQUFDO0lBQ0YsTUFBTSxxQkFBcUIsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FDcEMsWUFBWSxFQUNaLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLHFCQUFRLENBQUMsS0FBSyxDQUN6RCxDQUFDO0lBQ0YsTUFBTSxpQkFBaUIsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FDaEMs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
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kUGFyYW1ldGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsL21ldGhvZFBhcmFtZXRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBS21DO0FBQ25DLHNEQUE4RTtBQUM5RSw4RUFJNkM7QUFDN0MsMERBQXVFO0FBQ3ZFLGtEQUE0RDtBQUM1RCxrREFBNEQ7QUFDNUQsa0RBQTRFO0FBQzVFLG9EQUF1QjtBQUV2QiwwQkFZWTtBQUVaLFNBQWdCLFVBQVUsQ0FDeEIsZUFBeUIsRUFDekIsZUFBc0IsRUFDdEIsZ0JBQTBCLEVBQzFCLGdCQUF1QixFQUN2QixTQUFxQixFQUNyQixZQUFtQztJQUVuQyxvREFBb0Q7SUFDcEQsb0RBQW9EO0lBQ3BELEtBQUssZUFBZSxDQUFDO0lBQ3JCLEtBQUssZ0JBQWdCLENBQUM7SUFFdEIsZ0RBQWdEO0lBQ2hELE1BQU0sY0FBYyxHQUFHLGdCQUFDLENBQUMsTUFBTSxDQUM3QixZQUFZLEVBQ1osQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUsscUJBQVEsQ0FBQyxFQUFFLENBQ3RELENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxnQkFBQyxDQUFDLE1BQU0sQ0FDN0IsWUFBWSxFQUNaLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLHFCQUFRLENBQUMsRUFBRSxDQUN0RCxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQzdCLFlBQVksRUFDWixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxxQkFBUSxDQUFDLEVBQUUsQ0FDdEQsQ0FBQztJQUNGLE1BQU0scUJBQXFCLEdBQUcsZ0JBQUMsQ0FBQyxNQUFNLENBQ3BDLFlBQVksRUFDWixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxx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
@@ -1,3 +1,23 @@
1
1
  import { MixedRoute } from '../routers';
2
+ /**
3
+ * 判断路由是否包含「真实」V4 池(即 tickSpacing !== 0 的 V4Pool)。
4
+ *
5
+ * 注意区分:
6
+ * - 真实 V4 池:tickSpacing > 0,代表真实流动性,需要 V4 quoter 报价
7
+ * - 桥接池:tickSpacing === 0,只是 wrap/unwrap 的占位符(见 compute-all-routes.ts 的架构注释)
8
+ *
9
+ * 这个区分很重要,因为 mixed-quoter.ts 会用此函数决定是否过滤路由:
10
+ * 含真实 V4 池的路由在不支持 V4 的场景下需要被过滤,
11
+ * 但只含桥接池的路由应该被保留(桥接池不需要 V4 报价能力)。
12
+ */
13
+ export declare function mixedRouteContainsRealV4Pools(route: MixedRoute): boolean;
14
+ /**
15
+ * @deprecated 使用 mixedRouteContainsRealV4Pools 代替。
16
+ * 此函数不区分真实 V4 池和桥接池,会误过滤含桥接池的 V3↔FewV2 路由。
17
+ */
2
18
  export declare function mixedRouteContainsV4Pools(route: MixedRoute): boolean;
19
+ /**
20
+ * 过滤掉包含真实 V4 池的路由,但保留只含桥接池的路由。
21
+ * 用于 mixed-quoter 在不启用 V4 协议时筛选路由。
22
+ */
3
23
  export declare function mixedRouteFilterOutV4Pools(routes: MixedRoute[]): MixedRoute[];
@@ -1,17 +1,42 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mixedRouteFilterOutV4Pools = exports.mixedRouteContainsV4Pools = void 0;
3
+ exports.mixedRouteFilterOutV4Pools = exports.mixedRouteContainsV4Pools = exports.mixedRouteContainsRealV4Pools = void 0;
4
4
  const v4_sdk_1 = require("@ring-protocol/v4-sdk");
5
+ /**
6
+ * 判断路由是否包含「真实」V4 池(即 tickSpacing !== 0 的 V4Pool)。
7
+ *
8
+ * 注意区分:
9
+ * - 真实 V4 池:tickSpacing > 0,代表真实流动性,需要 V4 quoter 报价
10
+ * - 桥接池:tickSpacing === 0,只是 wrap/unwrap 的占位符(见 compute-all-routes.ts 的架构注释)
11
+ *
12
+ * 这个区分很重要,因为 mixed-quoter.ts 会用此函数决定是否过滤路由:
13
+ * 含真实 V4 池的路由在不支持 V4 的场景下需要被过滤,
14
+ * 但只含桥接池的路由应该被保留(桥接池不需要 V4 报价能力)。
15
+ */
16
+ function mixedRouteContainsRealV4Pools(route) {
17
+ return route.pools.some((pool) => {
18
+ return pool instanceof v4_sdk_1.Pool && pool.tickSpacing !== 0;
19
+ });
20
+ }
21
+ exports.mixedRouteContainsRealV4Pools = mixedRouteContainsRealV4Pools;
22
+ /**
23
+ * @deprecated 使用 mixedRouteContainsRealV4Pools 代替。
24
+ * 此函数不区分真实 V4 池和桥接池,会误过滤含桥接池的 V3↔FewV2 路由。
25
+ */
5
26
  function mixedRouteContainsV4Pools(route) {
6
27
  return route.pools.some((pool) => {
7
28
  return pool instanceof v4_sdk_1.Pool;
8
29
  });
9
30
  }
10
31
  exports.mixedRouteContainsV4Pools = mixedRouteContainsV4Pools;
32
+ /**
33
+ * 过滤掉包含真实 V4 池的路由,但保留只含桥接池的路由。
34
+ * 用于 mixed-quoter 在不启用 V4 协议时筛选路由。
35
+ */
11
36
  function mixedRouteFilterOutV4Pools(routes) {
12
37
  return routes.filter((route) => {
13
- return !mixedRouteContainsV4Pools(route);
38
+ return !mixedRouteContainsRealV4Pools(route);
14
39
  });
15
40
  }
16
41
  exports.mixedRouteFilterOutV4Pools = mixedRouteFilterOutV4Pools;
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4ZWRSb3V0ZUZpbHRlck91dFY0UG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbC9taXhlZFJvdXRlRmlsdGVyT3V0VjRQb29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrREFBdUQ7QUFHdkQsU0FBZ0IseUJBQXlCLENBQUMsS0FBaUI7SUFDekQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQy9CLE9BQU8sSUFBSSxZQUFZLGFBQU0sQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw4REFJQztBQUVELFNBQWdCLDBCQUEwQixDQUFDLE1BQW9CO0lBQzdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCxnRUFJQyJ9
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4ZWRSb3V0ZUZpbHRlck91dFY0UG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbC9taXhlZFJvdXRlRmlsdGVyT3V0VjRQb29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrREFBdUQ7QUFHdkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLDZCQUE2QixDQUFDLEtBQWlCO0lBQzdELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMvQixPQUFPLElBQUksWUFBWSxhQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBSkQsc0VBSUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxLQUFpQjtJQUN6RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDL0IsT0FBTyxJQUFJLFlBQVksYUFBTSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUpELDhEQUlDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsTUFBb0I7SUFDN0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUpELGdFQUlDIn0=