Contract 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 1

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0675fc040e34a55bb8018b42fe475bdebe02464257c5f95e8b2eb5563b28e8010x7c025200207169612021-10-28 21:18:242 mins ago0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.02174406
0x88eeb413f3430df1dd0f36b31a1e93564ce56c84645e770d3d3a1c5930a270a2Swap Exact Token...207169412021-10-28 21:17:443 mins ago0x5cc90e1eb5ee36625897ddf8a4c7f3f83c580583 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.004928847
0xcf89f4effa2d3983bf08bd4ad3f183e72e84d861337513da303c81ff1621ddb10x7c025200207169052021-10-28 21:16:284 mins ago0x10a323b1ced30890c8fd38466e758be827c70b7e IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.000301806
0x6b08e7e4d2b085c2d8a06f9dd282f814d1625874d7f27df321705d989555c840Swap Exact ETH F...207167002021-10-28 21:09:2611 mins ago0x4f2566da5d2e041fa600f307a31025726a841626 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad48 MATIC0.00475002
0x44debda5ba597ed6730ae5e00b3384a28e0bce549d345158e8da9a066bc5593b0x7c025200207165992021-10-28 21:05:5615 mins ago0x451a81101bb51d708e3839ec43305effcc7c9c48 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.0082371
0x14ca1db58b876d53587fe9d820d1c737ab17f45fbc0a743eb628e9cab30776c8Swap Exact Token...207165362021-10-28 21:03:4617 mins ago0xa9786da5d3abb6c404b79df28b7f402e58ef7c5b IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00693642
0x4a9bd102761258742eec58d873ec3b42a9af968739d43af494cd40d112e7ad7c0x7c025200207164972021-10-28 21:02:2818 mins ago0x4f2566da5d2e041fa600f307a31025726a841626 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.01125564
0x532234bc177632b6ae3c75880c42d0ad1ba660bb11b033fb1dad5c6e89ccaf010x7c025200207164112021-10-28 20:59:2821 mins ago0xfb6bee8ce516a5ded911168bf118c45e3f2d6fb8 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.01290375
0x6f2ebd833fae4adee5e8428879d1822635968cf360b7c1abdb42695375169d79Swap Exact Token...207163962021-10-28 20:58:5822 mins ago0xa352cb8c84c230a067761df58a1db28d688b8c9a IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00428196
0x0ed570cf418bdfbc0cb5f8cc437aad63994eb56cf66b67871c88e6662b5c5a880x7c025200207163832021-10-28 20:58:3222 mins ago0xe549db1d83df4bc24e8097bd5bd86315bc6139b9 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.52465 MATIC0.01485039
0x39e51d4733a2fe39d9fad7459bfbf938584a38df507b80274d720fc0a209c69fSwap Exact ETH F...207163772021-10-28 20:58:2022 mins ago0xe549db1d83df4bc24e8097bd5bd86315bc6139b9 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.52465 MATIC0.00670353
0xfcd554e75fe310a6779925bfae445dd6a7bd3455b2f9668210f237b0aa37e664Swap Exact Token...207163532021-10-28 20:57:3223 mins ago0xe549db1d83df4bc24e8097bd5bd86315bc6139b9 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00380214
0xbe6e338a1bb0fd5f4111b28070193077c45bbdbda0f4ec7d89bda0bd6b47538cSwap Exact ETH F...207163522021-10-28 20:57:3023 mins ago0xf482fc61cc8803a98a04df89bcb749ba20c055c8 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad41.737371831219619 MATIC0.00910749
0x151d2b6b3ac98323f4877ff89957c41e6f257e41574d2a42e7a25a4afc4f7fb1Swap Exact Token...207163452021-10-28 20:57:1223 mins ago0xe549db1d83df4bc24e8097bd5bd86315bc6139b9 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00703341
0xda58b76d873fc2f39c28949b5396eb000874504775d4809d48b57c6ed120932aSwap Exact Token...207162952021-10-28 20:55:3225 mins ago0x4f2566da5d2e041fa600f307a31025726a841626 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00955419
0x302a4f0fb6a18d8ff237f797e1ad16774da091cf97fd2df36477819d90b55b41Swap Exact Token...207162652021-10-28 20:53:4427 mins ago0x4f2566da5d2e041fa600f307a31025726a841626 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.01333356
0xd22cac247756c8ca60cd9925d544c6c16cb36ae879f0a5df2eee3775dbe6a75fRemove Liquidity207162002021-10-28 20:49:2031 mins ago0x965e398eace3bc972ed2908d79264e52fbae21ed IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.004848195
0xf4643ff5015480b6d638539f42c4103d3d294b1fa14128473c57ff28af43a98d0x7c025200207161642021-10-28 20:46:5634 mins ago0xebe0ed0ee8711c1f7ff95ddbd9b7395e9f89c029 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.031425675
0x2e76df32c1604c74a72cf193d7be4f2cdde501cd7860ce81eb15db7e8e9d6510Swap Exact Token...207161582021-10-28 20:46:3034 mins ago0xebe0ed0ee8711c1f7ff95ddbd9b7395e9f89c029 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.013078692
0x54299c184c75d7bd900e24c4e94d148150aede26d82b5d592c4515f872d49602Swap Exact Token...207161492021-10-28 20:46:1234 mins ago0xebe0ed0ee8711c1f7ff95ddbd9b7395e9f89c029 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.016219456
0x47f789e30dd9943d2791a9830c01a5874e7cc20c77d201e423241177fb30cd1fSwap Exact Token...207160822021-10-28 20:43:2837 mins ago0x96dcfb8f617ed70e9fcc78c440bdfdd30a951661 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00746118
0x195c68ba2152adfae30432186acc715d4d66c42e1a3a983dec2bbf6d03ecac1c0x7c025200207160422021-10-28 20:41:4039 mins ago0x96dcfb8f617ed70e9fcc78c440bdfdd30a951661 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.030118209
0x7cc5de5ec11b2cea1c78a889d3889acae3b2fcfc92010aa020c865ab4341abaeSwap Exact Token...207159922021-10-28 20:39:5641 mins ago0x9fd2f644032295e609897d9eeada9bc7cebbec20 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.00956931
0xe7d99182c7dfb5f16b45902a40c4ba99a2592762e66ee13b1f4da8475c5efc680x7c025200207159602021-10-28 20:38:4842 mins ago0x9fd2f644032295e609897d9eeada9bc7cebbec20 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.01711365
0xa5fcae8741718d44dde401fa49b598980a25bb431a241102871941b5e1db1fd70x7c025200207159502021-10-28 20:38:2842 mins ago0x9fd2f644032295e609897d9eeada9bc7cebbec20 IN  0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40 MATIC0.02003886
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x88eeb413f3430df1dd0f36b31a1e93564ce56c84645e770d3d3a1c5930a270a2207169412021-10-28 21:17:443 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40x5cc90e1eb5ee36625897ddf8a4c7f3f83c580583194.191488730311535101 MATIC
0x88eeb413f3430df1dd0f36b31a1e93564ce56c84645e770d3d3a1c5930a270a2207169412021-10-28 21:17:443 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4194.191488730311535101 MATIC
0x6b08e7e4d2b085c2d8a06f9dd282f814d1625874d7f27df321705d989555c840207167002021-10-28 21:09:2611 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 Polygon: WMATIC Token8 MATIC
0x0ed570cf418bdfbc0cb5f8cc437aad63994eb56cf66b67871c88e6662b5c5a88207163832021-10-28 20:58:3222 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 0x3f9c1729e0d478b37bf377e2ada1de09fb8e3e2e0.52465 MATIC
0x39e51d4733a2fe39d9fad7459bfbf938584a38df507b80274d720fc0a209c69f207163772021-10-28 20:58:2022 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 Polygon: WMATIC Token0.52465 MATIC
0xfcd554e75fe310a6779925bfae445dd6a7bd3455b2f9668210f237b0aa37e664207163532021-10-28 20:57:3223 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40xe549db1d83df4bc24e8097bd5bd86315bc6139b90.50119453993211523 MATIC
0xfcd554e75fe310a6779925bfae445dd6a7bd3455b2f9668210f237b0aa37e664207163532021-10-28 20:57:3223 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.50119453993211523 MATIC
0xbe6e338a1bb0fd5f4111b28070193077c45bbdbda0f4ec7d89bda0bd6b47538c207163522021-10-28 20:57:3023 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 Polygon: WMATIC Token1.737371831219619697 MATIC
0x151d2b6b3ac98323f4877ff89957c41e6f257e41574d2a42e7a25a4afc4f7fb1207163452021-10-28 20:57:1223 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40xe549db1d83df4bc24e8097bd5bd86315bc6139b90.612278089822032823 MATIC
0x151d2b6b3ac98323f4877ff89957c41e6f257e41574d2a42e7a25a4afc4f7fb1207163452021-10-28 20:57:1223 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.612278089822032823 MATIC
0x9c7512e553f6c3c88e231607e91c88db7611f492f29dd032a30d897492749b9f207158942021-10-28 20:36:3244 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40xc44f17db2a9999550d0ef3bb008ef9b5cdfd57b90.925627861790238746 MATIC
0x9c7512e553f6c3c88e231607e91c88db7611f492f29dd032a30d897492749b9f207158942021-10-28 20:36:3244 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.925627861790238746 MATIC
0x06a1e12254472aaf5d51908bd72fa1be6d2a4ce087f5d94d692a3603d58677cc207158842021-10-28 20:36:1244 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40xc44f17db2a9999550d0ef3bb008ef9b5cdfd57b90.491614327065015164 MATIC
0x06a1e12254472aaf5d51908bd72fa1be6d2a4ce087f5d94d692a3603d58677cc207158842021-10-28 20:36:1244 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40.491614327065015164 MATIC
0x95a2054fe4b4ea8e52d8734acd0792312b9b484cb9792f83eb11b119069ff319207156212021-10-28 20:24:1057 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40xc9e32b27ad8af74dd14dad36566fc6fa1bf8348d5.559198480428204627 MATIC
0x95a2054fe4b4ea8e52d8734acd0792312b9b484cb9792f83eb11b119069ff319207156212021-10-28 20:24:1057 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad45.559198480428204627 MATIC
0x75ed99888d16e8f190d0b5c682a2b40ad099c8ef51d85b5352e5329ba6cb13f2207152542021-10-28 20:10:161 hr 10 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40x6e4a483e592fa2f317118e72dab58b208c747fae8.568389086126841943 MATIC
0x75ed99888d16e8f190d0b5c682a2b40ad099c8ef51d85b5352e5329ba6cb13f2207152542021-10-28 20:10:161 hr 10 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad48.568389086126841943 MATIC
0x5666bf42d1bb5054b462226b6b4e1c15b4d9f794e22c28be9d6ef89aec7a0cff207146582021-10-28 19:47:391 hr 33 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40x2772cb74eed8a28936af4689dd111cffb2fe424f33.991052744381511252 MATIC
0x5666bf42d1bb5054b462226b6b4e1c15b4d9f794e22c28be9d6ef89aec7a0cff207146582021-10-28 19:47:391 hr 33 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad433.991052744381511252 MATIC
0x0f9659242dfae93d19f5974b4776dbc808e69c721bc12a172f15daac1a7769f1207144302021-10-28 19:39:181 hr 41 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40x7d4326b581615643d70a68f2d2ba0cfdf381c81f25.413604473408658063 MATIC
0x0f9659242dfae93d19f5974b4776dbc808e69c721bc12a172f15daac1a7769f1207144302021-10-28 19:39:181 hr 41 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad425.413604473408658063 MATIC
0xa01ff22fda936f078fd5ceb15455e9afbbce086454fed5649373df29a5fe300b207144132021-10-28 19:38:441 hr 42 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad4 Polygon: WMATIC Token2 MATIC
0xa8670f91f2c0caae6839577b1b8d6ccb17d4e73cdf161f5c8f9c9858995b0d3e207144022021-10-28 19:38:221 hr 42 mins ago 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad40x7d4326b581615643d70a68f2d2ba0cfdf381c81f23.808944457703824712 MATIC
0xa8670f91f2c0caae6839577b1b8d6ccb17d4e73cdf161f5c8f9c9858995b0d3e207144022021-10-28 19:38:221 hr 42 mins ago Polygon: WMATIC Token 0xb31d1b1ea48ce4bf10ed697d44b747287e785ad423.808944457703824712 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FireBirdRouter

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-08-31
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6;
pragma abicoder v2;

interface IFireBirdFactory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint256);

  function feeTo() external view returns (address);

  function formula() external view returns (address);

  function protocolFee() external view returns (uint256);

  function feeToSetter() external view returns (address);

  function getPair(
    address tokenA,
    address tokenB,
    uint32 tokenWeightA,
    uint32 swapFee
  ) external view returns (address pair);

  function allPairs(uint256) external view returns (address pair);

  function isPair(address) external view returns (bool);

  function allPairsLength() external view returns (uint256);

  function createPair(
    address tokenA,
    address tokenB,
    uint32 tokenWeightA,
    uint32 swapFee
  ) external returns (address pair);

  function getWeightsAndSwapFee(address pair)
    external
    view
    returns (
      uint32 tokenWeight0,
      uint32 tokenWeight1,
      uint32 swapFee
    );

  function setFeeTo(address) external;

  function setFeeToSetter(address) external;

  function setProtocolFee(uint256) external;
}

/*
    Bancor Formula interface
*/
interface IFireBirdFormula {
  function getFactoryReserveAndWeights(
    address factory,
    address pair,
    address tokenA,
    uint8 dexId
  )
    external
    view
    returns (
      address tokenB,
      uint256 reserveA,
      uint256 reserveB,
      uint32 tokenWeightA,
      uint32 tokenWeightB,
      uint32 swapFee
    );

  function getFactoryWeightsAndSwapFee(
    address factory,
    address pair,
    uint8 dexId
  )
    external
    view
    returns (
      uint32 tokenWeight0,
      uint32 tokenWeight1,
      uint32 swapFee
    );

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut,
    uint32 tokenWeightIn,
    uint32 tokenWeightOut,
    uint32 swapFee
  ) external view returns (uint256 amountIn);

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut,
    uint32 tokenWeightIn,
    uint32 tokenWeightOut,
    uint32 swapFee
  ) external view returns (uint256 amountOut);

  function getFactoryAmountsIn(
    address factory,
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds
  ) external view returns (uint256[] memory amounts);

  function getFactoryAmountsOut(
    address factory,
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    address[] calldata path,
    uint8[] calldata dexIds
  ) external view returns (uint256[] memory amounts);

  function ensureConstantValue(
    uint256 reserve0,
    uint256 reserve1,
    uint256 balance0Adjusted,
    uint256 balance1Adjusted,
    uint32 tokenWeight0
  ) external view returns (bool);

  function getReserves(
    address pair,
    address tokenA,
    address tokenB
  ) external view returns (uint256 reserveA, uint256 reserveB);

  function getOtherToken(address pair, address tokenA) external view returns (address tokenB);

  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure returns (uint256 amountB);

  function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

  function mintLiquidityFee(
    uint256 totalLiquidity,
    uint112 reserve0,
    uint112 reserve1,
    uint32 tokenWeight0,
    uint32 tokenWeight1,
    uint112 collectedFee0,
    uint112 collectedFee1
  ) external view returns (uint256 amount);
}

interface IFireBirdPair {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external pure returns (uint8);

  function totalSupply() external view returns (uint256);

  function balanceOf(address owner) external view returns (uint256);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 value) external returns (bool);

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);

  function PERMIT_TYPEHASH() external pure returns (bytes32);

  function nonces(address owner) external view returns (uint256);

  function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1);
  event Mint(address indexed sender, uint256 amount0, uint256 amount1);
  event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
  event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to);
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint256);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (
      uint112 reserve0,
      uint112 reserve1,
      uint32 blockTimestampLast
    );

  function getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1);

  function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1);

  function getSwapFee() external view returns (uint32);

  function price0CumulativeLast() external view returns (uint256);

  function price1CumulativeLast() external view returns (uint256);

  function mint(address to) external returns (uint256 liquidity);

  function burn(address to) external returns (uint256 amount0, uint256 amount1);

  function swap(
    uint256 amount0Out,
    uint256 amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(
    address,
    address,
    uint32,
    uint32
  ) external;
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeApprove(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");
  }

  function safeTransfer(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED");
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
  }

  function safeTransferETH(address to, uint256 value) internal {
    (bool success, ) = to.call{value: value}(new bytes(0));
    require(success, "TransferHelper: ETH_TRANSFER_FAILED");
  }
}

interface IERC20 {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external view returns (uint8);

  function totalSupply() external view returns (uint256);

  function balanceOf(address owner) external view returns (uint256);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 value) external returns (bool);

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);
}

interface IFireBirdRouter {
  event Exchange(address pair, uint256 amountOut, address output);

  function factory() external view returns (address);

  function formula() external view returns (address);

  function WETH() external view returns (address);

  function swapFeeReward() external view returns (address);

  function addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    );

  function addLiquidityETH(
    address pair,
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    );

  function swapExactTokensForTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    address tokenIn,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapETHForExactTokens(
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external;

  function createPair(
    address tokenA,
    address tokenB,
    uint256 amountA,
    uint256 amountB,
    uint32 tokenWeightA,
    uint32 swapFee,
    address to
  ) external returns (uint256 liquidity);

  function createPairETH(
    address token,
    uint256 amountToken,
    uint32 tokenWeight,
    uint32 swapFee,
    address to
  ) external payable returns (uint256 liquidity);

  function removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETHWithPermit(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountETH);
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
  function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x + y) >= x, "ds-math-add-overflow");
  }

  function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x - y) <= x, "ds-math-sub-underflow");
  }

  function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
    require(b > 0, "ds-math-division-by-zero");
    c = a / b;
  }
}

interface IWETH {
  function deposit() external payable;

  function transfer(address to, uint256 value) external returns (bool);

  function withdraw(uint256) external;

  function balanceOf(address account) external view returns (uint256);
}

interface IAggregationExecutor {
  function callBytes(bytes calldata data, address srcSpender) external payable; // 0xd9c45357
}

interface ISwapFeeReward {
  function swap(
    address account,
    address input,
    address output,
    uint256 amount,
    address pair
  ) external returns (bool);
}

interface IERC20Permit {
  function permit(
    address owner,
    address spender,
    uint256 amount,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;
}

library RevertReasonParser {
  function parse(bytes memory data, string memory prefix) internal pure returns (string memory) {
    // https://solidity.readthedocs.io/en/latest/control-structures.html#revert
    // We assume that revert reason is abi-encoded as Error(string)

    // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length
    if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") {
      string memory reason;
      // solhint-disable no-inline-assembly
      assembly {
        // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset
        reason := add(data, 68)
      }
      /*
                revert reason is padded up to 32 bytes with ABI encoder: Error(string)
                also sometimes there is extra 32 bytes of zeros padded in the end:
                https://github.com/ethereum/solidity/issues/10170
                because of that we can't check for equality and instead check
                that string length + extra 68 bytes is less than overall data length
            */
      require(data.length >= 68 + bytes(reason).length, "Invalid revert reason");
      return string(abi.encodePacked(prefix, "Error(", reason, ")"));
    }
    // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer
    else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") {
      uint256 code;
      // solhint-disable no-inline-assembly
      assembly {
        // 36 = 32 bytes data length + 4-byte selector
        code := mload(add(data, 36))
      }
      return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")"));
    }

    return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")"));
  }

  function _toHex(uint256 value) private pure returns (string memory) {
    return _toHex(abi.encodePacked(value));
  }

  function _toHex(bytes memory data) private pure returns (string memory) {
    bytes16 alphabet = 0x30313233343536373839616263646566;
    bytes memory str = new bytes(2 + data.length * 2);
    str[0] = "0";
    str[1] = "x";
    for (uint256 i = 0; i < data.length; i++) {
      str[2 * i + 2] = alphabet[uint8(data[i] >> 4)];
      str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)];
    }
    return string(str);
  }
}

contract Permitable {
  event Error(string reason);

  function _permit(
    IERC20 token,
    uint256 amount,
    bytes calldata permit
  ) internal {
    if (permit.length == 32 * 7) {
      // solhint-disable-next-line avoid-low-level-calls
      (bool success, bytes memory result) = address(token).call(abi.encodePacked(IERC20Permit.permit.selector, permit));
      if (!success) {
        string memory reason = RevertReasonParser.parse(result, "Permit call failed: ");
        if (token.allowance(msg.sender, address(this)) < amount) {
          revert(reason);
        } else {
          emit Error(reason);
        }
      }
    }
  }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return msg.sender;
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
  address private _owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() internal {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view virtual returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(owner() == _msgSender(), "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

contract FireBirdRouter is IFireBirdRouter, Ownable, Permitable {
  using SafeMath for uint256;
  address public immutable override factory;
  address public immutable override formula;
  address public immutable override WETH;
  address public override swapFeeReward;
  address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

  uint256 private constant _PARTIAL_FILL = 0x01;
  uint256 private constant _REQUIRES_EXTRA_ETH = 0x02;
  uint256 private constant _SHOULD_CLAIM = 0x04;
  uint256 private constant _BURN_FROM_MSG_SENDER = 0x08;
  uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10;

  struct SwapDescription {
    IERC20 srcToken;
    IERC20 dstToken;
    address srcReceiver;
    address dstReceiver;
    uint256 amount;
    uint256 minReturnAmount;
    uint256 flags;
    bytes permit;
  }

  event Swapped(address sender, IERC20 srcToken, IERC20 dstToken, address dstReceiver, uint256 spentAmount, uint256 returnAmount);

  modifier ensure(uint256 deadline) {
    require(deadline >= block.timestamp, "Router: EXPIRED");
    _;
  }

  constructor(
    address _factory,
    address _formula,
    address _WETH
  ) public {
    factory = _factory;
    formula = _formula;
    WETH = _WETH;
  }

  receive() external payable {
    assert(msg.sender == WETH);
    // only accept ETH via fallback from the WETH contract
  }

  function setSwapFeeReward(address _swapFeeReward) public onlyOwner {
    swapFeeReward = _swapFeeReward;
  }

  // **** ADD LIQUIDITY ****
  function _addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal virtual returns (uint256 amountA, uint256 amountB) {
    (uint256 reserveA, uint256 reserveB) = IFireBirdFormula(formula).getReserves(pair, tokenA, tokenB);
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
    } else {
      uint256 amountBOptimal = IFireBirdFormula(formula).quote(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        require(amountBOptimal >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT");
        (amountA, amountB) = (amountADesired, amountBOptimal);
      } else {
        uint256 amountAOptimal = IFireBirdFormula(formula).quote(amountBDesired, reserveB, reserveA);
        assert(amountAOptimal <= amountADesired);
        require(amountAOptimal >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT");
        (amountA, amountB) = (amountAOptimal, amountBDesired);
      }
    }
  }

  function _addLiquidityToken(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal returns (uint256 amountA, uint256 amountB) {
    (amountA, amountB) = _addLiquidity(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
    TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
  }

  function createPair(
    address tokenA,
    address tokenB,
    uint256 amountA,
    uint256 amountB,
    uint32 tokenWeightA,
    uint32 swapFee,
    address to
  ) public virtual override returns (uint256 liquidity) {
    address pair = IFireBirdFactory(factory).createPair(tokenA, tokenB, tokenWeightA, swapFee);
    _addLiquidityToken(pair, tokenA, tokenB, amountA, amountB, 0, 0);
    liquidity = IFireBirdPair(pair).mint(to);
  }

  function addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    )
  {
    (amountA, amountB) = _addLiquidityToken(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    liquidity = IFireBirdPair(pair).mint(to);
  }

  function _addLiquidityETH(
    address pair,
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to
  )
    internal
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH) = _addLiquidity(pair, token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);
    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
    transferETHTo(amountETH, pair);
    liquidity = IFireBirdPair(pair).mint(to);
    // refund dust eth, if any
    if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
  }

  function createPairETH(
    address token,
    uint256 amountToken,
    uint32 tokenWeight,
    uint32 swapFee,
    address to
  ) public payable virtual override returns (uint256 liquidity) {
    address pair = IFireBirdFactory(factory).createPair(token, WETH, tokenWeight, swapFee);
    (, , liquidity) = _addLiquidityETH(pair, token, amountToken, 0, 0, to);
  }

  function addLiquidityETH(
    address pair,
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    public
    payable
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH, liquidity) = _addLiquidityETH(pair, token, amountTokenDesired, amountTokenMin, amountETHMin, to);
  }

  // **** SWAP ****
  // requires the initial amount to have already been sent to the first pair
  function _swap(
    address tokenIn,
    uint256[] memory amounts,
    address[] memory path,
    address _to
  ) internal virtual {
    address input = tokenIn;
    for (uint256 i = 0; i < path.length; i++) {
      IFireBirdPair pairV2 = IFireBirdPair(path[i]);
      address token0 = pairV2.token0();
      uint256 amountOut = amounts[i + 1];
      (uint256 amount0Out, uint256 amount1Out, address output) = input == token0 ? (uint256(0), amountOut, pairV2.token1()) : (amountOut, uint256(0), token0);
      if (swapFeeReward != address(0)) {
        ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOut, path[i]);
      }
      address to = i < path.length - 1 ? path[i + 1] : _to;
      pairV2.swap(amount0Out, amount1Out, to, new bytes(0));
      emit Exchange(address(pairV2), amountOut, output);
      input = output;
    }
  }

  function swapExactTokensForTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    uint8[] memory dexIds,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(tokenIn, tokenOut, amountIn, amountOutMin, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, to);
  }

  function swapTokensForExactTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(tokenIn, tokenOut, amountOut, amountInMax, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, to);
  }

  function swapExactETHForTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(WETH, tokenOut, msg.value, amountOutMin, path, dexIds);

    transferETHTo(amounts[0], path[0]);
    _swap(WETH, amounts, path, to);
  }

  function swapTokensForExactETH(
    address tokenIn,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(tokenIn, WETH, amountOut, amountInMax, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, address(this));
    transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
  }

  function swapExactTokensForETH(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(tokenIn, WETH, amountIn, amountOutMin, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, address(this));
    transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
  }

  function swapETHForExactTokens(
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(WETH, tokenOut, amountOut, msg.value, path, dexIds);

    transferETHTo(amounts[0], path[0]);
    _swap(WETH, amounts, path, to);
    // refund dust eth, if any
    if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
  }

  // **** SWAP (supporting fee-on-transfer tokens) ****
  // requires the initial amount to have already been sent to the first pair
  function _swapSupportingFeeOnTransferTokens(
    address tokenIn,
    address[] memory path,
    uint8[] memory dexIds,
    address _to
  ) internal virtual {
    for (uint256 i; i < path.length; i++) {
      uint256 amountOutput;
      address currentOutput;
      {
        (address output, uint256 reserveInput, uint256 reserveOutput, uint32 tokenWeightInput, , uint32 swapFee) =
          IFireBirdFormula(formula).getFactoryReserveAndWeights(factory, path[i], tokenIn, dexIds[i]);
        uint256 amountInput = IERC20(tokenIn).balanceOf(path[i]).sub(reserveInput);
        amountOutput = IFireBirdFormula(formula).getAmountOut(amountInput, reserveInput, reserveOutput, tokenWeightInput, 100 - tokenWeightInput, swapFee);
        currentOutput = output;
      }

      IFireBirdPair pair = IFireBirdPair(path[i]);
      (uint256 amount0Out, uint256 amount1Out) = tokenIn == pair.token0() ? (uint256(0), amountOutput) : (amountOutput, uint256(0));
      if (swapFeeReward != address(0)) {
        ISwapFeeReward(swapFeeReward).swap(msg.sender, tokenIn, currentOutput, amountOutput, path[i]);
      }
      address to = i < path.length - 1 ? path[i + 1] : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
      emit Exchange(path[i], amountOutput, currentOutput);
      tokenIn = currentOutput;
    }
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn);
    uint256 balanceBefore = IERC20(tokenOut).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, to);
    require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) {
    //            require(path[0] == WETH, 'Router: INVALID_PATH');
    uint256 amountIn = msg.value;
    transferETHTo(amountIn, path[0]);
    uint256 balanceBefore = IERC20(tokenOut).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(WETH, path, dexIds, to);
    require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn);
    _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, address(this));
    uint256 amountOut = IERC20(WETH).balanceOf(address(this));
    require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
    transferAll(ETH_ADDRESS, to, amountOut);
  }

  function swap(
    IAggregationExecutor caller,
    SwapDescription calldata desc,
    bytes calldata data
  ) external payable returns (uint256 returnAmount, uint256 gasLeft) {
    require(desc.minReturnAmount > 0, "Min return should not be 0");
    require(data.length > 0, "data should be not zero");

    uint256 flags = desc.flags;
    uint256 amount = desc.amount;
    IERC20 srcToken = desc.srcToken;
    IERC20 dstToken = desc.dstToken;

    if (flags & _REQUIRES_EXTRA_ETH != 0) {
      require(msg.value > (isETH(srcToken) ? amount : 0), "Invalid msg.value");
    } else {
      require(msg.value == (isETH(srcToken) ? amount : 0), "Invalid msg.value");
    }

    if (flags & _SHOULD_CLAIM != 0) {
      require(!isETH(srcToken), "Claim token is ETH");
      _permit(srcToken, amount, desc.permit);
      TransferHelper.safeTransferFrom(address(srcToken), msg.sender, desc.srcReceiver, amount);
    }

    address dstReceiver = (desc.dstReceiver == address(0)) ? msg.sender : desc.dstReceiver;
    uint256 initialSrcBalance = (flags & _PARTIAL_FILL != 0) ? getBalance(srcToken, msg.sender) : 0;
    uint256 initialDstBalance = getBalance(dstToken, dstReceiver);

    {
      // solhint-disable-next-line avoid-low-level-calls
      (bool success, bytes memory result) = address(caller).call{value: msg.value}(abi.encodeWithSelector(caller.callBytes.selector, data, msg.sender));
      if (!success) {
        revert(RevertReasonParser.parse(result, "callBytes failed: "));
      }
    }

    uint256 spentAmount = amount;
    returnAmount = getBalance(dstToken, dstReceiver).sub(initialDstBalance);

    if (flags & _PARTIAL_FILL != 0) {
      spentAmount = initialSrcBalance.add(amount).sub(getBalance(srcToken, msg.sender));
      require(returnAmount.mul(amount) >= desc.minReturnAmount.mul(spentAmount), "Return amount is not enough");
    } else {
      require(returnAmount >= desc.minReturnAmount, "Return amount is not enough");
    }

    emit Swapped(msg.sender, srcToken, dstToken, dstReceiver, spentAmount, returnAmount);
    emit Exchange(address(caller), returnAmount, isETH(dstToken) ? WETH : address(dstToken));

    gasLeft = gasleft();
  }

  function getBalance(IERC20 token, address account) internal view returns (uint256) {
    if (isETH(token)) {
      return account.balance;
    } else {
      return token.balanceOf(account);
    }
  }

  function _validateAmountOut(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    uint8[] memory dexIds
  ) internal view returns (uint256[] memory amounts) {
    amounts = IFireBirdFormula(formula).getFactoryAmountsOut(factory, tokenIn, tokenOut, amountIn, path, dexIds);
    require(amounts[amounts.length - 1] >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function _validateAmountIn(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds
  ) internal view returns (uint256[] memory amounts) {
    amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, tokenIn, tokenOut, amountOut, path, dexIds);
    require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
  }

  function transferETHTo(uint256 amount, address to) internal {
    IWETH(WETH).deposit{value: amount}();
    assert(IWETH(WETH).transfer(to, amount));
  }

  function transferAll(
    address token,
    address to,
    uint256 amount
  ) internal returns (bool) {
    if (amount == 0) {
      return true;
    }

    if (isETH(IERC20(token))) {
      IWETH(WETH).withdraw(amount);
      TransferHelper.safeTransferETH(to, amount);
    } else {
      TransferHelper.safeTransfer(token, to, amount);
    }
    return true;
  }

  function isETH(IERC20 token) internal pure returns (bool) {
    return (address(token) == ETH_ADDRESS);
  }

  // **** REMOVE LIQUIDITY ****
  function _removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to
  ) internal returns (uint256 amountA, uint256 amountB) {
    require(IFireBirdFactory(factory).isPair(pair), "Router: Invalid pair");
    IFireBirdPair(pair).transferFrom(msg.sender, pair, liquidity);
    // send liquidity to pair
    (uint256 amount0, uint256 amount1) = IFireBirdPair(pair).burn(to);
    (address token0, ) = IFireBirdFormula(formula).sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT");
    require(amountB >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT");
  }

  function removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
  }

  function removeLiquidityETH(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
    (amountToken, amountETH) = _removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this));
    TransferHelper.safeTransfer(token, to, amountToken);
    transferAll(ETH_ADDRESS, to, amountETH);
  }

  function removeLiquidityWithPermit(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    {
      uint256 value = approveMax ? uint256(-1) : liquidity;
      IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    }
    (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
  }

  function removeLiquidityETHWithPermit(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
    uint256 value = approveMax ? uint256(-1) : liquidity;
    IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountToken, amountETH) = removeLiquidityETH(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline);
  }

  // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountETH) {
    (, amountETH) = removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
    TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
    transferAll(ETH_ADDRESS, to, amountETH);
  }

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountETH) {
    uint256 value = approveMax ? uint256(-1) : liquidity;
    IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline);
  }

  function rescueFunds(address token, uint256 amount) external onlyOwner {
    if (isETH(IERC20(token))) {
      TransferHelper.safeTransferETH(msg.sender, amount);
    } else {
      TransferHelper.safeTransfer(token, msg.sender, amount);
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_formula","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Error","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"output","type":"address"}],"name":"Exchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"srcToken","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"dstToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPair","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint32","name":"tokenWeight","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPairETH","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formula","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeeReward","type":"address"}],"name":"setSwapFeeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct FireBirdRouter.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasLeft","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFeeReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162006097380380620060978339810160408190526200003491620000d3565b600062000040620000b2565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606093841b811660805291831b821660a05290911b1660c0526200011c565b3390565b80516001600160a01b0381168114620000ce57600080fd5b919050565b600080600060608486031215620000e8578283fd5b620000f384620000b6565b92506200010360208501620000b6565b91506200011360408501620000b6565b90509250925092565b60805160601c60a05160601c60c05160601c615eaa620001ed600039806101e352806107725280610a395280610b6d5280610e1052806115c252806116f852806117c1528061192352806119885280611a695280611edb528061202552806120675280612ab35280612b4b52806134e3528061359c5250806108c4528061255452806126a85280612e7452806130245280614003528061417452806142805280614397525080610b305280611ad05280611af752806125905280612c59528061305152806140305250615eaa6000f3fe6080604052600436106101c65760003560e01c8063991bffc7116100f7578063d0f2c82a11610095578063f0c62e2b11610064578063f0c62e2b146104fb578063f2fde38b1461050e578063fbbeedf11461052e578063fbf451351461054e5761020c565b8063d0f2c82a1461047b578063dc9f70291461049b578063e1f4a784146104bb578063ebb5d2e9146104db5761020c565b8063ad5c4648116100d1578063ad5c464814610411578063af7e6aec14610426578063b56b681d14610446578063c45a0155146104665761020c565b8063991bffc7146103c9578063a3ddb30b146103dc578063a4aabb08146103f15761020c565b8063715018a6116101645780637a286fa21161013e5780637a286fa2146103615780637c0252001461038157806389df37af146103945780638da5cb5b146103b45761020c565b8063715018a614610319578063752ebb7c1461032e57806378e3214f146103415761020c565b80634b75f54f116101a05780634b75f54f146102895780634c17fd7c146102ab578063674f19f8146102d95780636cb49428146103065761020c565b80630e2f024c14610211578063242e3b9f146102475780633990ba54146102675761020c565b3661020c573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461020a57fe5b005b600080fd5b34801561021d57600080fd5b5061023161022c366004614c3f565b61056e565b60405161023e9190615381565b60405180910390f35b34801561025357600080fd5b5061020a610262366004614e3c565b610651565b61027a610275366004614bce565b610860565b60405161023e93929190615d14565b34801561029557600080fd5b5061029e6108c2565b60405161023e919061538a565b3480156102b757600080fd5b506102cb6102c63660046148a7565b6108e6565b60405161023e929190615ccb565b3480156102e557600080fd5b506102f96102f4366004614e3c565b6109f6565b60405161023e9190615726565b610231610314366004614f5e565b610b2b565b34801561032557600080fd5b5061020a610c1d565b61020a61033c366004614d96565b610cff565b34801561034d57600080fd5b5061020a61035c366004614d6b565b610f74565b34801561036d57600080fd5b506102f961037c3660046149f0565b611013565b6102cb61038f366004615071565b6110c3565b3480156103a057600080fd5b506102f96103af366004614ab3565b61160d565b3480156103c057600080fd5b5061029e61169a565b6102f96103d7366004614d96565b6116b6565b3480156103e857600080fd5b5061029e61181c565b3480156103fd57600080fd5b506102cb61040c366004614c3f565b611838565b34801561041d57600080fd5b5061029e611921565b34801561043257600080fd5b506102f9610441366004614e3c565b611945565b34801561045257600080fd5b506102cb610461366004614bce565b611a24565b34801561047257600080fd5b5061029e611ace565b34801561048757600080fd5b50610231610496366004614ce8565b611af2565b3480156104a757600080fd5b5061020a6104b63660046149f0565b611c5e565b3480156104c757600080fd5b506102cb6104d6366004614823565b611e38565b3480156104e757600080fd5b506102316104f6366004614bce565b611e97565b6102f9610509366004614d96565b611fe3565b34801561051a57600080fd5b5061020a6105293660046147b2565b6120fe565b34801561053a57600080fd5b5061020a6105493660046147b2565b61224b565b34801561055a57600080fd5b5061027a610569366004614962565b612305565b6000808561057c578a61059e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8e169063d505accf906105ff903390309086908d908c908c908c906004016153d2565b600060405180830381600087803b15801561061957600080fd5b505af115801561062d573d6000803e3d6000fd5b505050506106408d8d8d8d8d8d8d611e97565b9d9c50505050505050505050505050565b8042811015610695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b60405180910390fd5b6106c28a33898960008181106106a757fe5b90506020020160208101906106bc91906147b2565b8c61240f565b6107328a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525030925061253b915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906107a790309060040161538a565b60206040518083038186803b1580156107bf57600080fd5b505afa1580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190615117565b905088811015610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b7d565b61085273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8583612a59565b505050505050505050505050565b600080600083428110156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6108ae8b8b8b8b8b8b612b3f565b919d909c50909a5098505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808642811015610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b600087610931578c610953565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508f73ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b815260040161099a97969594939291906153d2565b600060405180830381600087803b1580156109b457600080fd5b505af11580156109c8573d6000803e3d6000fd5b50505050506109dc8f8f8f8f8f8f8f612c54565b8093508194505050509c509c9a5050505050505050505050565b60608142811015610a33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b610a638b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c8c8c612fe4565b9150610aa68b338a8a6000818110610a7757fe5b9050602002016020810190610a8c91906147b2565b85600081518110610a9957fe5b602002602001015161240f565b610ae68b838a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613155915050565b610b1c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8584600186510381518110610b0f57fe5b6020026020010151612a59565b50509998505050505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb887f000000000000000000000000000000000000000000000000000000000000000088886040518563ffffffff1660e01b8152600401610bad9493929190615692565b602060405180830381600087803b158015610bc757600080fd5b505af1158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906147ce565b9050610c1081888860008088612b3f565b9998505050505050505050565b610c256134dd565b73ffffffffffffffffffffffffffffffffffffffff16610c4361169a565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615aa3565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b8042811015610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b34610d64818989600081610d4a57fe5b9050602002016020810190610d5f91906147b2565b6134e1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190610db990889060040161538a565b60206040518083038186803b158015610dd157600080fd5b505afa158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e099190615117565b9050610e9b7f00000000000000000000000000000000000000000000000000000000000000008a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b925061253b915050565b89610f2f828d73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401610ed9919061538a565b60206040518083038186803b158015610ef157600080fd5b505afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190615117565b9061362e565b1015610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b7d565b5050505050505050505050565b610f7c6134dd565b73ffffffffffffffffffffffffffffffffffffffff16610f9a61169a565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615aa3565b610ff082613671565b1561100457610fff33826136a4565b61100f565b61100f82338361375d565b5050565b60608142811015611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6110608c8c8c8c8c8c8c8c612fe4565b91506110748c338a8a6000818110610a7757fe5b6110b48c838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613155915050565b509a9950505050505050505050565b60008060008560a0013511611104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a6c565b8261113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b0f565b60c08501356080860135600061115460208901896147b2565b9050600061116860408a0160208b016147b2565b905060028416156111c65761117c82613671565b611187576000611189565b825b34116111c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159c7565b611214565b6111cf82613671565b6111da5760006111dc565b825b3414611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159c7565b600484161561128f5761122682613671565b1561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615857565b611274828461126f60e08d018d615d5e565b61387f565b61128f823361128960608d0160408e016147b2565b8661240f565b6000806112a260808c0160608d016147b2565b73ffffffffffffffffffffffffffffffffffffffff16146112d2576112cd60808b0160608c016147b2565b6112d4565b335b90506000600186166112e75760006112f1565b6112f18433613a8c565b905060006112ff8484613a8c565b90506000808e73ffffffffffffffffffffffffffffffffffffffff1634635697e45360e01b8f8f336040516024016113399392919061576a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516113c29190615215565b60006040518083038185875af1925050503d80600081146113ff576040519150601f19603f3d011682016040523d82523d6000602084013e611404565b606091505b5091509150816114805761144d816040518060400160405280601281526020017f63616c6c4279746573206661696c65643a200000000000000000000000000000815250613b63565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c91906157d6565b5086905061149282610f298787613a8c565b9950600188161561150b576114b46114aa8733613a8c565b610f29858a613f35565b90506114c460a08e013582613f72565b6114ce8b89613f72565b1015611506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a35565b611549565b8c60a001358a1015611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a35565b7fd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f833878787858f6040516115829695949392919061548e565b60405180910390a17fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488e8b6115b688613671565b6115c057876115e2565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516115f1939291906156f6565b60405180910390a15a9850505050505050505094509492505050565b6060814281101561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6116588a8a8a8a8a8a613fc3565b91506116818a338860008151811061166c57fe5b602002602001015185600081518110610a9957fe5b61168d8a838887613155565b5098975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b606081428110156116f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6117957f00000000000000000000000000000000000000000000000000000000000000008b348c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fc392505050565b91506117bc826000815181106117a757fe5b602002602001015189896000818110610d4a57fe5b61168d7f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613155915050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b600080600086611848578b61186a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8f169063d505accf906118cb903390309086908e908d908d908d906004016153d2565b600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b5050505061190c8e8e8e8e8e8e8e611a24565b909f909e509c50505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608142811015611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b610a638b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fc392505050565b6000808242811015611a62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b611a918a8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b30612c54565b9093509150611aa189868561375d565b611ac073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8684612a59565b505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb8a8a88886040518563ffffffff1660e01b8152600401611b549493929190615692565b602060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba691906147ce565b9050611bb8818a8a8a8a600080614131565b50506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290611c0c90869060040161538a565b602060405180830381600087803b158015611c2657600080fd5b505af1158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190615117565b8042811015611c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b611cab8b33898960008181106106a757fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190611d0090879060040161538a565b60206040518083038186803b158015611d1857600080fd5b505afa158015611d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d509190615117565b9050611dc28c89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a925061253b915050565b88611e00828d73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401610ed9919061538a565b1015610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b7d565b6000808242811015611e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b611e858b8b8b8b8b8b8b612c54565b909c909b509950505050505050505050565b60008142811015611ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b611f0489897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611e38565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909350611fb791508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611f6290309060040161538a565b60206040518083038186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb29190615117565b61375d565b611fd673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8584612a59565b5050979650505050505050565b60608142811015612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6120507f00000000000000000000000000000000000000000000000000000000000000008b8b348c8c8c8c612fe4565b9150612062826000815181106117a757fe5b6120c27f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613155915050565b816000815181106120cf57fe5b602002602001015134111561168d5761168d33836000815181106120ef57fe5b602002602001015134036136a4565b6121066134dd565b73ffffffffffffffffffffffffffffffffffffffff1661212461169a565b73ffffffffffffffffffffffffffffffffffffffff1614612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615aa3565b73ffffffffffffffffffffffffffffffffffffffff81166121be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c9061588e565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6122536134dd565b73ffffffffffffffffffffffffffffffffffffffff1661227161169a565b73ffffffffffffffffffffffffffffffffffffffff16146122be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615aa3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008060008342811015612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad8565b6123548d8d8d8d8d8d8d614131565b6040517f6a627842000000000000000000000000000000000000000000000000000000008152919550935073ffffffffffffffffffffffffffffffffffffffff8e1690636a627842906123ab90899060040161538a565b602060405180830381600087803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd9190615117565b91505099509950999650505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016124439392919061545d565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124919190615215565b6000604051808303816000865af19150503d80600081146124ce576040519150601f19603f3d011682016040523d82523d6000602084013e6124d3565b606091505b50915091508180156124fd5750805115806124fd5750808060200190518101906124fd9190615055565b612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615c37565b505050505050565b60005b8351811015612a525760008060008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663eb22d54f7f00000000000000000000000000000000000000000000000000000000000000008d8b815181106125bb57fe5b60200260200101518f8e8d815181106125d057fe5b60200260200101516040518563ffffffff1660e01b81526004016125f79493929190615659565b60c06040518083038186803b15801561260f57600080fd5b505afa158015612623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126479190614eeb565b955050945094509450945060006126a4858e73ffffffffffffffffffffffffffffffffffffffff166370a082318f8d8151811061268057fe5b60200260200101516040518263ffffffff1660e01b8152600401610ed9919061538a565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663671a11b58287878788606403886040518763ffffffff1660e01b815260040161270c96959493929190615d2a565b60206040518083038186803b15801561272457600080fd5b505afa158015612738573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275c9190615117565b9750859650505050505050600086848151811061277557fe5b602002602001015190506000808273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156127c857600080fd5b505afa1580156127dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280091906147ce565b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161461283a5784600061283e565b6000855b600154919350915073ffffffffffffffffffffffffffffffffffffffff161561292b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663677fdac8338c87898e8c815181106128af57fe5b60200260200101516040518663ffffffff1660e01b81526004016128d7959493929190615420565b602060405180830381600087803b1580156128f157600080fd5b505af1158015612905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129299190615055565b505b600060018a5103871061293e5787612956565b89876001018151811061294d57fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff85169063022c0d9f906129be9086908690869060248101615cd9565b600060405180830381600087803b1580156129d857600080fd5b505af11580156129ec573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488a8881518110612a1d57fe5b60200260200101518787604051612a36939291906156f6565b60405180910390a150929850506001909301925061253e915050565b5050505050565b600081612a6857506001612b38565b612a7184613671565b15612b29576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612ae8908590600401615381565b600060405180830381600087803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b50505050612b2483836136a4565b612b34565b612b3484848461375d565b5060015b9392505050565b6000806000612b7389897f00000000000000000000000000000000000000000000000000000000000000008a348b8b61416c565b9093509150612b8488338b8661240f565b612b8e828a6134e1565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a1690636a62784290612be090879060040161538a565b602060405180830381600087803b158015612bfa57600080fd5b505af1158015612c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c329190615117565b905081341115612c4857612c48338334036136a4565b96509650969350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5e31b138a6040518263ffffffff1660e01b8152600401612cb0919061538a565b60206040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d009190615055565b612d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615c94565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906323b872dd90612d8c9033908d908b9060040161545d565b602060405180830381600087803b158015612da657600080fd5b505af1158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde9190615055565b506000808a73ffffffffffffffffffffffffffffffffffffffff166389afcb44866040518263ffffffff1660e01b8152600401612e1b919061538a565b6040805180830381600087803b158015612e3457600080fd5b505af1158015612e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6c919061512f565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663544caa568c8c6040518363ffffffff1660e01b8152600401612ecd9291906153ab565b604080518083038186803b158015612ee457600080fd5b505afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c91906147ea565b5090508073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612f59578183612f5c565b82825b909550935087851015612f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159fe565b86841015612fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615959565b50505097509795505050505050565b6040517f30994f7100000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906330994f7190613087907f0000000000000000000000000000000000000000000000000000000000000000908d908d908d908c908c908c908c90600401615505565b60006040518083038186803b15801561309f57600080fd5b505afa1580156130b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526130f99190810190614fc5565b9050858160008151811061310957fe5b60200260200101511115613149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615922565b98975050505050505050565b8360005b835181101561253357600084828151811061317057fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156131c257600080fd5b505afa1580156131d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fa91906147ce565b9050600087846001018151811061320d57fe5b6020026020010151905060008060008473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461325857836000866132d9565b6000848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156132a157600080fd5b505afa1580156132b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d991906147ce565b600154929550909350915073ffffffffffffffffffffffffffffffffffffffff16156133c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663677fdac8338a84888f8d8151811061334d57fe5b60200260200101516040518663ffffffff1660e01b8152600401613375959493929190615420565b602060405180830381600087803b15801561338f57600080fd5b505af11580156133a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c79190615055565b505b600060018b510388106133dc57896133f4565b8a88600101815181106133eb57fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff88169063022c0d9f9061345c9087908790869060248101615cd9565b600060405180830381600087803b15801561347657600080fd5b505af115801561348a573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488786846040516134c1939291906156f6565b60405180910390a1509650506001909401935061315992505050565b3390565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561354957600080fd5b505af115801561355d573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506135d69150849086906004016156d0565b602060405180830381600087803b1580156135f057600080fd5b505af1158015613604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136289190615055565b61100f57fe5b8082038281111561366b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906157e9565b92915050565b73ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136db9190615215565b60006040518083038185875af1925050503d8060008114613718576040519150601f19603f3d011682016040523d82523d6000602084013e61371d565b606091505b5050905080613758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615bda565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161378f9291906156d0565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137dd9190615215565b6000604051808303816000865af19150503d806000811461381a576040519150601f19603f3d011682016040523d82523d6000602084013e61381f565b606091505b50915091508180156138495750805115806138495750808060200190518101906138499190615055565b612a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615820565b60e0811415613a86576000808573ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b85856040516020016138be939291906151d9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526138f691615215565b6000604051808303816000865af19150503d8060008114613933576040519150601f19603f3d011682016040523d82523d6000602084013e613938565b606091505b509150915081612533576000613983826040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250613b63565b9050858773ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016139c19291906153ab565b60206040518083038186803b1580156139d957600080fd5b505afa1580156139ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a119190615117565b1015613a4b57806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c91906157d6565b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa81604051613a7a91906157d6565b60405180910390a15050505b50505050565b6000613a9783613671565b15613aba575073ffffffffffffffffffffffffffffffffffffffff81163161366b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190613b0c90859060040161538a565b60206040518083038186803b158015613b2457600080fd5b505afa158015613b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5c9190615117565b905061366b565b60606044835110158015613bca575082600081518110613b7f57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b8015613c29575082600181518110613bde57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b8015613c88575082600281518110613c3d57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b8015613ce7575082600381518110613c9c57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15613d5d576060604484019050805160440184511015613d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b46565b8281604051602001613d46929190615335565b60405160208183030381529060405291505061366b565b82516024148015613dc1575082600081518110613d7657fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b8015613e20575082600181518110613dd557fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b8015613e7f575082600281518110613e3457fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b8015613ede575082600381518110613e9357fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b15613f0357602483015182613ef282614478565b604051602001613d46929190615231565b81613f0d8461449e565b604051602001613f1e9291906152b3565b604051602081830303815290604052905092915050565b8082018281101561366b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615990565b6000811580613f8d57505080820282828281613f8a57fe5b04145b61366b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906158eb565b6040517ff2734c3800000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f2734c3890614062907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908a908a906004016155c6565b60006040518083038186803b15801561407a57600080fd5b505afa15801561408e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526140d49190810190614fc5565b905083816001835103815181106140e757fe5b60200260200101511015614127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b7d565b9695505050505050565b6000806141438989898989898961416c565b909250905061415488338b8561240f565b61416087338b8461240f565b97509795505050505050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663327494618c8c8c6040518463ffffffff1660e01b81526004016141cf939291906154d5565b604080518083038186803b1580156141e657600080fd5b505afa1580156141fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421e919061512f565b91509150816000148015614230575080155b1561424057879350869250611ac0565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906142b9908c9087908790600401615d14565b60206040518083038186803b1580156142d157600080fd5b505afa1580156142e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143099190615117565b9050878111614357578581101561434c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615959565b889450925082612fd5565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906143d0908c9087908990600401615d14565b60206040518083038186803b1580156143e857600080fd5b505afa1580156143fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144209190615117565b90508981111561442c57fe5b87811015614466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159fe565b9c979b50969950505050505050505050565b606061366b8260405160200161448e9190615381565b6040516020818303038152906040525b80516060907f30313233343536373839616263646566000000000000000000000000000000009060009060029081020167ffffffffffffffff811180156144e457600080fd5b506040519080825280601f01601f19166020018201604052801561450f576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061454057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061459d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b84518110156146d2578260048683815181106145e757fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c60f81c6010811061461d57fe5b1a60f81b82826002026002018151811061463357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285828151811061466f57fe5b60209101015160f81c600f166010811061468557fe5b1a60f81b82826002026003018151811061469b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016145cf565b509392505050565b803561369f81615e2f565b60008083601f8401126146f6578182fd5b50813567ffffffffffffffff81111561470d578182fd5b602083019150836020808302850101111561472757600080fd5b9250929050565b600082601f83011261473e578081fd5b8135602061475361474e83615de5565b615dc1565b828152818101908583018385028701840188101561476f578586fd5b855b8581101561479457614782826147a1565b84529284019290840190600101614771565b5090979650505050505050565b803560ff8116811461369f57600080fd5b6000602082840312156147c3578081fd5b8135612b3881615e2f565b6000602082840312156147df578081fd5b8151612b3881615e2f565b600080604083850312156147fc578081fd5b825161480781615e2f565b602084015190925061481881615e2f565b809150509250929050565b600080600080600080600080610100898b03121561483f578384fd5b883561484a81615e2f565b9750602089013561485a81615e2f565b9650604089013561486a81615e2f565b9550606089013594506080890135935060a0890135925060c089013561488f81615e2f565b8092505060e089013590509295985092959890939650565b6000806000806000806000806000806000806101808d8f0312156148c9578586fd5b8c356148d481615e2f565b9b5060208d01356148e481615e2f565b9a5060408d01356148f481615e2f565b995060608d0135985060808d0135975060a08d0135965060c08d013561491981615e2f565b955060e08d013594506101008d013561493181615e54565b93506149406101208e016147a1565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060008060006101208a8c031215614980578283fd5b893561498b81615e2f565b985060208a013561499b81615e2f565b975060408a01356149ab81615e2f565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356149d781615e2f565b809250506101008a013590509295985092959850929598565b6000806000806000806000806000806101008b8d031215614a0f578384fd5b8a35614a1a81615e2f565b995060208b0135614a2a81615e2f565b985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115614a54578586fd5b614a608e838f016146e5565b909850965060a08d0135915080821115614a78578586fd5b50614a858d828e016146e5565b90955093505060c08b0135614a9981615e2f565b8092505060e08b013590509295989b9194979a5092959850565b600080600080600080600080610100898b031215614acf578182fd5b614ad98935615e2f565b883597506020890135614aeb81615e2f565b96506040890135955060608901359450608089013567ffffffffffffffff80821115614b15578384fd5b818b0191508b601f830112614b28578384fd5b8135614b3661474e82615de5565b80828252602082019150602085018f60208086028801011115614b57578788fd5b8795505b83861015614b8457614b6d8135615e2f565b803583526001959095019460209283019201614b5b565b509750505060a08b0135915080821115614b9c578384fd5b50614ba98b828c0161472e565b935050614bb860c08a016146da565b915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614be8578081fd5b8735614bf381615e2f565b96506020880135614c0381615e2f565b955060408801359450606088013593506080880135925060a0880135614c2881615e2f565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215614c60578485fd5b8b35614c6b81615e2f565b9a5060208c0135614c7b81615e2f565b995060408c0135985060608c0135975060808c0135965060a08c0135614ca081615e2f565b955060c08c0135945060e08c0135614cb781615e54565b9350614cc66101008d016147a1565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600060e0888a031215614d02578081fd5b8735614d0d81615e2f565b96506020880135614d1d81615e2f565b955060408801359450606088013593506080880135614d3b81615e62565b925060a0880135614d4b81615e62565b915060c0880135614d5b81615e2f565b8091505092959891949750929550565b60008060408385031215614d7d578182fd5b8235614d8881615e2f565b946020939093013593505050565b60008060008060008060008060c0898b031215614db1578182fd5b8835614dbc81615e2f565b975060208901359650604089013567ffffffffffffffff80821115614ddf578384fd5b614deb8c838d016146e5565b909850965060608b0135915080821115614e03578384fd5b50614e108b828c016146e5565b9095509350506080890135614e2481615e2f565b8092505060a089013590509295985092959890939650565b600080600080600080600080600060e08a8c031215614e59578283fd5b8935614e6481615e2f565b985060208a0135975060408a0135965060608a013567ffffffffffffffff80821115614e8e578485fd5b614e9a8d838e016146e5565b909850965060808c0135915080821115614eb2578485fd5b50614ebf8c828d016146e5565b90955093505060a08a0135614ed381615e2f565b8092505060c08a013590509295985092959850929598565b60008060008060008060c08789031215614f03578384fd5b8651614f0e81615e2f565b8096505060208701519450604087015193506060870151614f2e81615e62565b6080880151909350614f3f81615e62565b60a0880151909250614f5081615e62565b809150509295509295509295565b600080600080600060a08688031215614f75578283fd5b8535614f8081615e2f565b9450602086013593506040860135614f9781615e62565b92506060860135614fa781615e62565b91506080860135614fb781615e2f565b809150509295509295909350565b60006020808385031215614fd7578182fd5b825167ffffffffffffffff811115614fed578283fd5b8301601f81018513614ffd578283fd5b805161500b61474e82615de5565b8181528381019083850185840285018601891015615027578687fd5b8694505b8385101561504957805183526001949094019391850191850161502b565b50979650505050505050565b600060208284031215615066578081fd5b8151612b3881615e54565b60008060008060608587031215615086578182fd5b843561509181615e2f565b9350602085013567ffffffffffffffff808211156150ad578384fd5b9086019061010082890312156150c1578384fd5b909350604086013590808211156150d6578384fd5b818701915087601f8301126150e9578384fd5b8135818111156150f7578485fd5b886020828501011115615108578485fd5b95989497505060200194505050565b600060208284031215615128578081fd5b5051919050565b60008060408385031215615141578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b8381101561518457815160ff1687529582019590820190600101615165565b509495945050505050565b600081518084526151a7816020860160208601615e03565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffff000000000000000000000000000000000000000000000000000000008516825282846004840137910160040190815292915050565b60008251615227818460208701615e03565b9190910192915050565b60008351615243818460208801615e03565b7f50616e6963280000000000000000000000000000000000000000000000000000908301908152835161527d816006840160208801615e03565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b600083516152c5818460208801615e03565b7f556e6b6e6f776e2800000000000000000000000000000000000000000000000090830190815283516152ff816008840160208801615e03565b7f290000000000000000000000000000000000000000000000000000000000000060089290910191820152600901949350505050565b60008351615347818460208801615e03565b7f4572726f72280000000000000000000000000000000000000000000000000000908301908152835161527d816006840160208801615e03565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff9586168152938516602085015291841660408401526060830152909116608082015260a00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152928516604085015293166060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808c1684526020818c1681860152818b16604086015289606086015260c060808601528288845260e086019050899350845b8981101561557957843561556581615e2f565b841682529382019390820190600101615552565b5085810360a087015286815281019250869150835b868110156155b45760ff6155a1846147a1565b168452928101929181019160010161558e565b50919c9b505050505050505050505050565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808a1684526020818a1681860152818916604086015287606086015260c0608086015282875180855260e0870191508289019450855b81811015615635578551851683529483019491830191600101615617565b505085810360a08701526156498188615152565b9c9b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292841660208401529216604082015260ff909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015263ffffffff9081166040830152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561575e57835183529284019291840191600101615742565b50909695505050505050565b60006040825283604083015283856060840137806060858401015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116830101905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208252612b38602083018461518f565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201527f526f757465723a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526017908201527f646174612073686f756c64206265206e6f74207a65726f000000000000000000604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f5560408201527f4e54000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160408201527f494c454400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f526f757465723a20496e76616c69642070616972000000000000000000000000604082015260600190565b918252602082015260400190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152614127608083018461518f565b9283526020830191909152604082015260600190565b9586526020860194909452604085019290925263ffffffff908116606085015290811660808401521660a082015260c00190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615d92578283fd5b83018035915067ffffffffffffffff821115615dac578283fd5b60200191503681900382131561472757600080fd5b60405181810167ffffffffffffffff81118282101715615ddd57fe5b604052919050565b600067ffffffffffffffff821115615df957fe5b5060209081020190565b60005b83811015615e1e578181015183820152602001615e06565b83811115613a865750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114615e5157600080fd5b50565b8015158114615e5157600080fd5b63ffffffff81168114615e5157600080fdfea26469706673582212203cd3454ba18ea99cb54a8288c3a41e68d2edf034c335dfac8a10fcb76a94d33a64736f6c634300070600330000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _factory (address): 0x5de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : _formula (address): 0xf8f007970cd7345a6bff4a0226f50feeb417378c
Arg [2] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : 000000000000000000000000f8f007970cd7345a6bff4a0226f50feeb417378c
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Deployed ByteCode Sourcemap

22111:22108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23441:10;:18;23455:4;23441:18;;23434:26;;;;22111:22108;;;;;43319:638;;;;;;;;;;-1:-1:-1;43319:638:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35024:632;;;;;;;;;;-1:-1:-1;35024:632:0;;;;;:::i;:::-;;:::i;27463:510::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;22257:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41423:643::-;;;;;;;;;;-1:-1:-1;41423:643:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30480:576::-;;;;;;;;;;-1:-1:-1;30480:576:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27084:373::-;;;;;;:::i;:::-;;:::i;21591:138::-;;;;;;;;;;;;;:::i;34358:660::-;;;;;;:::i;:::-;;:::i;43963:253::-;;;;;;;;;;-1:-1:-1;43963:253:0;;;;;:::i;:::-;;:::i;29489:531::-;;;;;;;;;;-1:-1:-1;29489:531:0;;;;;:::i;:::-;;:::i;35662:2219::-;;;;;;:::i;:::-;;:::i;28957:526::-;;;;;;;;;;-1:-1:-1;28957:526:0;;;;;:::i;:::-;;:::i;20980:81::-;;;;;;;;;;;;;:::i;30026:448::-;;;;;;:::i;:::-;;:::i;22346:37::-;;;;;;;;;;;;;:::i;42072:616::-;;;;;;;;;;-1:-1:-1;42072:616:0;;;;;:::i;:::-;;:::i;22303:38::-;;;;;;;;;;;;;:::i;31062:577::-;;;;;;;;;;-1:-1:-1;31062:577:0;;;;;:::i;:::-;;:::i;40900:517::-;;;;;;;;;;-1:-1:-1;40900:517:0;;;;;:::i;:::-;;:::i;22211:41::-;;;;;;;;;;;;;:::i;25326:448::-;;;;;;;;;;-1:-1:-1;25326:448:0;;;;;:::i;:::-;;:::i;33714:638::-;;;;;;;;;;-1:-1:-1;33714:638:0;;;;;:::i;:::-;;:::i;40494:400::-;;;;;;;;;;-1:-1:-1;40494:400:0;;;;;:::i;:::-;;:::i;42763:550::-;;;;;;;;;;-1:-1:-1;42763:550:0;;;;;:::i;:::-;;:::i;31645:574::-;;;;;;:::i;:::-;;:::i;21874:230::-;;;;;;;;;;-1:-1:-1;21874:230:0;;;;;:::i;:::-;;:::i;23532:110::-;;;;;;;;;;-1:-1:-1;23532:110:0;;;;;:::i;:::-;;:::i;25780:574::-;;;;;;;;;;-1:-1:-1;25780:574:0;;;;;:::i;:::-;;:::i;43319:638::-;43653:17;43679:13;43695:10;:36;;43722:9;43695:36;;;43716:2;43695:36;43738:79;;;;;43679:52;;-1:-1:-1;43738:26:0;;;;;;:79;;43765:10;;43785:4;;43679:52;;43799:8;;43809:1;;43812;;43815;;43738:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43836:115;43884:4;43890:5;43897:9;43908:14;43924:12;43938:2;43942:8;43836:47;:115::i;:::-;43824:127;43319:638;-1:-1:-1;;;;;;;;;;;;;43319:638:0:o;35024:632::-;35294:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35311:71:::1;35343:7;35352:10;35364:4;;35369:1;35364:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;35373:8;35311:31;:71::i;:::-;35389:72;35424:7;35433:4;;35389:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;35389:72:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;35439:6:0;;-1:-1:-1;35439:6:0;;;;35389:72;::::1;::::0;35439:6;;35389:72;35439:6;35389:72;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35455:4:0::1;::::0;-1:-1:-1;35389:34:0::1;::::0;-1:-1:-1;;35389:72:0:i:1;:::-;35488:37;::::0;;;;35468:17:::1;::::0;35488:22:::1;35495:4;35488:22;::::0;::::1;::::0;:37:::1;::::0;35519:4:::1;::::0;35488:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35468:57;;35553:12;35540:9;:25;;35532:72;;;;;;;;;;;;:::i;:::-;35611:39;22435:42;35636:2;35640:9;35611:11;:39::i;:::-;;23216:1;35024:632:::0;;;;;;;;;;:::o;27463:510::-;27757:19;27785:17;27811;27725:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;27884:83:::1;27901:4;27907:5;27914:18;27934:14;27950:12;27964:2;27884:16;:83::i;:::-;27846:121:::0;;;;-1:-1:-1;27846:121:0;;-1:-1:-1;27463:510:0;-1:-1:-1;;;;;;;;;27463:510:0:o;22257:41::-;;;:::o;41423:643::-;41758:15;41775;41739:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;41808:13:::1;41824:10;:36;;41851:9;41824:36;;;41845:2;41824:36;41808:52;;41883:4;41869:26;;;41896:10;41916:4;41923:5;41930:8;41940:1;41943;41946;41869:79;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23216:1;41983:77;42000:4;42006:6;42014;42022:9;42033:10;42045;42057:2;41983:16;:77::i;:::-;41962:98;;;;;;;;41423:643:::0;;;;;;;;;;;;;;;;:::o;30480:576::-;30740:24;30721:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;30783:70:::1;30801:7;30810:4;30816:9;30827:11;30840:4;;30846:6;;30783:17;:70::i;:::-;30773:80;;30862:73;30894:7;30903:10;30915:4;;30920:1;30915:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;30924;30932:1;30924:10;;;;;;;;;;;;;;30862:31;:73::i;:::-;30942:44;30948:7;30957;30966:4;;30942:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30980:4:0::1;::::0;-1:-1:-1;30942:5:0::1;::::0;-1:-1:-1;;30942:44:0:i:1;:::-;30993:57;22435:42;31018:2;31022:7;31047:1;31030:7;:14;:18;31022:27;;;;;;;;;;;;;;30993:11;:57::i;:::-;;30480:576:::0;;;;;;;;;;;;:::o;27084:373::-;27262:17;27288:12;27320:7;27303:36;;;27340:5;27347:4;27353:11;27366:7;27303:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27288:86;;27399:52;27416:4;27422:5;27429:11;27442:1;27445;27448:2;27399:16;:52::i;:::-;27381:70;27084:373;-1:-1:-1;;;;;;;;;27084:373:0:o;21591:138::-;21193:12;:10;:12::i;:::-;21182:23;;:7;:5;:7::i;:::-;:23;;;21174:68;;;;;;;;;;;;:::i;:::-;21694:1:::1;21678:6:::0;;21657:40:::1;::::0;::::1;21678:6:::0;;::::1;::::0;21657:40:::1;::::0;21694:1;;21657:40:::1;21721:1;21704:19:::0;;;::::1;::::0;;21591:138::o;34358:660::-;34614:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;34719:9:::1;34735:32;34719:9:::0;34759:4;;34700:16:::1;34759:7:::0;::::1;;;;;;;;;;;;;;;;;:::i;:::-;34735:13;:32::i;:::-;34798:30;::::0;;;;34774:21:::1;::::0;34798:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;34825:2;;34798:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34774:54;;34835:58;34870:4;34876;;34835:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;34835:58:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;34882:6:0;;-1:-1:-1;34882:6:0;;;;34835:58;::::1;::::0;34882:6;;34835:58;34882:6;34835:58;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34890:2:0;;-1:-1:-1;34835:34:0::1;::::0;-1:-1:-1;;34835:58:0:i:1;:::-;34961:12;34908:49;34943:13;34915:8;34908:26;;;34935:2;34908:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;::::1;:49::i;:::-;:65;;34900:112;;;;;;;;;;;;:::i;:::-;23216:1;;34358:660:::0;;;;;;;;;:::o;43963:253::-;21193:12;:10;:12::i;:::-;21182:23;;:7;:5;:7::i;:::-;:23;;;21174:68;;;;;;;;;;;;:::i;:::-;44045:20:::1;44058:5;44045;:20::i;:::-;44041:170;;;44076:50;44107:10;44119:6;44076:30;:50::i;:::-;44041:170;;;44149:54;44177:5;44184:10;44196:6;44149:27;:54::i;:::-;43963:253:::0;;:::o;29489:531::-;29775:24;29756:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;29818:74:::1;29836:7;29845:8;29855:9;29866:11;29879:4;;29885:6;;29818:17;:74::i;:::-;29808:84;;29901:73;29933:7;29942:10;29954:4;;29959:1;29954:7;;;;;;29901:73;29981:33;29987:7;29996;30005:4;;29981:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30011:2:0;;-1:-1:-1;29981:5:0::1;::::0;-1:-1:-1;;29981:33:0:i:1;:::-;29489:531:::0;;;;;;;;;;;;;:::o;35662:2219::-;35803:20;35825:15;35880:1;35857:4;:20;;;:24;35849:63;;;;;;;;;;;;:::i;:::-;35927:15;35919:51;;;;;;;;;;;;:::i;:::-;35995:10;;;;36029:11;;;;35979:13;36065;;;;35995:4;36065:13;:::i;:::-;36047:31;-1:-1:-1;36085:15:0;36103:13;;;;;;;;:::i;:::-;36085:31;-1:-1:-1;22582:4:0;36129:27;;:32;36125:223;;36193:15;36199:8;36193:5;:15::i;:::-;:28;;36220:1;36193:28;;;36211:6;36193:28;36180:9;:42;36172:72;;;;;;;;;;;;:::i;:::-;36125:223;;;36289:15;36295:8;36289:5;:15::i;:::-;:28;;36316:1;36289:28;;;36307:6;36289:28;36275:9;:43;36267:73;;;;;;;;;;;;:::i;:::-;22632:4;36360:21;;:26;36356:240;;36406:15;36412:8;36406:5;:15::i;:::-;36405:16;36397:47;;;;;;;;;;;;:::i;:::-;36453:38;36461:8;36471:6;36479:11;;;;:4;:11;:::i;:::-;36453:7;:38::i;:::-;36500:88;36540:8;36551:10;36563:16;;;;;;;;:::i;:::-;36581:6;36500:31;:88::i;:::-;36604:19;;36627:16;;;;;;;;:::i;:::-;:30;;;36626:64;;36674:16;;;;;;;;:::i;:::-;36626:64;;;36661:10;36626:64;36604:86;-1:-1:-1;36697:25:0;22526:4;36726:21;;36725:67;;36791:1;36725:67;;;36756:32;36767:8;36777:10;36756;:32::i;:::-;36697:95;;36799:25;36827:33;36838:8;36848:11;36827:10;:33::i;:::-;36799:61;;36937:12;36951:19;36982:6;36974:20;;37002:9;37036:25;;;37063:4;;37069:10;37013:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36974:107;;;;37013:67;36974:107;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36936:145;;;;37095:7;37090:97;;37122:54;37147:6;37122:54;;;;;;;;;;;;;;;;;:24;:54::i;:::-;37115:62;;;;;;;;;;;:::i;37090:97::-;-1:-1:-1;37224:6:0;;-1:-1:-1;37252:56:0;37290:17;37252:33;37263:8;37273:11;37252:10;:33::i;:56::-;37237:71;-1:-1:-1;22526:4:0;37321:21;;:26;37317:343;;37372:67;37406:32;37417:8;37427:10;37406;:32::i;:::-;37372:29;:17;37394:6;37372:21;:29::i;:67::-;37358:81;-1:-1:-1;37484:37:0;:20;;;;37358:81;37484:24;:37::i;:::-;37456:24;:12;37473:6;37456:16;:24::i;:::-;:65;;37448:105;;;;;;;;;;;;:::i;:::-;37317:343;;;37600:4;:20;;;37584:12;:36;;37576:76;;;;;;;;;;;;:::i;:::-;37673:79;37681:10;37693:8;37703;37713:11;37726;37739:12;37673:79;;;;;;;;;;;:::i;:::-;;;;;;;;37764:83;37781:6;37790:12;37804:15;37810:8;37804:5;:15::i;:::-;:42;;37837:8;37804:42;;;37822:4;37804:42;37764:83;;;;;;;;:::i;:::-;;;;;;;;37866:9;37856:19;;35662:2219;;;;;;;;;;;;;;;:::o;28957:526::-;29237:24;29218:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;29280:75:::1;29299:7;29308:8;29318;29328:12;29342:4;29348:6;29280:18;:75::i;:::-;29270:85;;29364:73;29396:7;29405:10;29417:4;29422:1;29417:7;;;;;;;;;;;;;;29426;29434:1;29426:10;;;;;;;29364:73;29444:33;29450:7;29459;29468:4;29474:2;29444:5;:33::i;:::-;28957:526:::0;;;;;;;;;;;:::o;20980:81::-;21026:7;21049:6;;;20980:81;:::o;30026:448::-;30272:24;30253:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;30315:73:::1;30334:4;30340:8;30350:9;30361:12;30375:4;;30315:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30381:6;;30315:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30315:18:0::1;::::0;-1:-1:-1;;;30315:73:0:i:1;:::-;30305:83;;30397:34;30411:7;30419:1;30411:10;;;;;;;;;;;;;;30423:4;;30428:1;30423:7;;;;;;30397:34;30438:30;30444:4;30450:7;30459:4;;30438:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30465:2:0;;-1:-1:-1;30438:5:0::1;::::0;-1:-1:-1;;30438:30:0:i:1;22346:37::-:0;;;;;;:::o;42072:616::-;42377:19;42398:17;42424:13;42440:10;:36;;42467:9;42440:36;;;42461:2;42440:36;42483:79;;;;;42424:52;;-1:-1:-1;42483:26:0;;;;;;:79;;42510:10;;42530:4;;42424:52;;42544:8;;42554:1;;42557;;42560;;42483:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42596:86;42615:4;42621:5;42628:9;42639:14;42655:12;42669:2;42673:8;42596:18;:86::i;:::-;42569:113;;;;-1:-1:-1;42072:616:0;-1:-1:-1;;;;;;;;;;;;;42072:616:0:o;22303:38::-;;;:::o;31062:577::-;31322:24;31303:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;31365:71:::1;31384:7;31393:4;31399:8;31409:12;31423:4;;31365:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31429:6;;31365:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31365:18:0::1;::::0;-1:-1:-1;;;31365:71:0:i:1;40900:517::-:0;41142:19;41163:17;41123:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;41216:91:::1;41233:4;41239:5;41246:4;41252:9;41263:14;41279:12;41301:4;41216:16;:91::i;:::-;41189:118:::0;;-1:-1:-1;41189:118:0;-1:-1:-1;41314:51:0::1;41342:5:::0;41349:2;41189:118;41314:27:::1;:51::i;:::-;41372:39;22435:42;41397:2;41401:9;41372:11;:39::i;:::-;;40900:517:::0;;;;;;;;;;;:::o;22211:41::-;;;:::o;25326:448::-;25534:17;25560:12;25592:7;25575:36;;;25612:6;25620;25628:12;25642:7;25575:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25560:90;;25657:64;25676:4;25682:6;25690;25698:7;25707;25716:1;25719;25657:18;:64::i;:::-;-1:-1:-1;;25740:28:0;;;;;:24;;;;;;:28;;25765:2;;25740:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33714:638::-;34010:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;34027:71:::1;34059:7;34068:10;34080:4;;34085:1;34080:7;;;;;;34027:71;34129:30;::::0;;;;34105:21:::1;::::0;34129:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;34156:2;;34129:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34105:54;;34166:61;34201:7;34210:4;;34166:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;34166:61:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;34216:6:0;;-1:-1:-1;34216:6:0;;;;34166:61;::::1;::::0;34216:6;;34166:61;34216:6;34166:61;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34224:2:0;;-1:-1:-1;34166:34:0::1;::::0;-1:-1:-1;;34166:61:0:i:1;:::-;34295:12;34242:49;34277:13;34249:8;34242:26;;;34269:2;34242:30;;;;;;;;;;;;;;;:::i;:49::-;:65;;34234:112;;;;;;;;;;;;:::i;40494:400::-:0;40749:15;40766;40730:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;40811:77:::1;40828:4;40834:6;40842;40850:9;40861:10;40873;40885:2;40811:16;:77::i;:::-;40790:98:::0;;;;-1:-1:-1;40494:400:0;-1:-1:-1;;;;;;;;;;40494:400:0:o;42763:550::-;43034:17;43015:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;43076:100:::1;43092:4;43098:5;43105:4;43111:9;43122:14;43138:12;43160:4;43167:8;43076:15;:100::i;:::-;43222:38;::::0;;;;43060:116;;-1:-1:-1;43183:78:0::1;::::0;-1:-1:-1;43211:5:0;;43218:2;;43222:23:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;43254:4:::1;::::0;43222:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43183:27;:78::i;:::-;43268:39;22435:42;43293:2;43297:9;43268:11;:39::i;:::-;;42763:550:::0;;;;;;;;;;:::o;31645:574::-;31888:24;31869:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;31931:69:::1;31949:4;31955:8;31965:9;31976;31987:4;;31993:6;;31931:17;:69::i;:::-;31921:79;;32009:34;32023:7;32031:1;32023:10;;;;;;;32009:34;32050:30;32056:4;32062:7;32071:4;;32050:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32077:2:0;;-1:-1:-1;32050:5:0::1;::::0;-1:-1:-1;;32050:30:0:i:1;:::-;32135:7;32143:1;32135:10;;;;;;;;;;;;;;32123:9;:22;32119:94;;;32147:66;32178:10;32202:7;32210:1;32202:10;;;;;;;;;;;;;;32190:9;:22;32147:30;:66::i;21874:230::-:0;21193:12;:10;:12::i;:::-;21182:23;;:7;:5;:7::i;:::-;:23;;;21174:68;;;;;;;;;;;;:::i;:::-;21959:22:::1;::::0;::::1;21951:73;;;;;;;;;;;;:::i;:::-;22057:6;::::0;;22036:38:::1;::::0;::::1;::::0;;::::1;::::0;22057:6;::::1;::::0;22036:38:::1;::::0;::::1;22081:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;21874:230::o;23532:110::-;21193:12;:10;:12::i;:::-;21182:23;;:7;:5;:7::i;:::-;:23;;;21174:68;;;;;;;;;;;;:::i;:::-;23606:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;23532:110::o;25780:574::-;26101:15;26125;26149:17;26069:8;23174:15;23162:8;:27;;23154:55;;;;;;;;;;;;:::i;:::-;26205:96:::1;26224:4;26230:6;26238;26246:14;26262;26278:10;26290;26205:18;:96::i;:::-;26320:28;::::0;;;;26184:117;;-1:-1:-1;26184:117:0;-1:-1:-1;26320:24:0::1;::::0;::::1;::::0;::::1;::::0;:28:::1;::::0;26345:2;;26320:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26308:40;;25780:574:::0;;;;;;;;;;;;;;:::o;7589:416::-;7788:12;7802:17;7823:5;:10;;7857;7869:4;7875:2;7879:5;7834:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7823:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7787:99;;;;7901:7;:57;;;;-1:-1:-1;7913:11:0;;:16;;:44;;;7944:4;7933:24;;;;;;;;;;;;:::i;:::-;7893:106;;;;;;;;;;;;:::i;:::-;7589:416;;;;;;:::o;32360:1348::-;32534:9;32529:1174;32549:4;:11;32545:1;:15;32529:1174;;;32576:20;32605:21;32647:14;32663:20;32685:21;32708:23;32735:14;32781:7;32764:53;;;32818:7;32827:4;32832:1;32827:7;;;;;;;;;;;;;;32836;32845:6;32852:1;32845:9;;;;;;;;;;;;;;32764:91;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32646:209;;;;;;;;;;;32866:19;32888:52;32927:12;32895:7;32888:25;;;32914:4;32919:1;32914:7;;;;;;;;;;;;;;32888:34;;;;;;;;;;;;;;;:::i;:52::-;32866:74;;32983:7;32966:38;;;33005:11;33018:12;33032:13;33047:16;33071;33065:3;:22;33089:7;32966:131;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32951:146;;33124:6;33108:22;;32529:1174;;;;;;33150:18;33185:4;33190:1;33185:7;;;;;;;;;;;;;;33150:43;;33203:18;33223;33256:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33245:24;;:7;:24;;;:82;;33302:12;33324:1;33245:82;;;33281:1;33285:12;33245:82;33340:13;;33202:125;;-1:-1:-1;33202:125:0;-1:-1:-1;33340:27:0;:13;:27;33336:147;;33395:13;;;;;;;;;;;33380:34;;;33415:10;33427:7;33436:13;33451:12;33465:4;33470:1;33465:7;;;;;;;;;;;;;;33380:93;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33336:147;33491:10;33522:1;33508:4;:11;:15;33504:1;:19;:39;;33540:3;33504:39;;;33526:4;33531:1;33535;33531:5;33526:11;;;;;;;;;;;;;;33504:39;33590:12;;;33600:1;33590:12;;;;;;;;;33552:51;;;;33491:52;;-1:-1:-1;33552:9:0;;;;;;:51;;33562:10;;33574;;33491:52;;33552:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33617:46;33626:4;33631:1;33626:7;;;;;;;;;;;;;;33635:12;33649:13;33617:46;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;33682:13:0;;-1:-1:-1;;32562:3:0;;;;;-1:-1:-1;32529:1174:0;;-1:-1:-1;;32529:1174:0;;;32360:1348;;;;:::o;39156:382::-;39258:4;39275:11;39271:45;;-1:-1:-1;39304:4:0;39297:11;;39271:45;39328:20;39341:5;39328;:20::i;:::-;39324:191;;;39359:28;;;;;:20;39365:4;39359:20;;;;:28;;39380:6;;39359:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39396:42;39427:2;39431:6;39396:30;:42::i;:::-;39324:191;;;39461:46;39489:5;39496:2;39500:6;39461:27;:46::i;:::-;-1:-1:-1;39528:4:0;39156:382;;;;;;:::o;26360:718::-;26572:19;26600:17;26626;26688:93;26702:4;26708:5;26715:4;26721:18;26741:9;26752:14;26768:12;26688:13;:93::i;:::-;26661:120;;-1:-1:-1;26661:120:0;-1:-1:-1;26788:69:0;26820:5;26827:10;26839:4;26661:120;26788:31;:69::i;:::-;26864:30;26878:9;26889:4;26864:13;:30::i;:::-;26913:28;;;;;:24;;;;;;:28;;26938:2;;26913:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26901:40;;26996:9;26984;:21;26980:92;;;27007:65;27038:10;27062:9;27050;:21;27007:30;:65::i;:::-;26360:718;;;;;;;;;;:::o;39692:796::-;39893:15;39910;39959:7;39942:32;;;39975:4;39942:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39934:71;;;;;;;;;;;;:::i;:::-;40012:61;;;;;:32;;;;;;:61;;40045:10;;40026:4;;40063:9;;40012:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40112:15;40129;40162:4;40148:24;;;40173:2;40148:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40111:65;;;;40184:14;40221:7;40204:36;;;40241:6;40249;40204:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40183:73;;;40294:6;40284:16;;:6;:16;;;:58;;40325:7;40334;40284:58;;;40304:7;40313;40284:58;40263:79;;-1:-1:-1;40263:79:0;-1:-1:-1;40357:21:0;;;;40349:63;;;;;;;;;;;;:::i;:::-;40438:10;40427:7;:21;;40419:63;;;;;;;;;;;;:::i;:::-;39692:796;;;;;;;;;;;;;:::o;38556:432::-;38809:98;;;;;38766:24;;38809:45;38826:7;38809:45;;;;:98;;38855:7;;38864;;38873:8;;38883:9;;38894:4;;;;38900:6;;;;38809:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38799:108;;38936:11;38922:7;38930:1;38922:10;;;;;;;;;;;;;;:25;;38914:68;;;;;;;;;;;;:::i;:::-;38556:432;;;;;;;;;;:::o;28078:873::-;28237:7;28221:13;28251:695;28275:4;:11;28271:1;:15;28251:695;;;28302:20;28339:4;28344:1;28339:7;;;;;;;;;;;;;;28302:45;;28356:14;28373:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28356:32;;28397:17;28417:7;28425:1;28429;28425:5;28417:14;;;;;;;;;;;;;;28397:34;;28441:18;28461;28481:14;28508:6;28499:15;;:5;:15;;;:92;;28561:9;28580:1;28584:6;28499:92;;;28526:1;28530:9;28541:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28604:13;;28440:151;;-1:-1:-1;28440:151:0;;-1:-1:-1;28440:151:0;-1:-1:-1;28604:27:0;:13;:27;28600:135;;28659:13;;;;;;;;;;;28644:34;;;28679:10;28691:5;28698:6;28706:9;28717:4;28722:1;28717:7;;;;;;;;;;;;;;28644:81;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28600:135;28743:10;28774:1;28760:4;:11;:15;28756:1;:19;:39;;28792:3;28756:39;;;28778:4;28783:1;28787;28783:5;28778:11;;;;;;;;;;;;;;28756:39;28844:12;;;28854:1;28844:12;;;;;;;;;28804:53;;;;28743:52;;-1:-1:-1;28804:11:0;;;;;;:53;;28816:10;;28828;;28743:52;;28804:53;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28871:44;28888:6;28897:9;28908:6;28871:44;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;28932:6:0;-1:-1:-1;;28288:3:0;;;;;-1:-1:-1;28251:695:0;;-1:-1:-1;;;28251:695:0;19662:100;19746:10;19662:100;:::o;38994:156::-;39067:4;39061:19;;;39088:6;39061:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39111:32:0;;;;;:20;39117:4;39111:20;;-1:-1:-1;39111:20:0;;-1:-1:-1;39111:32:0;;-1:-1:-1;39132:2:0;;39136:6;;39111:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39104:40;;;14882:132;14971:5;;;14966:16;;;;14958:50;;;;;;;;;;;;:::i;:::-;14882:132;;;;:::o;39544:109::-;39617:29;;;22435:42;39617:29;39544:109;;;;:::o;8011:190::-;8120:12;;;8080;8120;;;;;;;;;8098:7;;;;8113:5;;8098:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8079:54;;;8148:7;8140:55;;;;;;;;;;;;:::i;:::-;8011:190;;;:::o;7213:370::-;7377:12;7391:17;7412:5;:10;;7446;7458:2;7462:5;7423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7412:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7376:93;;;;7484:7;:57;;;;-1:-1:-1;7496:11:0;;:16;;:44;;;7527:4;7516:24;;;;;;;;;;;;:::i;:::-;7476:101;;;;;;;;;;;;:::i;18509:605::-;18636:6;18619:23;;18615:494;;;18712:12;18726:19;18757:5;18749:19;;18786:28;;;18816:6;;18769:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;18749:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18711:113;;;;18838:7;18833:269;;18858:20;18881:56;18906:6;18881:56;;;;;;;;;;;;;;;;;:24;:56::i;:::-;18858:79;;18997:6;18952:5;:15;;;18968:10;18988:4;18952:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;18948:145;;;19025:6;19018:14;;;;;;;;;;;:::i;18948:145::-;19068:13;19074:6;19068:13;;;;;;:::i;:::-;;;;;;;;18833:269;18615:494;;;18509:605;;;;:::o;37887:206::-;37961:7;37981:12;37987:5;37981;:12::i;:::-;37977:111;;;-1:-1:-1;38011:15:0;;;;38004:22;;37977:111;38056:24;;;;;:15;;;;;;:24;;38072:7;;38056:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38049:31;;;;16119:1769;16198:13;16467:2;16452:4;:11;:17;;:38;;;;;16473:4;16478:1;16473:7;;;;;;;;;;;;;;;:17;;16452:38;:59;;;;;16494:4;16499:1;16494:7;;;;;;;;;;;;;;;:17;;16452:59;:80;;;;;16515:4;16520:1;16515:7;;;;;;;;;;;;;;;:17;;16452:80;:101;;;;;16536:4;16541:1;16536:7;;;;;;;;;;;;;;;:17;;16452:101;16448:1356;;;16564:20;16752:2;16746:4;16742:13;16732:23;;17236:6;17230:20;17225:2;:25;17210:4;:11;:40;;17202:74;;;;;;;;;;;;:::i;:::-;17316:6;17334;17299:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17285:62;;;;;16448:1356;17429:4;:11;17444:2;17429:17;:38;;;;;17450:4;17455:1;17450:7;;;;;;;;;;;;;;;:17;;17429:38;:59;;;;;17471:4;17476:1;17471:7;;;;;;;;;;;;;;;:17;;17429:59;:80;;;;;17492:4;17497:1;17492:7;;;;;;;;;;;;;;;:17;;17429:80;:101;;;;;17513:4;17518:1;17513:7;;;;;;;;;;;;;;;:17;;17429:101;17425:379;;;17707:2;17697:13;;17691:20;17759:6;17777:12;17691:20;17777:6;:12::i;:::-;17742:53;;;;;;;;;:::i;17425:379::-;17843:6;17863:12;17870:4;17863:6;:12::i;:::-;17826:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17812:70;;16119:1769;;;;:::o;14745:131::-;14834:5;;;14829:16;;;;14821:49;;;;;;;;;;;;:::i;15020:145::-;15078:9;15104:6;;;:30;;-1:-1:-1;;15119:5:0;;;15133:1;15128;15119:5;15128:1;15114:15;;;;;:20;15104:30;15096:63;;;;;;;;;;;;:::i;38099:451::-;38349:98;;;;;38306:24;;38349:46;38366:7;38349:46;;;;:98;;38396:7;;38405;;38414:8;;38424;;38434:4;;38440:6;;38349:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38339:108;;38493:12;38462:7;38487:1;38470:7;:14;:18;38462:27;;;;;;;;;;;;;;:43;;38454:90;;;;;;;;;;;;:::i;:::-;38099:451;;;;;;;;:::o;24795:525::-;25015:15;25032;25077:91;25091:4;25097:6;25105;25113:14;25129;25145:10;25157;25077:13;:91::i;:::-;25056:112;;-1:-1:-1;25056:112:0;-1:-1:-1;25175:66:0;25207:6;25215:10;25227:4;25056:112;25175:31;:66::i;:::-;25248;25280:6;25288:10;25300:4;25306:7;25248:31;:66::i;:::-;24795:525;;;;;;;;;;:::o;23678:1111::-;23901:15;23918;23943:16;23961;23998:7;23981:37;;;24019:4;24025:6;24033;23981:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23942:98;;;;24051:8;24063:1;24051:13;:30;;;;-1:-1:-1;24068:13:0;;24051:30;24047:737;;;24114:14;;-1:-1:-1;24130:14:0;;-1:-1:-1;24047:737:0;;;24193:67;;;;;24168:22;;24193:31;24210:7;24193:31;;;;:67;;24225:14;;24241:8;;24251;;24193:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24168:92;;24291:14;24273;:32;24269:508;;24344:10;24326:14;:28;;24318:70;;;;;;;;;;;;:::i;:::-;24421:14;;-1:-1:-1;24437:14:0;-1:-1:-1;24437:14:0;24269:508;;;24504:67;;;;;24479:22;;24504:31;24521:7;24504:31;;;;:67;;24536:14;;24552:8;;24562;;24504:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24479:92;;24607:14;24589;:32;;24582:40;;;;24659:10;24641:14;:28;;24633:70;;;;;;;;;;;;:::i;:::-;24736:14;24752;;-1:-1:-1;23678:1111:0;;-1:-1:-1;;;;;;;;;;23678:1111:0:o;17894:119::-;17947:13;17976:31;18000:5;17983:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;18019:425;18191:11;;18076:13;;18098:53;;:16;;18205:1;18191:15;;;18187:19;18177:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18177:30:0;;18158:49;;18214:12;:3;18218:1;18214:6;;;;;;;;;;;:12;;;;;;;;;;;18233;:3;18237:1;18233:6;;;;;;;;;;;:12;;;;;;;;;;;18257:9;18252:162;18276:4;:11;18272:1;:15;18252:162;;;18320:8;18346:1;18335:4;18340:1;18335:7;;;;;;;;;;;;;;:12;;:7;18329:19;18320:29;;;;;;;;;;18303:3;18311:1;18307;:5;18315:1;18307:9;18303:14;;;;;;;;;;;:46;;;;;;;;;;;18375:8;18390:4;18395:1;18390:7;;;;;;;;;;;;;;;18400:4;18384:21;18375:31;;;;;;;;;;18358:3;18366:1;18362;:5;18370:1;18362:9;18358:14;;;;;;;;;;;:48;;;;;;;;;;-1:-1:-1;18289:3:0;;18252:162;;;-1:-1:-1;18434:3:0;18019:425;-1:-1:-1;;;18019:425:0:o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:404::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;315:8;305;298:26;257:2;-1:-1:-1;345:20:1;;388:18;377:30;;374:2;;;427:8;417;410:26;374:2;471:4;463:6;459:17;447:29;;534:3;527:4;519;511:6;507:17;499:6;495:30;491:41;488:50;485:2;;;551:1;548;541:12;485:2;247:314;;;;;:::o;566:709::-;;677:3;670:4;662:6;658:17;654:27;644:2;;699:5;692;685:20;644:2;739:6;726:20;765:4;789:65;804:49;850:2;804:49;:::i;:::-;789:65;:::i;:::-;888:15;;;919:12;;;;951:15;;;997:11;;;985:24;;981:33;;978:42;-1:-1:-1;975:2:1;;;1037:5;1030;1023:20;975:2;1063:5;1077:169;1091:2;1088:1;1085:9;1077:169;;;1148:23;1167:3;1148:23;:::i;:::-;1136:36;;1192:12;;;;1224;;;;1109:1;1102:9;1077:169;;;-1:-1:-1;1264:5:1;;634:641;-1:-1:-1;;;;;;;634:641:1:o;1280:158::-;1348:20;;1408:4;1397:16;;1387:27;;1377:2;;1428:1;1425;1418:12;1443:259;;1555:2;1543:9;1534:7;1530:23;1526:32;1523:2;;;1576:6;1568;1561:22;1523:2;1620:9;1607:23;1639:33;1666:5;1639:33;:::i;1707:263::-;;1830:2;1818:9;1809:7;1805:23;1801:32;1798:2;;;1851:6;1843;1836:22;1798:2;1888:9;1882:16;1907:33;1934:5;1907:33;:::i;1975:399::-;;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2136:6;2128;2121:22;2083:2;2173:9;2167:16;2192:33;2219:5;2192:33;:::i;:::-;2294:2;2279:18;;2273:25;2244:5;;-1:-1:-1;2307:35:1;2273:25;2307:35;:::i;:::-;2361:7;2351:17;;;2073:301;;;;;:::o;2379:965::-;;;;;;;;;2610:3;2598:9;2589:7;2585:23;2581:33;2578:2;;;2632:6;2624;2617:22;2578:2;2676:9;2663:23;2695:33;2722:5;2695:33;:::i;:::-;2747:5;-1:-1:-1;2804:2:1;2789:18;;2776:32;2817:35;2776:32;2817:35;:::i;:::-;2871:7;-1:-1:-1;2930:2:1;2915:18;;2902:32;2943:35;2902:32;2943:35;:::i;:::-;2997:7;-1:-1:-1;3051:2:1;3036:18;;3023:32;;-1:-1:-1;3102:3:1;3087:19;;3074:33;;-1:-1:-1;3154:3:1;3139:19;;3126:33;;-1:-1:-1;3211:3:1;3196:19;;3183:33;3225:35;3183:33;3225:35;:::i;:::-;3279:7;3269:17;;;3333:3;3322:9;3318:19;3305:33;3295:43;;2568:776;;;;;;;;;;;:::o;3349:1318::-;;;;;;;;;;;;;3645:3;3633:9;3624:7;3620:23;3616:33;3613:2;;;3667:6;3659;3652:22;3613:2;3711:9;3698:23;3730:33;3757:5;3730:33;:::i;:::-;3782:5;-1:-1:-1;3839:2:1;3824:18;;3811:32;3852:35;3811:32;3852:35;:::i;:::-;3906:7;-1:-1:-1;3965:2:1;3950:18;;3937:32;3978:35;3937:32;3978:35;:::i;:::-;4032:7;-1:-1:-1;4086:2:1;4071:18;;4058:32;;-1:-1:-1;4137:3:1;4122:19;;4109:33;;-1:-1:-1;4189:3:1;4174:19;;4161:33;;-1:-1:-1;4246:3:1;4231:19;;4218:33;4260:35;4218:33;4260:35;:::i;:::-;4314:7;-1:-1:-1;4368:3:1;4353:19;;4340:33;;-1:-1:-1;4425:3:1;4410:19;;4397:33;4439:32;4397:33;4439:32;:::i;:::-;4490:7;-1:-1:-1;4516:39:1;4550:3;4535:19;;4516:39;:::i;:::-;4506:49;;4603:3;4592:9;4588:19;4575:33;4564:44;;4656:3;4645:9;4641:19;4628:33;4617:44;;3603:1064;;;;;;;;;;;;;;:::o;4672:1034::-;;;;;;;;;;4920:3;4908:9;4899:7;4895:23;4891:33;4888:2;;;4942:6;4934;4927:22;4888:2;4986:9;4973:23;5005:33;5032:5;5005:33;:::i;:::-;5057:5;-1:-1:-1;5114:2:1;5099:18;;5086:32;5127:35;5086:32;5127:35;:::i;:::-;5181:7;-1:-1:-1;5240:2:1;5225:18;;5212:32;5253:35;5212:32;5253:35;:::i;:::-;5307:7;-1:-1:-1;5361:2:1;5346:18;;5333:32;;-1:-1:-1;5412:3:1;5397:19;;5384:33;;-1:-1:-1;5464:3:1;5449:19;;5436:33;;-1:-1:-1;5516:3:1;5501:19;;5488:33;;-1:-1:-1;5573:3:1;5558:19;;5545:33;5587:35;5545:33;5587:35;:::i;:::-;5641:7;5631:17;;;5695:3;5684:9;5680:19;5667:33;5657:43;;4878:828;;;;;;;;;;;:::o;5711:1445::-;;;;;;;;;;;6010:3;5998:9;5989:7;5985:23;5981:33;5978:2;;;6032:6;6024;6017:22;5978:2;6076:9;6063:23;6095:33;6122:5;6095:33;:::i;:::-;6147:5;-1:-1:-1;6204:2:1;6189:18;;6176:32;6217:35;6176:32;6217:35;:::i;:::-;6271:7;-1:-1:-1;6325:2:1;6310:18;;6297:32;;-1:-1:-1;6376:2:1;6361:18;;6348:32;;-1:-1:-1;6431:3:1;6416:19;;6403:33;6455:18;6485:14;;;6482:2;;;6517:6;6509;6502:22;6482:2;6561:76;6629:7;6620:6;6609:9;6605:22;6561:76;:::i;:::-;6656:8;;-1:-1:-1;6535:102:1;-1:-1:-1;6744:3:1;6729:19;;6716:33;;-1:-1:-1;6761:16:1;;;6758:2;;;6795:6;6787;6780:22;6758:2;;6839:78;6909:7;6898:8;6887:9;6883:24;6839:78;:::i;:::-;6936:8;;-1:-1:-1;6813:104:1;-1:-1:-1;;7023:3:1;7008:19;;6995:33;7037:35;6995:33;7037:35;:::i;:::-;7091:7;7081:17;;;7145:3;7134:9;7130:19;7117:33;7107:43;;5968:1188;;;;;;;;;;;;;:::o;7161:1799::-;;;;;;;;;7440:3;7428:9;7419:7;7415:23;7411:33;7408:2;;;7462:6;7454;7447:22;7408:2;7480:51;7520:9;7507:23;7480:51;:::i;:::-;7563:9;7550:23;7540:33;;7623:2;7612:9;7608:18;7595:32;7636:33;7663:5;7636:33;:::i;:::-;7688:5;-1:-1:-1;7740:2:1;7725:18;;7712:32;;-1:-1:-1;7791:2:1;7776:18;;7763:32;;-1:-1:-1;7846:3:1;7831:19;;7818:33;7870:18;7900:14;;;7897:2;;;7932:6;7924;7917:22;7897:2;7975:6;7964:9;7960:22;7950:32;;8020:7;8013:4;8009:2;8005:13;8001:27;7991:2;;8047:6;8039;8032:22;7991:2;8088;8075:16;8111:65;8126:49;8172:2;8126:49;:::i;8111:65::-;8198:3;8222:2;8217:3;8210:15;8250:2;8245:3;8241:12;8234:19;;8281:2;8277;8273:11;8330:7;8325:2;8319;8315;8311:11;8307:2;8303:20;8299:29;8296:42;8293:2;;;8356:6;8348;8341:22;8293:2;8383:6;8374:15;;8398:221;8412:2;8409:1;8406:9;8398:221;;;8457:45;8497:3;8484:17;8457:45;:::i;:::-;8527:17;;8515:30;;8430:1;8423:9;;;;;8574:2;8565:12;;;;8597;8398:221;;;-1:-1:-1;8638:5:1;-1:-1:-1;;;8696:3:1;8681:19;;8668:33;;-1:-1:-1;8713:16:1;;;8710:2;;;8747:6;8739;8732:22;8710:2;;8775:67;8834:7;8823:8;8812:9;8808:24;8775:67;:::i;:::-;8765:77;;;8861:41;8897:3;8886:9;8882:19;8861:41;:::i;:::-;8851:51;;8949:3;8938:9;8934:19;8921:33;8911:43;;7398:1562;;;;;;;;;;;:::o;8965:821::-;;;;;;;;9179:3;9167:9;9158:7;9154:23;9150:33;9147:2;;;9201:6;9193;9186:22;9147:2;9245:9;9232:23;9264:33;9291:5;9264:33;:::i;:::-;9316:5;-1:-1:-1;9373:2:1;9358:18;;9345:32;9386:35;9345:32;9386:35;:::i;:::-;9440:7;-1:-1:-1;9494:2:1;9479:18;;9466:32;;-1:-1:-1;9545:2:1;9530:18;;9517:32;;-1:-1:-1;9596:3:1;9581:19;;9568:33;;-1:-1:-1;9653:3:1;9638:19;;9625:33;9667:35;9625:33;9667:35;:::i;:::-;9721:7;9711:17;;;9775:3;9764:9;9760:19;9747:33;9737:43;;9137:649;;;;;;;;;;:::o;9791:1172::-;;;;;;;;;;;;10069:3;10057:9;10048:7;10044:23;10040:33;10037:2;;;10091:6;10083;10076:22;10037:2;10135:9;10122:23;10154:33;10181:5;10154:33;:::i;:::-;10206:5;-1:-1:-1;10263:2:1;10248:18;;10235:32;10276:35;10235:32;10276:35;:::i;:::-;10330:7;-1:-1:-1;10384:2:1;10369:18;;10356:32;;-1:-1:-1;10435:2:1;10420:18;;10407:32;;-1:-1:-1;10486:3:1;10471:19;;10458:33;;-1:-1:-1;10543:3:1;10528:19;;10515:33;10557:35;10515:33;10557:35;:::i;:::-;10611:7;-1:-1:-1;10665:3:1;10650:19;;10637:33;;-1:-1:-1;10722:3:1;10707:19;;10694:33;10736:32;10694:33;10736:32;:::i;:::-;10787:7;-1:-1:-1;10813:39:1;10847:3;10832:19;;10813:39;:::i;:::-;10803:49;;10899:3;10888:9;10884:19;10871:33;10861:43;;10952:3;10941:9;10937:19;10924:33;10913:44;;10027:936;;;;;;;;;;;;;;:::o;10968:967::-;;;;;;;;11180:3;11168:9;11159:7;11155:23;11151:33;11148:2;;;11202:6;11194;11187:22;11148:2;11246:9;11233:23;11265:33;11292:5;11265:33;:::i;:::-;11317:5;-1:-1:-1;11374:2:1;11359:18;;11346:32;11387:35;11346:32;11387:35;:::i;:::-;11441:7;-1:-1:-1;11495:2:1;11480:18;;11467:32;;-1:-1:-1;11546:2:1;11531:18;;11518:32;;-1:-1:-1;11602:3:1;11587:19;;11574:33;11616:34;11574:33;11616:34;:::i;:::-;11669:7;-1:-1:-1;11728:3:1;11713:19;;11700:33;11742:34;11700:33;11742:34;:::i;:::-;11795:7;-1:-1:-1;11854:3:1;11839:19;;11826:33;11868:35;11826:33;11868:35;:::i;:::-;11922:7;11912:17;;;11138:797;;;;;;;;;;:::o;11940:327::-;;;12069:2;12057:9;12048:7;12044:23;12040:32;12037:2;;;12090:6;12082;12075:22;12037:2;12134:9;12121:23;12153:33;12180:5;12153:33;:::i;:::-;12205:5;12257:2;12242:18;;;;12229:32;;-1:-1:-1;;;12027:240:1:o;12272:1232::-;;;;;;;;;12537:3;12525:9;12516:7;12512:23;12508:33;12505:2;;;12559:6;12551;12544:22;12505:2;12603:9;12590:23;12622:33;12649:5;12622:33;:::i;:::-;12674:5;-1:-1:-1;12726:2:1;12711:18;;12698:32;;-1:-1:-1;12781:2:1;12766:18;;12753:32;12804:18;12834:14;;;12831:2;;;12866:6;12858;12851:22;12831:2;12910:76;12978:7;12969:6;12958:9;12954:22;12910:76;:::i;:::-;13005:8;;-1:-1:-1;12884:102:1;-1:-1:-1;13093:2:1;13078:18;;13065:32;;-1:-1:-1;13109:16:1;;;13106:2;;;13143:6;13135;13128:22;13106:2;;13187:78;13257:7;13246:8;13235:9;13231:24;13187:78;:::i;:::-;13284:8;;-1:-1:-1;13161:104:1;-1:-1:-1;;13371:3:1;13356:19;;13343:33;13385:35;13343:33;13385:35;:::i;:::-;13439:7;13429:17;;;13493:3;13482:9;13478:19;13465:33;13455:43;;12495:1009;;;;;;;;;;;:::o;13509:1301::-;;;;;;;;;;13791:3;13779:9;13770:7;13766:23;13762:33;13759:2;;;13813:6;13805;13798:22;13759:2;13857:9;13844:23;13876:33;13903:5;13876:33;:::i;:::-;13928:5;-1:-1:-1;13980:2:1;13965:18;;13952:32;;-1:-1:-1;14031:2:1;14016:18;;14003:32;;-1:-1:-1;14086:2:1;14071:18;;14058:32;14109:18;14139:14;;;14136:2;;;14171:6;14163;14156:22;14136:2;14215:76;14283:7;14274:6;14263:9;14259:22;14215:76;:::i;:::-;14310:8;;-1:-1:-1;14189:102:1;-1:-1:-1;14398:3:1;14383:19;;14370:33;;-1:-1:-1;14415:16:1;;;14412:2;;;14449:6;14441;14434:22;14412:2;;14493:78;14563:7;14552:8;14541:9;14537:24;14493:78;:::i;:::-;14590:8;;-1:-1:-1;14467:104:1;-1:-1:-1;;14677:3:1;14662:19;;14649:33;14691:35;14649:33;14691:35;:::i;:::-;14745:7;14735:17;;;14799:3;14788:9;14784:19;14771:33;14761:43;;13749:1061;;;;;;;;;;;:::o;14815:790::-;;;;;;;15020:3;15008:9;14999:7;14995:23;14991:33;14988:2;;;15042:6;15034;15027:22;14988:2;15079:9;15073:16;15098:33;15125:5;15098:33;:::i;:::-;15150:5;15140:15;;;15195:2;15184:9;15180:18;15174:25;15164:35;;15239:2;15228:9;15224:18;15218:25;15208:35;;15288:2;15277:9;15273:18;15267:25;15301:34;15327:7;15301:34;:::i;:::-;15406:3;15391:19;;15385:26;15354:7;;-1:-1:-1;15420:34:1;15385:26;15420:34;:::i;:::-;15525:3;15510:19;;15504:26;15473:7;;-1:-1:-1;15539:34:1;15504:26;15539:34;:::i;:::-;15592:7;15582:17;;;14978:627;;;;;;;;:::o;15610:754::-;;;;;;15788:3;15776:9;15767:7;15763:23;15759:33;15756:2;;;15810:6;15802;15795:22;15756:2;15854:9;15841:23;15873:33;15900:5;15873:33;:::i;:::-;15925:5;-1:-1:-1;15977:2:1;15962:18;;15949:32;;-1:-1:-1;16033:2:1;16018:18;;16005:32;16046:34;16005:32;16046:34;:::i;:::-;16099:7;-1:-1:-1;16158:2:1;16143:18;;16130:32;16171:34;16130:32;16171:34;:::i;:::-;16224:7;-1:-1:-1;16283:3:1;16268:19;;16255:33;16297:35;16255:33;16297:35;:::i;:::-;16351:7;16341:17;;;15746:618;;;;;;;;:::o;16369:943::-;;16495:2;16538;16526:9;16517:7;16513:23;16509:32;16506:2;;;16559:6;16551;16544:22;16506:2;16597:9;16591:16;16630:18;16622:6;16619:30;16616:2;;;16667:6;16659;16652:22;16616:2;16695:22;;16748:4;16740:13;;16736:27;-1:-1:-1;16726:2:1;;16782:6;16774;16767:22;16726:2;16816;16810:9;16839:65;16854:49;16900:2;16854:49;:::i;16839:65::-;16938:15;;;16969:12;;;;17001:11;;;17039;;;17031:20;;17027:29;;17024:42;-1:-1:-1;17021:2:1;;;17084:6;17076;17069:22;17021:2;17111:6;17102:15;;17126:156;17140:2;17137:1;17134:9;17126:156;;;17197:10;;17185:23;;17158:1;17151:9;;;;;17228:12;;;;17260;;17126:156;;;-1:-1:-1;17301:5:1;16475:837;-1:-1:-1;;;;;;;16475:837:1:o;17317:257::-;;17437:2;17425:9;17416:7;17412:23;17408:32;17405:2;;;17458:6;17450;17443:22;17405:2;17495:9;17489:16;17514:30;17538:5;17514:30;:::i;17579:1100::-;;;;;17808:2;17796:9;17787:7;17783:23;17779:32;17776:2;;;17829:6;17821;17814:22;17776:2;17873:9;17860:23;17892:33;17919:5;17892:33;:::i;:::-;17944:5;-1:-1:-1;18000:2:1;17985:18;;17972:32;18023:18;18053:14;;;18050:2;;;18085:6;18077;18070:22;18050:2;18113:22;;;;18169:3;18151:16;;;18147:26;18144:2;;;18191:6;18183;18176:22;18144:2;18219;;-1:-1:-1;18274:2:1;18259:18;;18246:32;;18290:16;;;18287:2;;;18324:6;18316;18309:22;18287:2;18367:8;18356:9;18352:24;18342:34;;18414:7;18407:4;18403:2;18399:13;18395:27;18385:2;;18441:6;18433;18426:22;18385:2;18486;18473:16;18512:2;18504:6;18501:14;18498:2;;;18533:6;18525;18518:22;18498:2;18583:7;18578:2;18569:6;18565:2;18561:15;18557:24;18554:37;18551:2;;;18609:6;18601;18594:22;18551:2;17766:913;;;;-1:-1:-1;;18645:2:1;18637:11;;-1:-1:-1;;;17766:913:1:o;18962:194::-;;19085:2;19073:9;19064:7;19060:23;19056:32;19053:2;;;19106:6;19098;19091:22;19053:2;-1:-1:-1;19134:16:1;;19043:113;-1:-1:-1;19043:113:1:o;19161:255::-;;;19301:2;19289:9;19280:7;19276:23;19272:32;19269:2;;;19322:6;19314;19307:22;19269:2;-1:-1:-1;;19350:16:1;;19406:2;19391:18;;;19385:25;19350:16;;19385:25;;-1:-1:-1;19259:157:1:o;19421:452::-;;19516:5;19510:12;19543:6;19538:3;19531:19;19569:4;19598:2;19593:3;19589:12;19582:19;;19635:2;19628:5;19624:14;19656:3;19668:180;19682:6;19679:1;19676:13;19668:180;;;19747:13;;19762:4;19743:24;19731:37;;19788:12;;;;19823:15;;;;19704:1;19697:9;19668:180;;;-1:-1:-1;19864:3:1;;19486:387;-1:-1:-1;;;;;19486:387:1:o;19878:318::-;;19959:5;19953:12;19986:6;19981:3;19974:19;20002:63;20058:6;20051:4;20046:3;20042:14;20035:4;20028:5;20024:16;20002:63;:::i;:::-;20110:2;20098:15;20115:66;20094:88;20085:98;;;;20185:4;20081:109;;19929:267;-1:-1:-1;;19929:267:1:o;20201:416::-;;20408:66;20400:6;20396:79;20391:3;20384:92;20519:6;20511;20507:1;20502:3;20498:11;20485:41;20549:16;;20567:1;20545:24;20578:15;;;20545:24;20374:243;-1:-1:-1;;20374:243:1:o;20622:274::-;;20789:6;20783:13;20805:53;20851:6;20846:3;20839:4;20831:6;20827:17;20805:53;:::i;:::-;20874:16;;;;;20759:137;-1:-1:-1;;20759:137:1:o;20901:773::-;;21320:6;21314:13;21336:53;21382:6;21377:3;21370:4;21362:6;21358:17;21336:53;:::i;:::-;21450:8;21411:16;;;21436:23;;;21484:13;;21506:65;21484:13;21558:1;21547:13;;21540:4;21528:17;;21506:65;:::i;:::-;21638:3;21634:1;21590:20;;;;21626:10;;;21619:23;21666:1;21658:10;;21290:384;-1:-1:-1;;;;21290:384:1:o;21679:775::-;;22098:6;22092:13;22114:53;22160:6;22155:3;22148:4;22140:6;22136:17;22114:53;:::i;:::-;22228:10;22189:16;;;22214:25;;;22264:13;;22286:65;22264:13;22338:1;22327:13;;22320:4;22308:17;;22286:65;:::i;:::-;22418:3;22414:1;22370:20;;;;22406:10;;;22399:23;22446:1;22438:10;;22068:386;-1:-1:-1;;;;22068:386:1:o;22459:773::-;;22878:6;22872:13;22894:53;22940:6;22935:3;22928:4;22920:6;22916:17;22894:53;:::i;:::-;23008:8;22969:16;;;22994:23;;;23042:13;;23064:65;23042:13;23116:1;23105:13;;23098:4;23086:17;;23064:65;:::i;23237:182::-;23366:19;;;23410:2;23401:12;;23356:63::o;23424:226::-;23600:42;23588:55;;;;23570:74;;23558:2;23543:18;;23525:125::o;23894:335::-;24086:42;24155:15;;;24137:34;;24207:15;;24202:2;24187:18;;24180:43;24064:2;24049:18;;24031:198::o;24234:709::-;24571:42;24640:15;;;24622:34;;24692:15;;;;24687:2;24672:18;;24665:43;24739:2;24724:18;;24717:34;;;;24782:2;24767:18;;24760:34;;;;24843:4;24831:17;24825:3;24810:19;;24803:46;24880:3;24865:19;;24858:35;24924:3;24909:19;;24902:35;;;;24548:3;24533:19;;24515:428::o;24948:568::-;25225:42;25294:15;;;25276:34;;25346:15;;;25341:2;25326:18;;25319:43;25398:15;;;25393:2;25378:18;;25371:43;25445:2;25430:18;;25423:34;25494:15;;;25488:3;25473:19;;25466:44;25202:3;25187:19;;25169:347::o;25521:406::-;25741:42;25810:15;;;25792:34;;25862:15;;;;25857:2;25842:18;;25835:43;25909:2;25894:18;;25887:34;;;;25719:2;25704:18;;25686:241::o;25932:668::-;26265:42;26334:15;;;26316:34;;26386:15;;;26381:2;26366:18;;26359:43;26438:15;;;26433:2;26418:18;;26411:43;26490:15;;26485:2;26470:18;;26463:43;26537:3;26522:19;;26515:35;;;;26581:3;26566:19;;26559:35;;;;26242:3;26227:19;;26209:391::o;26937:407::-;27149:42;27218:15;;;27200:34;;27270:15;;;27265:2;27250:18;;27243:43;27322:15;;;27317:2;27302:18;;27295:43;27127:2;27112:18;;27094:250::o;27349:1570::-;;27745:3;27734:9;27730:19;27768:42;27849:2;27841:6;27837:15;27826:9;27819:34;27872:2;27922;27914:6;27910:15;27905:2;27894:9;27890:18;27883:43;27974:2;27966:6;27962:15;27957:2;27946:9;27942:18;27935:43;28014:6;28009:2;27998:9;27994:18;27987:34;28058:3;28052;28041:9;28037:19;28030:32;28082:6;28112;28104;28097:22;28150:3;28139:9;28135:19;28128:26;;28177:6;28163:20;;28201:4;28214:262;28228:6;28225:1;28222:13;28214:262;;;28303:6;28290:20;28323:33;28350:5;28323:33;:::i;:::-;28381:14;;28369:27;;28451:15;;;;28416:12;;;;28250:1;28243:9;28214:262;;;-1:-1:-1;28513:19:1;;;28507:3;28492:19;;28485:48;28567:19;;;28604:12;;;-1:-1:-1;28641:6:1;;-1:-1:-1;28667:4:1;28680:211;28696:6;28691:3;28688:15;28680:211;;;28797:4;28767:28;28786:8;28767:28;:::i;:::-;28763:39;28749:54;;28825:14;;;;28864:17;;;;28722:1;28713:11;28680:211;;;-1:-1:-1;28908:5:1;;27706:1213;-1:-1:-1;;;;;;;;;;;;27706:1213:1:o;28924:1193::-;;29300:3;29289:9;29285:19;29323:42;29404:2;29396:6;29392:15;29381:9;29374:34;29427:2;29477;29469:6;29465:15;29460:2;29449:9;29445:18;29438:43;29529:2;29521:6;29517:15;29512:2;29501:9;29497:18;29490:43;29569:6;29564:2;29553:9;29549:18;29542:34;29613:3;29607;29596:9;29592:19;29585:32;29637:6;29672;29666:13;29703:6;29695;29688:22;29741:3;29730:9;29726:19;29719:26;;29780:2;29772:6;29768:15;29754:29;;29801:4;29814:178;29828:6;29825:1;29822:13;29814:178;;;29893:13;;29889:22;;29877:35;;29967:15;;;;29932:12;;;;29850:1;29843:9;29814:178;;;29818:3;;30038:9;30033:3;30029:19;30023:3;30012:9;30008:19;30001:48;30066:45;30107:3;30099:6;30066:45;:::i;:::-;30058:53;29261:856;-1:-1:-1;;;;;;;;;;;;29261:856:1:o;30122:486::-;30359:42;30428:15;;;30410:34;;30480:15;;;30475:2;30460:18;;30453:43;30532:15;;30527:2;30512:18;;30505:43;30596:4;30584:17;;;30579:2;30564:18;;30557:45;30336:3;30321:19;;30303:305::o;31016:513::-;31253:42;31322:15;;;31304:34;;31374:15;;;;31369:2;31354:18;;31347:43;31409:10;31455:15;;;31450:2;31435:18;;31428:43;31507:15;;;31502:2;31487:18;;31480:43;31230:3;31215:19;;31197:332::o;31534:297::-;31738:42;31726:55;;;;31708:74;;31813:2;31798:18;;31791:34;31696:2;31681:18;;31663:168::o;31836:398::-;32048:42;32117:15;;;32099:34;;32164:2;32149:18;;32142:34;;;;32212:15;;;32207:2;32192:18;;32185:43;32026:2;32011:18;;31993:241::o;32239:635::-;32410:2;32462:21;;;32532:13;;32435:18;;;32554:22;;;32239:635;;32410:2;32633:15;;;;32607:2;32592:18;;;32239:635;32679:169;32693:6;32690:1;32687:13;32679:169;;;32754:13;;32742:26;;32823:15;;;;32788:12;;;;32715:1;32708:9;32679:169;;;-1:-1:-1;32865:3:1;;32390:484;-1:-1:-1;;;;;;32390:484:1:o;32879:588::-;;33080:2;33069:9;33062:21;33119:6;33114:2;33103:9;33099:18;33092:34;33176:6;33168;33163:2;33152:9;33148:18;33135:48;33232:4;33227:2;33218:6;33207:9;33203:22;33199:31;33192:45;33364:2;33294:66;33289:2;33281:6;33277:15;33273:88;33262:9;33258:104;33254:113;33246:121;;33417:42;33409:6;33405:55;33398:4;33387:9;33383:20;33376:85;33052:415;;;;;;:::o;33472:221::-;;33621:2;33610:9;33603:21;33641:46;33683:2;33672:9;33668:18;33660:6;33641:46;:::i;33698:345::-;33900:2;33882:21;;;33939:2;33919:18;;;33912:30;33978:23;33973:2;33958:18;;33951:51;34034:2;34019:18;;33872:171::o;34048:355::-;34250:2;34232:21;;;34289:2;34269:18;;;34262:30;34328:33;34323:2;34308:18;;34301:61;34394:2;34379:18;;34222:181::o;34408:342::-;34610:2;34592:21;;;34649:2;34629:18;;;34622:30;34688:20;34683:2;34668:18;;34661:48;34741:2;34726:18;;34582:168::o;34755:402::-;34957:2;34939:21;;;34996:2;34976:18;;;34969:30;35035:34;35030:2;35015:18;;35008:62;35106:8;35101:2;35086:18;;35079:36;35147:3;35132:19;;34929:228::o;35162:344::-;35364:2;35346:21;;;35403:2;35383:18;;;35376:30;35442:22;35437:2;35422:18;;35415:50;35497:2;35482:18;;35336:170::o;35511:354::-;35713:2;35695:21;;;35752:2;35732:18;;;35725:30;35791:32;35786:2;35771:18;;35764:60;35856:2;35841:18;;35685:180::o;35870:353::-;36072:2;36054:21;;;36111:2;36091:18;;;36084:30;36150:31;36145:2;36130:18;;36123:59;36214:2;36199:18;;36044:179::o;36228:344::-;36430:2;36412:21;;;36469:2;36449:18;;;36442:30;36508:22;36503:2;36488:18;;36481:50;36563:2;36548:18;;36402:170::o;36577:341::-;36779:2;36761:21;;;36818:2;36798:18;;;36791:30;36857:19;36852:2;36837:18;;36830:47;36909:2;36894:18;;36751:167::o;36923:353::-;37125:2;37107:21;;;37164:2;37144:18;;;37137:30;37203:31;37198:2;37183:18;;37176:59;37267:2;37252:18;;37097:179::o;37281:351::-;37483:2;37465:21;;;37522:2;37502:18;;;37495:30;37561:29;37556:2;37541:18;;37534:57;37623:2;37608:18;;37455:177::o;37637:350::-;37839:2;37821:21;;;37878:2;37858:18;;;37851:30;37917:28;37912:2;37897:18;;37890:56;37978:2;37963:18;;37811:176::o;37992:356::-;38194:2;38176:21;;;38213:18;;;38206:30;38272:34;38267:2;38252:18;;38245:62;38339:2;38324:18;;38166:182::o;38353:339::-;38555:2;38537:21;;;38594:2;38574:18;;;38567:30;38633:17;38628:2;38613:18;;38606:45;38683:2;38668:18;;38527:165::o;38697:347::-;38899:2;38881:21;;;38938:2;38918:18;;;38911:30;38977:25;38972:2;38957:18;;38950:53;39035:2;39020:18;;38871:173::o;39049:345::-;39251:2;39233:21;;;39290:2;39270:18;;;39263:30;39329:23;39324:2;39309:18;;39302:51;39385:2;39370:18;;39223:171::o;39399:398::-;39601:2;39583:21;;;39640:2;39620:18;;;39613:30;39679:34;39674:2;39659:18;;39652:62;39750:4;39745:2;39730:18;;39723:32;39787:3;39772:19;;39573:224::o;39802:399::-;40004:2;39986:21;;;40043:2;40023:18;;;40016:30;40082:34;40077:2;40062:18;;40055:62;40153:5;40148:2;40133:18;;40126:33;40191:3;40176:19;;39976:225::o;40206:400::-;40408:2;40390:21;;;40447:2;40427:18;;;40420:30;40486:34;40481:2;40466:18;;40459:62;40557:6;40552:2;40537:18;;40530:34;40596:3;40581:19;;40380:226::o;40611:344::-;40813:2;40795:21;;;40852:2;40832:18;;;40825:30;40891:22;40886:2;40871:18;;40864:50;40946:2;40931:18;;40785:170::o;41142:248::-;41316:25;;;41372:2;41357:18;;41350:34;41304:2;41289:18;;41271:119::o;41395:483::-;;41626:6;41615:9;41608:25;41669:6;41664:2;41653:9;41649:18;41642:34;41724:42;41716:6;41712:55;41707:2;41696:9;41692:18;41685:83;41804:3;41799:2;41788:9;41784:18;41777:31;41825:47;41867:3;41856:9;41852:19;41844:6;41825:47;:::i;41883:319::-;42085:25;;;42141:2;42126:18;;42119:34;;;;42184:2;42169:18;;42162:34;42073:2;42058:18;;42040:162::o;42207:585::-;42488:25;;;42544:2;42529:18;;42522:34;;;;42587:2;42572:18;;42565:34;;;;42618:10;42664:15;;;42659:2;42644:18;;42637:43;42717:15;;;42711:3;42696:19;;42689:44;42770:15;42764:3;42749:19;;42742:44;42475:3;42460:19;;42442:350::o;42797:592::-;;;42940:11;42927:25;43030:66;43019:8;43003:14;42999:29;42995:102;42975:18;42971:127;42961:2;;43115:4;43109;43102:18;42961:2;43145:33;;43197:20;;;-1:-1:-1;43240:18:1;43229:30;;43226:2;;;43275:4;43269;43262:18;43226:2;43311:4;43299:17;;-1:-1:-1;43342:14:1;43338:27;;;43328:38;;43325:2;;;43379:1;43376;43369:12;43394:242;43464:2;43458:9;43494:17;;;43541:18;43526:34;;43562:22;;;43523:62;43520:2;;;43588:9;43520:2;43615;43608:22;43438:198;;-1:-1:-1;43438:198:1:o;43641:183::-;;43740:18;43732:6;43729:30;43726:2;;;43762:9;43726:2;-1:-1:-1;43813:4:1;43794:17;;;43790:28;;43716:108::o;43829:258::-;43901:1;43911:113;43925:6;43922:1;43919:13;43911:113;;;44001:11;;;43995:18;43982:11;;;43975:39;43947:2;43940:10;43911:113;;;44042:6;44039:1;44036:13;44033:2;;;-1:-1:-1;;44077:1:1;44059:16;;44052:27;43882:205::o;44092:156::-;44180:42;44173:5;44169:54;44162:5;44159:65;44149:2;;44238:1;44235;44228:12;44149:2;44139:109;:::o;44253:120::-;44341:5;44334:13;44327:21;44320:5;44317:32;44307:2;;44363:1;44360;44353:12;44378:123;44465:10;44458:5;44454:22;44447:5;44444:33;44434:2;;44491:1;44488;44481:12

Swarm Source

ipfs://3cd3454ba18ea99cb54a8288c3a41e68d2edf034c335dfac8a10fcb76a94d33a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.