ETH Price: $3,396.41 (+0.91%)

Token

ChainTools (CTLS)
 

Overview

Max Total Supply

11,000,000 CTLS

Holders

468 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$12,298.77

Circulating Supply Market Cap

$11,625.96

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
sellonaloss.eth
Balance
0.351941634090566491 CTLS

Value
$0.00 ( ~0 Eth) [0.0000%]
0x039649f7c2f548692184da3fedf316f58e8356c0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ChainTools is a revolutionary DeFi service and yield provider. Offering ChainSwap, ChainLock, ChainBoost, ChainPurge, ChainEscrow, and the first ever no-staking LP rewards on Uniswap V3.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChainToolsV2

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 42000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-14
*/

//SPDX-License-Identifier: UNLICENSED
/*                              
                    CHAINTOOLS 2023. DEFI REIMAGINED

                                                               2023

⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀            2021           ⣰⣾⣿⣶⡄⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀2019⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀     ⠹⣿V4⡄⡷⠀⠀⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⠀⠀⠀⠀⠀⠀⠀⠀ ⣤⣾⣿⣷⣦⡀⠀⠀⠀⠀   ⣿⣿⡏⠁⠀⠀⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣿⣿⣿⣷⡀⠀⠀⠀⠀ ⢀⣿⣿⣿⣿⣿⠄⠀⠀⠀  ⣰⣿⣿⣧⠀⠀⠀⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣾⣿⣿⣿⣿⣿⣿⡄⠀⠀ ⢀⣴⣿⣿⣿⠟⠛⠋⠀⠀⠀ ⢸⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣿⣿⣿⣿⣿⠟⠉⠉⠉⠁⢀⣴⣿⣿V3⣿⣿⠀⠀⠀⠀⠀  ⣾⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⣾⣿⣿⣿⣿⣿⠛⠀⠀⠀⠀⠀ ⣾⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀ ⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀   
⠀⠀⠀        2017⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿V2⣿⣿⡿⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀ ⢹⣿ ⣿⣿⣿⣿⠙⢿⣆⠀⠀⠀   
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣴⣦⣤⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⠛⠿⠿⠶⠶⣶⠀  ⣿ ⢸⣿⣿⣿⣿⣆⠹⠇⠀⠀   
⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⣿⣿⣿⣷⡆⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⡇⠉⠛⢿⣷⡄⠀⠀⠀⢸⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀  ⠹⠇⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀   
⠀⠀⠀⠀⣠⣴⣿⣿V1⣿⣿⣿⡏⠛⠃⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣇⠀⠀⠘⠋⠁⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀  ⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀   
⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀ ⠸⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀  ⠀⣿⣿⡟⢿⣿⣿⠀⠀⠀⠀   
⠀⢸⣿⣿⣿⣿⣿⠛⠉⠙⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀ ⢈⣿⣿⡟⢹⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⡿⠈⣿⣿⡟⠀⠀⠀⠀⠀  ⢸⣿⣿⠀⢸⣿⣿⠀⠀⠀⠀   
⠀⠀⠹⣿⣿⣿⣿⣷⡀⠀⠻⣿⣿⣿⣿⣶⣄⠀⠀⠀⢰⣿⣿⡟⠁⣾⣿⣿⠀⠀⠀⠀⠀⠀⢀⣶⣿⠟⠋⠀⢼⣿⣿⠃⠀⠀⠀⠀⠀  ⣿⣿⠁⠀⢹⣿⣿⠀⠀⠀⠀   
⠀⢀⣴⣿⡿⠋⢹⣿⡇⠀⠀⠈⠙⣿⣇⠙⣿⣷⠀⠀⢸⣿⡟⠀⠀⢻⣿⡏⠀⠀⠀⠀⠀⢀⣼⡿⠁⠀⠀⠀⠘⣿⣿⠀⠀⠀⠀⠀   ⢨⣿⡇⠀⠀⠀⣿⣿⠀⠀⠀⠀   
⣴⣿⡟⠉⠀⠀⣾⣿⡇⠀⠀⠀⠀⢈⣿⡄⠀⠉⠀⠀⣼⣿⡆⠀⠀⢸⣿⣷⠀⠀⠀⠀⢴⣿⣿⠀⠀⠀⠀⠀⠀⣿⣯⡀⠀⠀⠀⠀    ⢸⣿⣇⠀⠀⠀⢺⣿⡄⠀⠀⠀   
⠈⠻⠷⠄⠀⠀⣿⣿⣷⣤⣠⠀⠀⠈⠽⠷⠀⠀⠀⠸⠟⠛⠛⠒⠶⠸⣿⣿⣷⣦⣤⣄⠈⠻⠷⠄⠀⠀⠀⠾⠿⠿⣿⣶⣤⠀    ⠘⠛⠛⠛⠒⠀⠸⠿⠿⠦ 


Telegram: https://t.me/ChaintoolsOfficial
Website: https://www.chaintools.ai/
Whitepaper: https://chaintools-whitepaper.gitbook.io/
Twitter: https://twitter.com/ChaintoolsTech
dApp: https://www.chaintools.wtf/
*/

pragma solidity ^0.8.19;

// import "forge-std/console.sol";

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IUniswapV2Router02 {
    function getAmountsOut(uint256 amountIn, address[] memory path)
        external
        view
        returns (uint256[] memory amounts);

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

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

    function token0() external view returns (address);

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

interface IV3Pool {
    function liquidity() external view returns (uint128 Liq);

    struct Info {
        uint128 liquidity;
        uint256 feeGrowthInside0LastX128;
        uint256 feeGrowthInside1LastX128;
        uint128 tokensOwed0;
        uint128 tokensOwed1;
    }

    function initialize(uint160 sqrtPriceX96) external;

    function positions(bytes32 key)
        external
        view
        returns (IV3Pool.Info memory liqInfo);

    function swap(
        address recipient,
        bool zeroForOne,
        int256 amountSpecified,
        uint160 sqrtPriceLimitX96,
        bytes memory data
    ) external returns (int256 amount0, int256 amount1);

    function burn(
        int24 tickLower,
        int24 tickUpper,
        uint128 amount
    ) external returns (uint256 amount0, uint256 amount1);

    function collect(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount0Requested,
        uint128 amount1Requested
    ) external returns (uint128 amount0, uint128 amount1);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function slot0()
        external
        view
        returns (
            uint160,
            int24,
            uint16,
            uint16,
            uint16,
            uint8,
            bool
        );

    function flash(
        address recipient,
        uint256 amount0,
        uint256 amount1,
        bytes calldata data
    ) external;

    function uniswapV3FlashCallback(
        uint256 fee0,
        uint256 fee1,
        bytes memory data
    ) external;

    function mint(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount,
        bytes calldata data
    ) external returns (uint256 amount0, uint256 amount1);
}

interface IWETH {
    function withdraw(uint256 wad) external;

    function approve(address who, uint256 wad) external returns (bool);

    function deposit() external payable;

    function transfer(address dst, uint256 wad) external returns (bool);

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

interface IQuoterV2 {
    function quoteExactInputSingle(
        address tokenIn,
        address tokenOut,
        uint24 fee,
        uint256 amountIn,
        uint160 sqrtPriceLimitX96
    ) external returns (uint256 amountOut);
}

interface IV3Factory {
    function getPool(
        address token0,
        address token1,
        uint24 poolFee
    ) external view returns (address);

    function createPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external returns (address);
}

interface INonfungiblePositionManager {
    function ownerOf(uint256 tokenId) external view returns (address owner);

    function setApprovalForAll(address operator, bool approved) external;

    struct IncreaseLiquidityParams {
        uint256 tokenId;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function increaseLiquidity(
        INonfungiblePositionManager.IncreaseLiquidityParams calldata params
    )
        external
        returns (
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function factory() external view returns (address);

    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }

    function mint(MintParams calldata mp)
        external
        payable
        returns (
            uint256 tokenId,
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    function collect(CollectParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);

    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    struct DecreaseLiquidityParams {
        uint256 tokenId;
        uint128 liquidity;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function decreaseLiquidity(DecreaseLiquidityParams calldata dl)
        external
        returns (uint256 amount0, uint256 amount1);

    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            uint24 fee,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );
}

interface IRouterV3 {
    function factory() external view returns (address);

    function WETH9() external view returns (address);

    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }
    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    function exactOutputSingle(ExactOutputSingleParams calldata params)
        external
        returns (uint256 amountIn);

    function exactInputSingle(ExactInputSingleParams calldata params)
        external
        payable
        returns (uint256 amountOut);
}

interface YieldVault {
    function getDeviation(uint256 amountIn, uint256 startTickDeviation)
        external
        view
        returns (uint256 adjusted);

    function getCurrentTick() external view returns (int24 cTick);

    function getStartTickDeviation(int24 currentTick)
        external
        view
        returns (uint256 perc);

    function findPoolFee(address token0, address token1)
        external
        view
        returns (uint24 poolFee);

    function getPosition(uint256 tokenId)
        external
        view
        returns (
            address token0,
            address token1,
            uint128 liquidity
        );

    function getTickDistance(uint256 flag)
        external
        view
        returns (int24 tickDistance);

    function findApprovalToken(address pool)
        external
        view
        returns (address token);

    function findApprovalToken(address token0, address token1)
        external
        view
        returns (address token);

    function buyback(
        uint256 flag,
        uint128 internalWETHAmt,
        uint128 internalCTLSAmt,
        address to,
        uint256 id
    ) external returns (uint256 t0, uint256 t1);

    function keeper() external view returns (address);
}

interface YieldBooster {
    function preventFragmentations(address pool) external;
}

interface TickMaths {
    function getSqrtRatioAtTick(int24 tick)
        external
        pure
        returns (uint160 sqrtPriceX96);
}

contract ChainToolsV2 is Context, IERC20, IERC20Metadata {
    IUniswapV2Router02 internal immutable router;
    INonfungiblePositionManager internal immutable positionManager;
    YieldBooster internal YIELD_BOOSTER;
    YieldVault internal YIELD_VAULT;
    TickMaths internal immutable TickMath;
    address internal immutable uniswapV3Pool;
    address internal immutable multiSig;
    address internal immutable WETH;
    address internal immutable v3Router;
    address internal immutable apest;

    uint256 internal immutable _MAX_SUPPLY;
    uint256 internal immutable _totalSupply;
    uint256 internal immutable _cap;

    uint8 internal tokenomicsOn;
    uint32 internal startStamp;
    uint32 internal lastRewardStamp;
    uint80 internal issuanceRate;

    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;

    mapping(address => bool) internal isTaxExcluded;
    mapping(address => bool) internal badPool;

    mapping(address => address) internal upperRef;
    mapping(address => uint256) internal sandwichLock;

    event zapIn(
        address indexed from,
        uint256 tokenId,
        uint256 flag,
        uint256 amtETHIn,
        uint256 amtTokensIn
    );

    event referralPaid(address indexed from, address indexed to, uint256 amt);

    error MinMax();
    error ZeroAddress();
    error Auth();
    error Sando();

    constructor(address _apest, address _tickMaths) {
        TickMath = TickMaths(_tickMaths);
        multiSig = 0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222;
        apest = _apest;
        tokenomicsOn = 1;
        issuanceRate = 10e18;
        v3Router = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        WETH = IRouterV3(v3Router).WETH9();

        positionManager = INonfungiblePositionManager(
            0xC36442b4a4522E871399CD717aBDD847Ab11FE88
        );

        uniswapV3Pool = IV3Factory(positionManager.factory()).createPool(
            WETH,
            address(this),
            10000
        );

        require(IV3Pool(uniswapV3Pool).token0() == WETH, "token0pool0");

        //Initial supply
        uint256 forLiquidityBootstrap = 1_000_000e18;
        _balances[
            0x0000000000000000000000000000000000C0FFEE
        ] = forLiquidityBootstrap;
        emit Transfer(
            address(0),
            address(0x0000000000000000000000000000000000C0FFEE),
            forLiquidityBootstrap
        );

        uint256 forMigration = 8_200_000e18;
        _balances[apest] += forMigration;
        emit Transfer(address(0), address(apest), forMigration);

        uint256 forLp = 600_000e18;
        _balances[address(this)] += forLp;
        emit Transfer(address(0), address(this), forLp);

        uint256 forMarketing = 1_000_000e18;
        _balances[0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222] += forMarketing;
        emit Transfer(
            address(0),
            0xb0Df68E0bf4F54D06A4a448735D2a3d7D97A2222,
            forMarketing
        );

        uint256 forYieldBoosting = 200_000e18;
        _balances[address(this)] += forYieldBoosting;
        emit Transfer(address(0), address(this), forMarketing);

        int24 startTick = 98140;
        IV3Pool(uniswapV3Pool).initialize(
            TickMath.getSqrtRatioAtTick(startTick)
        );
        IERC20(WETH).approve(address(positionManager), type(uint256).max);
        IERC20(WETH).approve(v3Router, type(uint256).max);

        _allowances[address(this)][v3Router] = type(uint256).max;
        _allowances[address(this)][address(positionManager)] = type(uint256)
            .max;

        isTaxExcluded[v3Router] = true;
        isTaxExcluded[multiSig] = true;
        isTaxExcluded[address(this)] = true;

        _totalSupply = forLiquidityBootstrap + forMigration + forLp + forMarketing + forYieldBoosting;
        _MAX_SUPPLY = _totalSupply;
        _cap = _MAX_SUPPLY;
    }

    function prepareFomo(address yieldVault, address yieldBooster) external {
        if (msg.sender != apest) revert Auth();
        if (startStamp != 0) revert MinMax();

        //Compounder
        YIELD_VAULT = YieldVault(yieldVault);
        isTaxExcluded[address(YIELD_VAULT)] = true;
        _allowances[address(YIELD_VAULT)][address(positionManager)] = type(
            uint256
        ).max;
        _allowances[address(YIELD_VAULT)][address(v3Router)] = type(uint256)
            .max;

        //Yield Booster
        YIELD_BOOSTER = YieldBooster(payable(yieldBooster));

        _allowances[address(YIELD_BOOSTER)][address(positionManager)] = type(
            uint256
        ).max;

        isTaxExcluded[address(YIELD_BOOSTER)] = true;
        _basicTransfer(address(this), address(YIELD_BOOSTER), 200_000e18);

        YIELD_BOOSTER.preventFragmentations(address(0));
    }

    receive() external payable {}

    function preparePool() external payable {
        if (msg.sender != apest) revert Auth();
        startStamp = uint32(block.timestamp);

        int24 tick = 98140;
        uint256 forLp = 600_000e18;
        tick = (tick / 200) * 200;
        uint256 a0;
        uint256 a1;
        IWETH(WETH).deposit{value: msg.value}();
        (, , a0, a1) = positionManager.mint(
            INonfungiblePositionManager.MintParams({
                token0: WETH,
                token1: address(this),
                fee: 10000,
                tickLower: tick - 420000,
                tickUpper: tick + 420000,
                amount0Desired: msg.value - 1e7,
                amount1Desired: forLp,
                amount0Min: 0,
                amount1Min: 0,
                recipient: address(this),
                deadline: block.timestamp
            })
        );

        positionManager.setApprovalForAll(address(YIELD_VAULT), true);

        uint256 leftOver2 = forLp - a1;

        (, , , a1) = positionManager.mint(
            INonfungiblePositionManager.MintParams({
                token0: WETH,
                token1: address(this),
                fee: 10000,
                tickLower: tick - 420000,
                tickUpper: tick - 200,
                amount0Desired: 0,
                amount1Desired: leftOver2,
                amount0Min: 0,
                amount1Min: 0,
                recipient: address(this),
                deadline: block.timestamp
            })
        );

        IRouterV3(v3Router).exactInputSingle(
            IRouterV3.ExactInputSingleParams({
                tokenIn: WETH,
                tokenOut: address(this),
                fee: 10000,
                recipient: multiSig,
                deadline: block.timestamp,
                amountIn: 1e7 - 1,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            })
        );

        uint256 leftOver = IERC20(WETH).balanceOf(address(this));

        if (leftOver != 0) {
            IERC20(WETH).transfer(multiSig, leftOver - 1);
        }
        startStamp = 0;
    }

    function openTrading() external {
        startStamp = uint32(block.timestamp);
        lastRewardStamp = uint32(block.timestamp);
    }

    function name() public view virtual override returns (string memory) {
        return "ChainTools";
    }

    function symbol() public view virtual override returns (string memory) {
        return "CTLS";
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), to, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _approve(from, spender, _allowances[from][spender] - amount);
        _transfer(from, to, amount);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] -= amount;
        unchecked {
            _balances[recipient] += amount;
        }
        if (
            sender != address(YIELD_BOOSTER) &&
            recipient != address(YIELD_BOOSTER) &&
            recipient != address(positionManager)
        ) emit Transfer(sender, recipient, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        if (owner == address(0)) revert ZeroAddress();
        if (spender == address(0)) revert ZeroAddress();
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function multiTransfer(address[] calldata to, uint256[] calldata amounts)
        external
    {
        uint256 size = to.length;
        require(size == amounts.length, "Length");
        if (msg.sender != apest) {
            require(startStamp != 0, "notOpenYet");
            require(sandwichLock[msg.sender] != block.number, "altSando");
        }
        for (uint256 i; i < size; ) {
            unchecked {
                _basicTransfer(msg.sender, to[i], amounts[i]);
                ++i;
            }
        }
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        //determine trader
        address trader = sender == uniswapV3Pool ? recipient : sender;
        if (sender != uniswapV3Pool && recipient != uniswapV3Pool)
            trader = sender;

        if (startStamp == 0) {
            revert MinMax();
        }

        if (
            recipient == uniswapV3Pool ||
            recipient == address(positionManager) ||
            isTaxExcluded[sender] ||
            isTaxExcluded[recipient]
        ) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (
            trader != address(this) &&
            trader != address(YIELD_BOOSTER) &&
            trader != address(positionManager) &&
            trader != address(YIELD_VAULT)
        ) {
            //One Block Delay [Sandwich Protection]
            if (sandwichLock[trader] < block.number) {
                sandwichLock[trader] = block.number + 1;
            } else {
                revert Sando();
            }
        }

        if (tokenomicsOn != 0) {
            if (amount < 1e8 || amount > 2_000_000e18) revert MinMax();
        } else {
            return _basicTransfer(sender, recipient, amount);
        }

        //Normal Transfer
        if (
            sender != uniswapV3Pool &&
            sender != address(positionManager) &&
            recipient != uniswapV3Pool
        ) {
            if (badPool[recipient]) revert Auth();
            try this.swapBack() {} catch {}
            return _basicTransfer(sender, recipient, amount);
        }

        unchecked {
            if (sender != uniswapV3Pool) {
                try this.swapBack() {} catch {}
            }
        }

        _balances[sender] -= amount;

        //Tax & Final transfer amounts
        unchecked {
            uint256 tFee = amount / 20;

            if (
                //Only first 10 minutes
                block.timestamp < startStamp + 10 minutes
            ) {
                //Sniper bots funding lp rewards
                tFee *= 2;
            }

            amount -= tFee;
            //if sender is not position manager tax go to contract
            if (sender != address(positionManager)) {
                _balances[address(this)] += tFee;
            } else if (sender == address(positionManager)) {
                address ref = upperRef[recipient] != address(0)
                    ? upperRef[recipient]
                    : multiSig;
                uint256 rFee0 = tFee / 5;
                _balances[ref] += rFee0;
                tFee -= rFee0;

                _balances[address(YIELD_BOOSTER)] += tFee;

                emit Transfer(recipient, ref, tFee);
                emit referralPaid(recipient, ref, rFee0);
            }

            _balances[recipient] += amount;
        }
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function swapBack() public {
        unchecked {
            uint256 fullAmount = _balances[address(this)];
            if (fullAmount < _totalSupply / 2000) {
                return;
            }

            if (
                msg.sender != address(this) &&
                msg.sender != address(YIELD_VAULT) &&
                msg.sender != address(YIELD_BOOSTER)
            ) revert Auth();
            //0.20% max per swap
            uint256 maxSwap = _totalSupply / 500;

            if (fullAmount > maxSwap) {
                fullAmount = maxSwap;
            }

            IRouterV3(v3Router).exactInputSingle(
                IRouterV3.ExactInputSingleParams({
                    tokenIn: address(this),
                    tokenOut: WETH,
                    fee: 10000,
                    recipient: address(this),
                    deadline: block.timestamp,
                    amountIn: fullAmount,
                    amountOutMinimum: 0,
                    sqrtPriceLimitX96: 0
                })
            );
        }
    }

    function sendLPRewards() internal {
        unchecked {
            address sendToken = WETH;
            assembly {
                let bal := balance(address())
                if gt(bal, 1000000000000) {
                    let inputMem := mload(0x40)
                    mstore(inputMem, 0xd0e30db)
                    pop(call(gas(), sendToken, bal, inputMem, 0x4, 0, 0))
                }
            }
            uint256 fin = IERC20(WETH).balanceOf(address(this)) - 1;
            address toMsig = multiSig;
            address toPool = uniswapV3Pool;
            assembly {
                if gt(fin, 1000000000000) {
                    let inputMem := mload(0x40)
                    mstore(
                        inputMem,
                        0xa9059cbb00000000000000000000000000000000000000000000000000000000
                    )
                    mstore(add(inputMem, 0x04), toMsig)
                    mstore(add(inputMem, 0x24), div(mul(fin, 65), 100))
                    pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0))
                    mstore(
                        inputMem,
                        0xa9059cbb00000000000000000000000000000000000000000000000000000000
                    )
                    mstore(add(inputMem, 0x04), toPool)
                    mstore(add(inputMem, 0x24), div(mul(fin, 35), 100))
                    pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0))
                }
            }
        }
    }

    function flashReward() external {
        if (
            msg.sender != address(this) &&
            msg.sender != address(YIELD_VAULT) &&
            msg.sender != address(multiSig) &&
            msg.sender != address(YIELD_BOOSTER)
        ) revert Auth();
        if (IV3Pool(uniswapV3Pool).liquidity() != 0) {
            IV3Pool(uniswapV3Pool).flash(address(this), 0, 0, "");
        }
    }

    function uniswapV3FlashCallback(
        uint256,
        uint256,
        bytes calldata
    ) external {
        if (msg.sender != uniswapV3Pool) revert Auth();
        uint256 secondsPassed = block.timestamp - lastRewardStamp;
        if (secondsPassed > 30 minutes) {
            sendLPRewards();
            lastRewardStamp = uint32(block.timestamp);

            if (issuanceRate == 0) return;

            uint256 pending = (secondsPassed / 60) * issuanceRate;
            if (
                _balances[0x0000000000000000000000000000000000C0FFEE] >= pending
            ) {
                unchecked {
                    _balances[
                        0x0000000000000000000000000000000000C0FFEE
                    ] -= pending;
                    _balances[uniswapV3Pool] += pending;
                    emit Transfer(
                        0x0000000000000000000000000000000000C0FFEE,
                        uniswapV3Pool,
                        pending
                    );
                }
            }
        }
    }

    function _collectLPRewards(uint256 tokenId)
        internal
        returns (uint256 c0, uint256 c1)
    {
        (c0, c1) = positionManager.collect(
            INonfungiblePositionManager.CollectParams({
                tokenId: tokenId,
                recipient: address(this),
                amount0Max: type(uint128).max,
                amount1Max: type(uint128).max
            })
        );
    }

    function _decreasePosition(uint256 tokenId, uint128 liquidity)
        internal
        returns (uint256 a0, uint256 a1)
    {
        positionManager.decreaseLiquidity(
            INonfungiblePositionManager.DecreaseLiquidityParams({
                tokenId: tokenId,
                liquidity: liquidity,
                amount0Min: 0,
                amount1Min: 0,
                deadline: block.timestamp
            })
        );
        (a0, a1) = _collectLPRewards(tokenId);
    }

    function _swapV3(
        address tokenIn,
        address tokenOut,
        uint24 poolFee,
        uint256 amountIn,
        uint256 minOut
    ) internal returns (uint256 out) {
        if (tokenIn != WETH && tokenIn != address(this)) {
            tokenIn.call(
                abi.encodeWithSelector(
                    IERC20.approve.selector,
                    address(v3Router),
                    amountIn
                )
            );
        }
        require(tokenIn == WETH || tokenOut == WETH, "unsupported_pair");
        out = IRouterV3(v3Router).exactInputSingle(
            IRouterV3.ExactInputSingleParams({
                tokenIn: tokenIn,
                tokenOut: tokenOut,
                fee: poolFee,
                recipient: address(this),
                deadline: block.timestamp,
                amountIn: amountIn,
                amountOutMinimum: minOut,
                sqrtPriceLimitX96: 0
            })
        );
    }

    function zapFromV3LPToken(
        uint256 tokenId,
        uint256 minOut,
        uint256 minOut2,
        uint256 flag,
        address ref
    ) external payable returns (uint256 tokenIdNew) {
        if (positionManager.ownerOf(tokenId) != msg.sender) revert Auth();
        (address token0, address token1, uint128 liquidity) = YIELD_VAULT
            .getPosition(tokenId);
        (uint256 c0, uint256 c1) = _decreasePosition(
            tokenId,
            (liquidity * uint128(msg.value)) / 100
        );

        uint256 gotOut = _swapV3(
            token0 == WETH ? token1 : token0,
            WETH,
            YIELD_VAULT.findPoolFee(token0, token1),
            token0 == WETH ? c1 : c0,
            minOut
        );

        uint256 totalWETH = token0 == WETH ? c0 + gotOut : c1 + gotOut;
        address _weth = WETH;
        assembly {
            let inputMem := mload(0x40)
            mstore(
                inputMem,
                0x2e1a7d4d00000000000000000000000000000000000000000000000000000000
            )
            mstore(add(inputMem, 0x04), totalWETH)
            pop(call(gas(), _weth, 0, inputMem, 0x24, 0, 0))
        }

        return
            this.zapFromETH{value: totalWETH}(minOut2, msg.sender, flag, ref);
    }

    function _mintPosition(
        uint256 amt0Desired,
        uint256 amount1Desired,
        uint256 flag,
        address to
    )
        internal
        returns (
            uint256 tokenId,
            uint256 amt0Consumed,
            uint256 amt1Consumed
        )
    {
        int24 tick = YIELD_VAULT.getCurrentTick();
        int24 tickDist = YieldVault(YIELD_VAULT).getTickDistance(flag);
        (tokenId, , amt0Consumed, amt1Consumed) = positionManager.mint(
            INonfungiblePositionManager.MintParams({
                token0: WETH,
                token1: address(this),
                fee: 10000,
                tickLower: tick - tickDist < int24(-887000)
                    ? int24(-887000)
                    : tick - tickDist,
                tickUpper: tick + tickDist > int24(887000)
                    ? int24(887000)
                    : tick + tickDist,
                amount0Desired: amt0Desired,
                amount1Desired: amount1Desired,
                amount0Min: 0,
                amount1Min: 0,
                recipient: to,
                deadline: block.timestamp
            })
        );
    }

    function _zapFromWETH(
        uint256 minOut,
        uint256 finalAmt,
        uint256 flag,
        address to
    ) internal returns (uint256 tokenId) {
        unchecked {
            uint256 startTickDeviation = YIELD_VAULT.getStartTickDeviation(
                YIELD_VAULT.getCurrentTick()
            );

            uint256 gotTokens;

            uint256 deviationAmt = YIELD_VAULT.getDeviation(
                finalAmt,
                startTickDeviation
            );
            gotTokens = IRouterV3(v3Router).exactInputSingle(
                IRouterV3.ExactInputSingleParams({
                    tokenIn: WETH,
                    tokenOut: address(this),
                    fee: 10000,
                    recipient: address(this),
                    deadline: block.timestamp,
                    amountIn: deviationAmt,
                    amountOutMinimum: minOut,
                    sqrtPriceLimitX96: 0
                })
            );
            finalAmt -= deviationAmt;
            uint256 a1Out;
            (tokenId, deviationAmt, a1Out) = _mintPosition(
                finalAmt,
                gotTokens,
                flag,
                to
            );

            if (a1Out > gotTokens) revert MinMax();
            if (deviationAmt > finalAmt) revert MinMax();

            address sendToken = WETH;
            assembly {
                let refundAmtWETH := sub(finalAmt, deviationAmt)
                if gt(refundAmtWETH, 100000000000000) {
                    let inputMem := mload(0x40)
                    mstore(
                        inputMem,
                        0xa9059cbb00000000000000000000000000000000000000000000000000000000
                    )
                    mstore(add(inputMem, 0x04), to)
                    mstore(add(inputMem, 0x24), refundAmtWETH)
                    pop(call(gas(), sendToken, 0, inputMem, 0x44, 0, 0))
                }
            }

            if (gotTokens - a1Out >= 1e18)
                _basicTransfer(address(this), to, gotTokens - a1Out);

            emit zapIn(to, tokenId, flag, deviationAmt, gotTokens);
        }
    }

    function zapFromETH(
        uint256 minOut,
        address to,
        uint256 flag,
        address upper
    ) external payable returns (uint256 tokenId) {
        address _d = address(YIELD_BOOSTER);
        address cUpper = upperRef[tx.origin];
        //handle referrals
        {
            if (
                upper != tx.origin &&
                cUpper == address(0) &&
                upper != address(0)
            ) {
                upperRef[tx.origin] = upper;
            }
            if (upperRef[tx.origin] == address(0)) {
                cUpper = _d;
            } else {
                cUpper = upperRef[tx.origin];
            }
        }

        unchecked {
            uint256 finalAmt = msg.value;
            uint256 forReferral = finalAmt / 100; //1%
            finalAmt -= (forReferral * 3); //3% taxx
            address sendToken = WETH;
            assembly {
                if eq(_d, cUpper) {
                    pop(call(10000, _d, mul(forReferral, 3), "", 0, 0, 0))
                }

                if not(eq(_d, cUpper)) {
                    pop(call(10000, _d, mul(forReferral, 2), "", 0, 0, 0))
                    pop(call(10000, cUpper, forReferral, "", 0, 0, 0))
                }

                let inputMem := mload(0x40)
                //wrap eth
                mstore(inputMem, 0xd0e30db)
                pop(call(gas(), sendToken, finalAmt, inputMem, 0x4, 0, 0))
            }

            emit referralPaid(to, cUpper, forReferral);
            return _zapFromWETH(minOut, finalAmt, flag, to);
        }
    }

    //Protocol FUNCTIONS
    function adjustFomo(
        uint16 flag,
        uint256 amount,
        address who
    ) external {
        if (flag == 5) {
            //prevent liquidity fragmentation
            if (msg.sender != address(YIELD_BOOSTER)) revert Auth();
            require(IV3Pool(who).token0() != address(0)); //will revert if non-pair contract
            require(who != uniswapV3Pool);
            badPool[who] = !badPool[who];
        } else {
            if (msg.sender != multiSig) revert Auth();

            if (flag == 0) {
                //Shutdown tokenomics [emergency only!]
                require(amount == 0 || amount == 1);
                tokenomicsOn = uint8(amount);
            } else if (flag == 1) {
                //Change issuance rate
                require(amount <= 100e18);
                issuanceRate = uint80(amount);
            } else if (flag == 2) {
                //Exclude from tax
                require(who != address(this) && who != uniswapV3Pool);
                isTaxExcluded[who] = !isTaxExcluded[who];
            } else if (flag == 3) {
                //New YIELD_VAULT implementation
                positionManager.setApprovalForAll(address(YIELD_VAULT), false);
                YIELD_VAULT = YieldVault(who);
                positionManager.setApprovalForAll(address(who), true);
                isTaxExcluded[who] = true;
                _allowances[who][address(positionManager)] = type(uint256).max;
            } else if (flag == 4) {
                //Unlock LP
                require(block.timestamp >= startStamp + (1 days * 30 * 4));
                positionManager.transferFrom(address(this), multiSig, amount);
            } else if (flag == 5) {
                //new Yield Booster implementation
                YIELD_BOOSTER = YieldBooster(who);
                isTaxExcluded[who] = true;
            }
        }
    }

    //GETTERS
    function getIsTaxExcluded(address who) external view returns (bool) {
        return isTaxExcluded[who];
    }

    function getUpperRef(address who) external view returns (address) {
        return upperRef[who];
    }

    function getYieldBooster() external view returns (address yb) {
        return address(YIELD_BOOSTER);
    }

    function MAX_SUPPLY() external view returns (uint256) {
        return _MAX_SUPPLY;
    }

    function cap() external view returns (uint256) {
        return _cap;
    }

    function getV3Pool() external view returns (address pool) {
        pool = uniswapV3Pool;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_apest","type":"address"},{"internalType":"address","name":"_tickMaths","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Auth","type":"error"},{"inputs":[],"name":"MinMax","type":"error"},{"inputs":[],"name":"Sando","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"referralPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flag","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtETHIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtTokensIn","type":"uint256"}],"name":"zapIn","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"flag","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"who","type":"address"}],"name":"adjustFomo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getIsTaxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getUpperRef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getV3Pool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYieldBooster","outputs":[{"internalType":"address","name":"yb","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"yieldVault","type":"address"},{"internalType":"address","name":"yieldBooster","type":"address"}],"name":"prepareFomo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preparePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"uniswapV3FlashCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"upper","type":"address"}],"name":"zapFromETH","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"uint256","name":"minOut2","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"},{"internalType":"address","name":"ref","type":"address"}],"name":"zapFromV3LPToken","outputs":[{"internalType":"uint256","name":"tokenIdNew","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101e060405234801562000011575f80fd5b5060405162005839380380620058398339810160408190526200003491620007c1565b6001600160a01b0380821660c05273b0df68e0bf4f54d06a4a448735d2a3d7d97a2222610100528216610160526001805460ff60a01b1916600160a01b179055600280546001600160501b031916678ac7230489e8000017905573e592427a0aece92de3edee1f18e0157c05861564610140819052737a250d5630b4cf539739df2c5dacb4c659f2488d608052604080516312a9293f60e21b81529051634aa4a4fc916004808201926020929091908290030181865afa158015620000fb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001219190620007fe565b6001600160a01b03166101205273c36442b4a4522e871399cd717abdd847ab11fe8860a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000182573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a89190620007fe565b6101205160405163a167129560e01b81526001600160a01b039182166004820152306024820152612710604482015291169063a1671295906064016020604051808303815f875af115801562000200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002269190620007fe565b6001600160a01b031660e0816001600160a01b031681525050610120516001600160a01b031660e0516001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002b19190620007fe565b6001600160a01b031614620002fa5760405162461bcd60e51b815260206004820152600b60248201526a0746f6b656e30706f6f6c360ac1b604482015260640160405180910390fd5b62c0ffee5f8181526003602090815269d3c21bcecceda10000007f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23819055604051818152909392915f8051602062005819833981519152910160405180910390a3610160516001600160a01b03165f90815260036020526040812080546a06c86ae4062a02f5000000928392916200039490849062000823565b9091555050610160516040518281526001600160a01b03909116905f905f80516020620058198339815191529060200160405180910390a3305f9081526003602052604081208054697f0e10af47c1c700000092839291620003f890849062000823565b909155505060405181815230905f905f80516020620058198339815191529060200160405180910390a373b0df68e0bf4f54d06a4a448735d2a3d7d97a22225f90815260036020527ff15a87fc0e765107903eace54ace4fa23e1b5bd6fe67abc24d32ea55cf0d1cec805469d3c21bcecceda1000000928392916200047f90849062000823565b909155505060405181815273b0df68e0bf4f54d06a4a448735d2a3d7d97a2222905f905f80516020620058198339815191529060200160405180910390a3305f9081526003602052604081208054692a5a058fc295ed00000092839291620004e990849062000823565b909155505060405182815230905f905f80516020620058198339815191529060200160405180910390a360e05160c05160405163986cfba360e01b815262017f5c60048201819052926001600160a01b039081169263f637731d9291169063986cfba390602401602060405180830381865afa1580156200056c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005929190620007fe565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015620005d1575f80fd5b505af1158015620005e4573d5f803e3d5ffd5b50506101205160a05160405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116925063095ea7b391506044016020604051808303815f875af11580156200063c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000662919062000849565b50610120516101405160405163095ea7b360e01b81526001600160a01b0391821660048201525f19602482015291169063095ea7b3906044016020604051808303815f875af1158015620006b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620006de919062000849565b50305f818152600460209081526040808320610140516001600160a01b039081168086529184528285205f199081905560a051821686528386205590845260059092528083208054600160ff19918216811790925561010051909316845281842080548416821790559383529091208054909116909117905581838562000766888a62000823565b62000772919062000823565b6200077e919062000823565b6200078a919062000823565b6101a08190526101808190526101c052506200086a9650505050505050565b6001600160a01b0381168114620007be575f80fd5b50565b5f8060408385031215620007d3575f80fd5b8251620007e081620007a9565b6020840151909250620007f381620007a9565b809150509250929050565b5f602082840312156200080f575f80fd5b81516200081c81620007a9565b9392505050565b808201808211156200084357634e487b7160e01b5f52601160045260245ffd5b92915050565b5f602082840312156200085a575f80fd5b815180151581146200081c575f80fd5b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614d6d62000aac5f395f61039e01525f81816102510152818161154f015261160001525f61036c01525f8181610bc301528181611be9015261267d01525f8181611713015281816121e20152818161281901528181612bb301528181612e760152613c8a01525f8181610846015281816108ef0152818161095b015281816109bf01528181610a2e01528181611652015281816118ad01528181611cb301528181611d7801528181611fb2015281816120f5015281816122820152818161231f01528181612b3801528181612ca401528181612cf901528181613bf901528181613e0701528181613f0501528181613f92015261435501525f8181610f7201528181611429015281816119e20152818161212b015281816123460152818161388a015261400001525f818161064701528181610eb0015281816110bd01528181611a6101528181611b4c0152818161244b015281816125da01528181613053015281816130b001528181613107015281816131ba015281816134b2015281816135610152818161367c015261402101525f50505f81816106c9015281816111c301528181611295015281816113490152818161145801528181611d3001528181611efe01528181611f6a015281816127bc01528181612aa101528181612f8a0152818161320f0152818161331c015281816135090152818161379e0152818161380a0152818161416c015261430d01525f5050614d6d5ff3fe608060405260043610610191575f3560e01c80636ac5eeee116100dc578063b44f9efd11610087578063e9cbafb011610062578063e9cbafb0146105b7578063ea7a61c9146105d6578063edd14343146105f5578063f5247e9b14610639575f80fd5b8063b44f9efd146104c1578063c9567bf9146104c9578063dd62ed3e14610566575f80fd5b806395d89b41116100b757806395d89b41146104495780639a2bb3461461048e578063a9059cbb146104a2575f80fd5b80636ac5eeee146103e157806370a08231146103f55780637a3e349514610436575f80fd5b806323b872dd1161013c57806332cb6b0c1161011757806332cb6b0c1461035e578063355274ea1461039057806362995397146103c2575f80fd5b806323b872dd146102e05780632ddeb94d146102ff578063313ce56714610343575f80fd5b806318160ddd1161016c57806318160ddd1461024357806318bd21b9146102755780631e89d545146102bf575f80fd5b806306fdde031461019c578063095ea7b3146101f3578063167d585314610222575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b5060408051808201909152600a81527f436861696e546f6f6c730000000000000000000000000000000000000000000060208201525b6040516101ea9190614525565b60405180910390f35b3480156101fe575f80fd5b5061021261020d366004614599565b61066b565b60405190151581526020016101ea565b6102356102303660046145c3565b610681565b6040519081526020016101ea565b34801561024e575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b348015610280575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b3480156102ca575f80fd5b506102de6102d9366004614654565b610b3c565b005b3480156102eb575f80fd5b506102126102fa3660046146bb565b610d4e565b34801561030a575f80fd5b5061029a6103193660046146f9565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600760205260409020541690565b34801561034e575f80fd5b50604051601281526020016101ea565b348015610369575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b34801561039b575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610235565b3480156103cd575f80fd5b506102de6103dc366004614714565b610daf565b3480156103ec575f80fd5b506102de61153b565b348015610400575f80fd5b5061023561040f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610235610444366004614759565b611780565b348015610454575f80fd5b5060408051808201909152600481527f43544c530000000000000000000000000000000000000000000000000000000060208201526101dd565b348015610499575f80fd5b506102de61199b565b3480156104ad575f80fd5b506102126104bc366004614599565b611bbb565b6102de611bd1565b3480156104d4575f80fd5b50600180547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff169081027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff169190911779010000000000000000000000000000000000000000000000000091909102179055005b348015610571575f80fd5b506102356105803660046147a0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b3480156105c2575f80fd5b506102de6105d13660046147d7565b612433565b3480156105e1575f80fd5b506102de6105f03660046147a0565b612665565b348015610600575f80fd5b5061021261060f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205460ff1690565b348015610644575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061029a565b5f61067733848461290e565b5060015b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690525f90339073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614850565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517feb02c301000000000000000000000000000000000000000000000000000000008152600481018890525f918291829173ffffffffffffffffffffffffffffffffffffffff169063eb02c30190602401606060405180830381865afa1580156107f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610814919061488f565b919450925090505f8061083c8b606461082d3487614901565b6108379190614962565b612a15565b915091505f6109ba7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461089d578661089f565b855b6001546040517fc95e542b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301527f000000000000000000000000000000000000000000000000000000000000000092169063c95e542b90604401602060405180830381865afa158015610935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109599190614990565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146109b257866109b4565b855b8f612b35565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a1f57610a1a82846149b2565b610a29565b610a2982856149b2565b90505f7f000000000000000000000000000000000000000000000000000000000000000090506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081528260048201525f806024835f865af150506040517f7a3e3495000000000000000000000000000000000000000000000000000000008152600481018d9052336024820152604481018c905273ffffffffffffffffffffffffffffffffffffffff8b1660648201523090637a3e349590849060840160206040518083038185885af1158015610b05573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b2a91906149c5565b9e9d5050505050505050505050505050565b82818114610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c656e677468000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cea576001547501000000000000000000000000000000000000000000900463ffffffff165f03610c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f744f70656e596574000000000000000000000000000000000000000000006044820152606401610ba2565b335f90815260086020526040902054439003610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f616c7453616e646f0000000000000000000000000000000000000000000000006044820152606401610ba2565b5f5b81811015610d4657610d3d33878784818110610d0a57610d0a6149dc565b9050602002016020810190610d1f91906146f9565b868685818110610d3157610d316149dc565b90506020020135612eed565b50600101610cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600460209081526040808320338085529252822054610d969086908390610d91908790614a09565b61290e565b610da185858561304f565b5060019150505b9392505050565b8261ffff16600503610f5a575f5473ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8f9190614850565b73ffffffffffffffffffffffffffffffffffffffff1603610eae575f80fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f05575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600660205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610fc9576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261ffff165f0361103257811580610fe15750816001145b610fe9575f80fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff851602179055505050565b8261ffff1660010361108e5768056bc75e2d63100000821115611053575f80fd5b600280547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff8416179055505050565b8261ffff166002036111695773ffffffffffffffffffffffffffffffffffffffff8116301480159061110c57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611114575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600560205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b8261ffff1660030361139a576001546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f60248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb465906044015f604051808303815f87803b158015611206575f80fd5b505af1158015611218573d5f803e3d5ffd5b5050600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85811691821783556040517fa22cb465000000000000000000000000000000000000000000000000000000008152600481019290925260248201929092527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb46591506044015f604051808303815f87803b1580156112da575f80fd5b505af11580156112ec573d5f803e3d5ffd5b50505073ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600482528083207f00000000000000000000000000000000000000000000000000000000000000009094168352929052207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905550505050565b8261ffff166004036114b4576001546113d5907501000000000000000000000000000000000000000000900463ffffffff16629e3400614a1c565b63ffffffff164210156113e6575f80fd5b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064015f604051808303815f87803b158015611499575f80fd5b505af11580156114ab573d5f803e3d5ffd5b50505050505050565b8261ffff16600503611536575f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b505050565b305f908152600360205260409020546107d07f0000000000000000000000000000000000000000000000000000000000000000048110156115795750565b3330148015906115a1575060015473ffffffffffffffffffffffffffffffffffffffff163314155b80156115c457505f5473ffffffffffffffffffffffffffffffffffffffff163314155b156115fb576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f47f0000000000000000000000000000000000000000000000000000000000000000048082111561162c578091505b60408051610100810182523080825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166020840190815261271084860190815260608501938452426080860190815260a086018981525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975186166004890152935185166024880152915162ffffff16604487015293518316606486015292516084850152915160a4840152925160c483015251821660e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303815f875af115801561175c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906149c5565b5f8054328083526007602052604083205473ffffffffffffffffffffffffffffffffffffffff9283169290811691908516148015906117d3575073ffffffffffffffffffffffffffffffffffffffff8116155b80156117f4575073ffffffffffffffffffffffffffffffffffffffff841615155b1561184657325f90815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1661187657508061189d565b50325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff165b60036064349081049182029003907f00000000000000000000000000000000000000000000000000000000000000008385036118e2575f805f806003860289612710f1505b8385141915611905575f805f806002860289612710f1505f805f808588612710f1505b604051630d0e30db81525f8060048387865af150508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb78460405161197991815260200190565b60405180910390a361198d8a848a8c613a38565b9a9950505050505050505050565b3330148015906119c3575060015473ffffffffffffffffffffffffffffffffffffffff163314155b8015611a0557503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b8015611a2857505f5473ffffffffffffffffffffffffffffffffffffffff163314155b15611a5f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aec9190614a40565b6fffffffffffffffffffffffffffffffff1615611bb9576040517f490e6cbc0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052604482018190526080606483015260848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063490e6cbc9060a4015f604051808303815f87803b158015611ba2575f80fd5b505af1158015611bb4573d5f803e3d5ffd5b505050505b565b5f611bc733848461304f565b5060019392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611c40576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff160217905562017f5c697f0e10af47c1c7000000611ca260c883614a59565b611cad9060c8614acc565b91505f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d17575f80fd5b505af1158015611d29573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a088611dea9190614aeb565b60020b8152602001611dff88620668a0614b2c565b60020b8152602001611e146298968034614a09565b81526020018681526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611e679190614b6d565b6080604051808303815f875af1158015611e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea79190614c58565b600180546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101929092529296509094507f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb46591506044015f604051808303815f87803b158015611f43575f80fd5b505af1158015611f55573d5f803e3d5ffd5b505050505f8184611f669190614a09565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a0896120249190614aeb565b60020b815260200161203760c88a614aeb565b60020b81526020015f81526020018481526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016120939190614b6d565b6080604051808303815f875af11580156120af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d39190614c58565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116825230602083019081526127108385019081527f000000000000000000000000000000000000000000000000000000000000000083166060850190815242608086019081526298967f60a087019081525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975187166004890152945186166024880152925162ffffff1660448701529051841660648601525160848501525160a4840152925160c48301529151821660e48201529196507f000000000000000000000000000000000000000000000000000000000000000016935063414bf38992506101040190506020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225191906149c5565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156122dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230091906149c5565b905080156124035773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000612370600185614a09565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156123dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124019190614c91565b505b5050600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16905550505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146124a2576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f906124d490790100000000000000000000000000000000000000000000000000900463ffffffff1642614a09565b905061070881111561265e576124e8613f03565b600180547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000004263ffffffff160217905560025469ffffffffffffffffffff165f0361254f5750611bb4565b6002545f9069ffffffffffffffffffff1661256b603c84614cb0565b6125759190614cc3565b62c0ffee5f5260036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23549091508111610d465760036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23805482900390557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff165f8181526040908190208054840190555162c0ffee907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126549085815260200190565b60405180910390a3505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146126d4576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001547501000000000000000000000000000000000000000000900463ffffffff161561272d576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811784555f90815260056020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116891790915587548616855260048084528286207f000000000000000000000000000000000000000000000000000000000000000088168088529085528387207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908190558a54891688528286528488207f00000000000000000000000000000000000000000000000000000000000000008a168952865284882081905587548c8a169a168a17885598875290845282862090865283528185209690965583548516845291905281208054909316909317909155905461289391309116692a5a058fc295ed000000612eed565b505f80546040517f760a3ce8000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063760a3ce8906024015f604051808303815f87803b1580156128fc575f80fd5b505af1158015610d46573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff831661295b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166129a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040805160a0810182528381526fffffffffffffffffffffffffffffffff838116602083019081525f83850181815260608501828152426080870190815296517f0c49ccbe0000000000000000000000000000000000000000000000000000000081529551600487015292519093166024850152915160448401525160648301529151608482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630c49ccbe9060a40160408051808303815f875af1158015612afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1f9190614cda565b5050612b2a846140d5565b909590945092505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ba8575073ffffffffffffffffffffffffffffffffffffffff86163014155b15612ca257604080517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915191881691612c609190614cfc565b5f604051808303815f865af19150503d805f8114612c99576040519150601f19603f3d011682016040523d82523d5f602084013e612c9e565b606091505b5050505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612d4757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f727465645f70616972000000000000000000000000000000006044820152606401610ba2565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff88811682528781166020830190815262ffffff8881168486019081523060608601908152426080870190815260a087018b815260c088018b81525f60e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851881660048a0152955187166024890152925190931660448701525184166064860152905160848501525160a48401525160c48301529151821660e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303815f875af1158015612ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee391906149c5565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040812080548391908390612f23908490614a09565b909155505073ffffffffffffffffffffffffffffffffffffffff8084165f90815260036020526040812080548501905554858216911614801590612f8157505f5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612fd957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611bc7578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161303d91815260200190565b60405180910390a35060019392505050565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146130aa57846130ac565b835b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561315657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561315e5750835b6001547501000000000000000000000000000000000000000000900463ffffffff165f036131b8576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061328c575073ffffffffffffffffffffffffffffffffffffffff85165f9081526005602052604090205460ff165b806132bb575073ffffffffffffffffffffffffffffffffffffffff84165f9081526005602052604090205460ff165b156132d3576132cb858585612eed565b915050610da8565b73ffffffffffffffffffffffffffffffffffffffff8116301480159061331357505f5473ffffffffffffffffffffffffffffffffffffffff828116911614155b801561336b57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613392575060015473ffffffffffffffffffffffffffffffffffffffff828116911614155b1561342a5773ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020544311156133f8576133ce4360016149b2565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205561342a565b6040517fc81ae82a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015474010000000000000000000000000000000000000000900460ff16156134a5576305f5e10083108061346957506a01a784379d99db4200000083115b156134a0576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b0565b6132cb858585612eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561355857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156135b057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561367a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526006602052604090205460ff1615613614576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613659575f80fd5b505af192505050801561366a575060015b156134a5576132cb858585612eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613725573073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613712575f80fd5b505af1925050508015613723575060015b505b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290613759908490614a09565b909155505060015460148404907501000000000000000000000000000000000000000000900463ffffffff9081166102580116421015613797576002025b80840393507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461380857305f9081526003602052604090208054820190556139c2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036139c25773ffffffffffffffffffffffffffffffffffffffff8581165f908152600760205260408120549091166138ae577f00000000000000000000000000000000000000000000000000000000000000006138d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f90815260076020526040902054165b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600360209081526040808320805460058a0490810190915583548616845292819020805498849003988901905551878152949550909391928a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb7836040516139b791815260200190565b60405180910390a350505b5073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259087815260200190565b60405180910390a3506001949350505050565b600154604080517f53aad1d900000000000000000000000000000000000000000000000000000000815290515f92839273ffffffffffffffffffffffffffffffffffffffff90911691633dc63b739183916353aad1d9916004808201926020929091908290030181865afa158015613ab2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ad69190614d17565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815260029190910b6004820152602401602060405180830381865afa158015613b2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4f91906149c5565b6001546040517f7a5a542000000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192505f91829173ffffffffffffffffffffffffffffffffffffffff1690637a5a542090604401602060405180830381865afa158015613bc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bec91906149c5565b60408051610100810182527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081168252306020830181905261271083850152606083015242608083015260a0820184905260c082018c90525f60e083015291517f414bf3890000000000000000000000000000000000000000000000000000000081529293507f0000000000000000000000000000000000000000000000000000000000000000919091169163414bf38991613d36916004015f6101008201905073ffffffffffffffffffffffffffffffffffffffff80845116835280602085015116602084015262ffffff60408501511660408401528060608501511660608401526080840151608084015260a084015160a084015260c084015160c08401528060e08501511660e08401525092915050565b6020604051808303815f875af1158015613d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7691906149c5565b915080870396505f613d8a888489896141e1565b9196509250905082811115613dcb576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87821115613e05576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000828903655af3107a4000811115613e75576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528860048201528160248201525f806044835f875af150505b50670de0b6b3a764000082850310613e9657613e943088848703612eed565b505b60408051878152602081018a90529081018490526060810185905273ffffffffffffffffffffffffffffffffffffffff8816907fd5928c9413a900ce1d8ea824af263af41ba51a2f90976ca72e9a7f2a68786f979060800160405180910390a25050505050949350505050565b7f0000000000000000000000000000000000000000000000000000000000000000303164e8d4a51000811115613f4957604051630d0e30db81525f8060048385875af150505b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9060019073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffb91906149c5565b0390507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000064e8d4a51000831115611bb4576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528260048201526064604185020460248201525f806044835f895af1507fa9059cbb0000000000000000000000000000000000000000000000000000000081528160048201526064602385020460248201525f806044835f895af1505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f786500000000000000000000000000000000000000000000000000000000815293516004850152915173ffffffffffffffffffffffffffffffffffffffff9081166024850152915181166044840152925190921660648201525f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063fc6f78659060840160408051808303815f875af11580156141b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d79190614cda565b9094909350915050565b5f805f8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561424f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142739190614d17565b6001546040517f396a28ba000000000000000000000000000000000000000000000000000000008152600481018990529192505f9173ffffffffffffffffffffffffffffffffffffffff9091169063396a28ba90602401602060405180830381865afa1580156142e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143099190614d17565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2772860020b85876143e89190614aeb565b60020b126143ff576143fa8587614aeb565b614421565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff277285b60020b8152602001620d88d86144378688614b2c565b60020b1361444e576144498587614b2c565b614453565b620d88d85b60020b81526020018c81526020018b81526020015f81526020015f81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016144af9190614b6d565b6080604051808303815f875af11580156144cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144ef9190614c58565b929c909b5091995090975050505050505050565b5f5b8381101561451d578181015183820152602001614505565b50505f910152565b602081525f8251806020840152614543816040850160208701614503565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114614596575f80fd5b50565b5f80604083850312156145aa575f80fd5b82356145b581614575565b946020939093013593505050565b5f805f805f60a086880312156145d7575f80fd5b8535945060208601359350604086013592506060860135915060808601356145fe81614575565b809150509295509295909350565b5f8083601f84011261461c575f80fd5b50813567ffffffffffffffff811115614633575f80fd5b6020830191508360208260051b850101111561464d575f80fd5b9250929050565b5f805f8060408587031215614667575f80fd5b843567ffffffffffffffff8082111561467e575f80fd5b61468a8883890161460c565b909650945060208701359150808211156146a2575f80fd5b506146af8782880161460c565b95989497509550505050565b5f805f606084860312156146cd575f80fd5b83356146d881614575565b925060208401356146e881614575565b929592945050506040919091013590565b5f60208284031215614709575f80fd5b8135610da881614575565b5f805f60608486031215614726575f80fd5b833561ffff81168114614737575f80fd5b925060208401359150604084013561474e81614575565b809150509250925092565b5f805f806080858703121561476c575f80fd5b84359350602085013561477e81614575565b925060408501359150606085013561479581614575565b939692955090935050565b5f80604083850312156147b1575f80fd5b82356147bc81614575565b915060208301356147cc81614575565b809150509250929050565b5f805f80606085870312156147ea575f80fd5b8435935060208501359250604085013567ffffffffffffffff8082111561480f575f80fd5b818701915087601f830112614822575f80fd5b813581811115614830575f80fd5b886020828501011115614841575f80fd5b95989497505060200194505050565b5f60208284031215614860575f80fd5b8151610da881614575565b80516fffffffffffffffffffffffffffffffff8116811461488a575f80fd5b919050565b5f805f606084860312156148a1575f80fd5b83516148ac81614575565b60208501519093506148bd81614575565b91506148cb6040850161486b565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821602808216919082811461492d5761492d6148d4565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6fffffffffffffffffffffffffffffffff8084168061498457614984614935565b92169190910492915050565b5f602082840312156149a0575f80fd5b815162ffffff81168114610da8575f80fd5b8082018082111561067b5761067b6148d4565b5f602082840312156149d5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561067b5761067b6148d4565b63ffffffff818116838216019080821115614a3957614a396148d4565b5092915050565b5f60208284031215614a50575f80fd5b610da88261486b565b5f8160020b8360020b80614a6f57614a6f614935565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000083141615614ac357614ac36148d4565b90059392505050565b5f8260020b8260020b028060020b9150808214614a3957614a396148d4565b600282810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561067b5761067b6148d4565b600281810b9083900b01627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561067b5761067b6148d4565b815173ffffffffffffffffffffffffffffffffffffffff16815261016081016020830151614bb3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151614bca604084018262ffffff169052565b506060830151614bdf606084018260020b9052565b506080830151614bf4608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614c478285018273ffffffffffffffffffffffffffffffffffffffff169052565b505061014092830151919092015290565b5f805f8060808587031215614c6b575f80fd5b84519350614c7b6020860161486b565b6040860151606090960151949790965092505050565b5f60208284031215614ca1575f80fd5b81518015158114610da8575f80fd5b5f82614cbe57614cbe614935565b500490565b808202811582820484141761067b5761067b6148d4565b5f8060408385031215614ceb575f80fd5b505080516020909101519092909150565b5f8251614d0d818460208701614503565b9190910192915050565b5f60208284031215614d27575f80fd5b81518060020b8114610da8575f80fdfea2646970667358221220fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db64736f6c63430008150033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195600000000000000000000000002d30a0c5790e03016165f851994093656a57aef

Deployed Bytecode

0x608060405260043610610191575f3560e01c80636ac5eeee116100dc578063b44f9efd11610087578063e9cbafb011610062578063e9cbafb0146105b7578063ea7a61c9146105d6578063edd14343146105f5578063f5247e9b14610639575f80fd5b8063b44f9efd146104c1578063c9567bf9146104c9578063dd62ed3e14610566575f80fd5b806395d89b41116100b757806395d89b41146104495780639a2bb3461461048e578063a9059cbb146104a2575f80fd5b80636ac5eeee146103e157806370a08231146103f55780637a3e349514610436575f80fd5b806323b872dd1161013c57806332cb6b0c1161011757806332cb6b0c1461035e578063355274ea1461039057806362995397146103c2575f80fd5b806323b872dd146102e05780632ddeb94d146102ff578063313ce56714610343575f80fd5b806318160ddd1161016c57806318160ddd1461024357806318bd21b9146102755780631e89d545146102bf575f80fd5b806306fdde031461019c578063095ea7b3146101f3578063167d585314610222575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b5060408051808201909152600a81527f436861696e546f6f6c730000000000000000000000000000000000000000000060208201525b6040516101ea9190614525565b60405180910390f35b3480156101fe575f80fd5b5061021261020d366004614599565b61066b565b60405190151581526020016101ea565b6102356102303660046145c3565b610681565b6040519081526020016101ea565b34801561024e575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b348015610280575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b3480156102ca575f80fd5b506102de6102d9366004614654565b610b3c565b005b3480156102eb575f80fd5b506102126102fa3660046146bb565b610d4e565b34801561030a575f80fd5b5061029a6103193660046146f9565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600760205260409020541690565b34801561034e575f80fd5b50604051601281526020016101ea565b348015610369575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b34801561039b575f80fd5b507f00000000000000000000000000000000000000000009195731e2ce35eb000000610235565b3480156103cd575f80fd5b506102de6103dc366004614714565b610daf565b3480156103ec575f80fd5b506102de61153b565b348015610400575f80fd5b5061023561040f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610235610444366004614759565b611780565b348015610454575f80fd5b5060408051808201909152600481527f43544c530000000000000000000000000000000000000000000000000000000060208201526101dd565b348015610499575f80fd5b506102de61199b565b3480156104ad575f80fd5b506102126104bc366004614599565b611bbb565b6102de611bd1565b3480156104d4575f80fd5b50600180547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff169081027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff169190911779010000000000000000000000000000000000000000000000000091909102179055005b348015610571575f80fd5b506102356105803660046147a0565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b3480156105c2575f80fd5b506102de6105d13660046147d7565b612433565b3480156105e1575f80fd5b506102de6105f03660046147a0565b612665565b348015610600575f80fd5b5061021261060f3660046146f9565b73ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205460ff1690565b348015610644575f80fd5b507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08561029a565b5f61067733848461290e565b5060015b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690525f90339073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe881690636352211e90602401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614850565b73ffffffffffffffffffffffffffffffffffffffff161461077f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517feb02c301000000000000000000000000000000000000000000000000000000008152600481018890525f918291829173ffffffffffffffffffffffffffffffffffffffff169063eb02c30190602401606060405180830381865afa1580156107f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610814919061488f565b919450925090505f8061083c8b606461082d3487614901565b6108379190614962565b612a15565b915091505f6109ba7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461089d578661089f565b855b6001546040517fc95e542b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015289811660248301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292169063c95e542b90604401602060405180830381865afa158015610935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109599190614990565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146109b257866109b4565b855b8f612b35565b90505f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a1f57610a1a82846149b2565b610a29565b610a2982856149b2565b90505f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081528260048201525f806024835f865af150506040517f7a3e3495000000000000000000000000000000000000000000000000000000008152600481018d9052336024820152604481018c905273ffffffffffffffffffffffffffffffffffffffff8b1660648201523090637a3e349590849060840160206040518083038185885af1158015610b05573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b2a91906149c5565b9e9d5050505050505050505050505050565b82818114610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c656e677468000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac519561614610cea576001547501000000000000000000000000000000000000000000900463ffffffff165f03610c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f744f70656e596574000000000000000000000000000000000000000000006044820152606401610ba2565b335f90815260086020526040902054439003610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f616c7453616e646f0000000000000000000000000000000000000000000000006044820152606401610ba2565b5f5b81811015610d4657610d3d33878784818110610d0a57610d0a6149dc565b9050602002016020810190610d1f91906146f9565b868685818110610d3157610d316149dc565b90506020020135612eed565b50600101610cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600460209081526040808320338085529252822054610d969086908390610d91908790614a09565b61290e565b610da185858561304f565b5060019150505b9392505050565b8261ffff16600503610f5a575f5473ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8f9190614850565b73ffffffffffffffffffffffffffffffffffffffff1603610eae575f80fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f05575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600660205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22221614610fc9576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261ffff165f0361103257811580610fe15750816001145b610fe9575f80fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff851602179055505050565b8261ffff1660010361108e5768056bc75e2d63100000821115611053575f80fd5b600280547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff8416179055505050565b8261ffff166002036111695773ffffffffffffffffffffffffffffffffffffffff8116301480159061110c57507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611114575f80fd5b73ffffffffffffffffffffffffffffffffffffffff165f908152600560205260409020805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790555050565b8261ffff1660030361139a576001546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201525f60248201527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889091169063a22cb465906044015f604051808303815f87803b158015611206575f80fd5b505af1158015611218573d5f803e3d5ffd5b5050600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85811691821783556040517fa22cb465000000000000000000000000000000000000000000000000000000008152600481019290925260248201929092527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88909116925063a22cb46591506044015f604051808303815f87803b1580156112da575f80fd5b505af11580156112ec573d5f803e3d5ffd5b50505073ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600482528083207f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889094168352929052207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905550505050565b8261ffff166004036114b4576001546113d5907501000000000000000000000000000000000000000000900463ffffffff16629e3400614a1c565b63ffffffff164210156113e6575f80fd5b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a222281166024830152604482018490527f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8816906323b872dd906064015f604051808303815f87803b158015611499575f80fd5b505af11580156114ab573d5f803e3d5ffd5b50505050505050565b8261ffff16600503611536575f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b505050565b305f908152600360205260409020546107d07f00000000000000000000000000000000000000000009195731e2ce35eb000000048110156115795750565b3330148015906115a1575060015473ffffffffffffffffffffffffffffffffffffffff163314155b80156115c457505f5473ffffffffffffffffffffffffffffffffffffffff163314155b156115fb576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101f47f00000000000000000000000000000000000000000009195731e2ce35eb000000048082111561162c578091505b60408051610100810182523080825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281166020840190815261271084860190815260608501938452426080860190815260a086018981525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975186166004890152935185166024880152915162ffffff16604487015293518316606486015292516084850152915160a4840152925160c483015251821660e48201527f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615649091169063414bf38990610104016020604051808303815f875af115801561175c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906149c5565b5f8054328083526007602052604083205473ffffffffffffffffffffffffffffffffffffffff9283169290811691908516148015906117d3575073ffffffffffffffffffffffffffffffffffffffff8116155b80156117f4575073ffffffffffffffffffffffffffffffffffffffff841615155b1561184657325f90815260076020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1661187657508061189d565b50325f9081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff165b60036064349081049182029003907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28385036118e2575f805f806003860289612710f1505b8385141915611905575f805f806002860289612710f1505f805f808588612710f1505b604051630d0e30db81525f8060048387865af150508373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb78460405161197991815260200190565b60405180910390a361198d8a848a8c613a38565b9a9950505050505050505050565b3330148015906119c3575060015473ffffffffffffffffffffffffffffffffffffffff163314155b8015611a0557503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22221614155b8015611a2857505f5473ffffffffffffffffffffffffffffffffffffffff163314155b15611a5f576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff16631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aec9190614a40565b6fffffffffffffffffffffffffffffffff1615611bb9576040517f490e6cbc0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052604482018190526080606483015260848201527f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff169063490e6cbc9060a4015f604051808303815f87803b158015611ba2575f80fd5b505af1158015611bb4573d5f803e3d5ffd5b505050505b565b5f611bc733848461304f565b5060019392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac519561614611c40576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004263ffffffff160217905562017f5c697f0e10af47c1c7000000611ca260c883614a59565b611cad9060c8614acc565b91505f807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d17575f80fd5b505af1158015611d29573d5f803e3d5ffd5b50505050507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a088611dea9190614aeb565b60020b8152602001611dff88620668a0614b2c565b60020b8152602001611e146298968034614a09565b81526020018681526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401611e679190614b6d565b6080604051808303815f875af1158015611e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea79190614c58565b600180546040517fa22cb46500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101929092529296509094507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88909116925063a22cb46591506044015f604051808303815f87803b158015611f43575f80fd5b505af1158015611f55573d5f803e3d5ffd5b505050505f8184611f669190614a09565b90507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff168152602001620668a0896120249190614aeb565b60020b815260200161203760c88a614aeb565b60020b81526020015f81526020018481526020015f81526020015f81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016120939190614b6d565b6080604051808303815f875af11580156120af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d39190614c58565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116825230602083019081526127108385019081527f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a222283166060850190815242608086019081526298967f60a087019081525f60c0880181815260e0890191825298517f414bf389000000000000000000000000000000000000000000000000000000008152975187166004890152945186166024880152925162ffffff1660448701529051841660648601525160848501525160a4840152925160c48301529151821660e48201529196507f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156416935063414bf38992506101040190506020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225191906149c5565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156122dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230091906149c5565b905080156124035773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21663a9059cbb7f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a2222612370600185614a09565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156123dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124019190614c91565b505b5050600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16905550505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08516146124a2576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f906124d490790100000000000000000000000000000000000000000000000000900463ffffffff1642614a09565b905061070881111561265e576124e8613f03565b600180547fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000004263ffffffff160217905560025469ffffffffffffffffffff165f0361254f5750611bb4565b6002545f9069ffffffffffffffffffff1661256b603c84614cb0565b6125759190614cc3565b62c0ffee5f5260036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23549091508111610d465760036020527f160392b68017f23b4ebd29cc512e18f5d1c5ca42353847954dabf21d0531fc23805482900390557f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff165f8181526040908190208054840190555162c0ffee907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126549085815260200190565b60405180910390a3505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195616146126d4576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001547501000000000000000000000000000000000000000000900463ffffffff161561272d576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811784555f90815260056020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116891790915587548616855260048084528286207f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8888168088529085528387207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908190558a54891688528286528488207f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648a168952865284882081905587548c8a169a168a17885598875290845282862090865283528185209690965583548516845291905281208054909316909317909155905461289391309116692a5a058fc295ed000000612eed565b505f80546040517f760a3ce8000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063760a3ce8906024015f604051808303815f87803b1580156128fc575f80fd5b505af1158015610d46573d5f803e3d5ffd5b73ffffffffffffffffffffffffffffffffffffffff831661295b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166129a8576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040805160a0810182528381526fffffffffffffffffffffffffffffffff838116602083019081525f83850181815260608501828152426080870190815296517f0c49ccbe0000000000000000000000000000000000000000000000000000000081529551600487015292519093166024850152915160448401525160648301529151608482015281907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1690630c49ccbe9060a40160408051808303815f875af1158015612afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1f9190614cda565b5050612b2a846140d5565b909590945092505050565b5f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612ba8575073ffffffffffffffffffffffffffffffffffffffff86163014155b15612ca257604080517f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff9081166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915191881691612c609190614cfc565b5f604051808303815f865af19150503d805f8114612c99576040519150601f19603f3d011682016040523d82523d5f602084013e612c9e565b606091505b5050505b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612d4757507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f756e737570706f727465645f70616972000000000000000000000000000000006044820152606401610ba2565b604080516101008101825273ffffffffffffffffffffffffffffffffffffffff88811682528781166020830190815262ffffff8881168486019081523060608601908152426080870190815260a087018b815260c088018b81525f60e08a0190815299517f414bf3890000000000000000000000000000000000000000000000000000000081529851881660048a0152955187166024890152925190931660448701525184166064860152905160848501525160a48401525160c48301529151821660e48201527f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615649091169063414bf38990610104016020604051808303815f875af1158015612ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee391906149c5565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040812080548391908390612f23908490614a09565b909155505073ffffffffffffffffffffffffffffffffffffffff8084165f90815260036020526040812080548501905554858216911614801590612f8157505f5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612fd957507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611bc7578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161303d91815260200190565b60405180910390a35060019392505050565b5f807f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146130aa57846130ac565b835b90507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561315657507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561315e5750835b6001547501000000000000000000000000000000000000000000900463ffffffff165f036131b8576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061325d57507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061328c575073ffffffffffffffffffffffffffffffffffffffff85165f9081526005602052604090205460ff165b806132bb575073ffffffffffffffffffffffffffffffffffffffff84165f9081526005602052604090205460ff165b156132d3576132cb858585612eed565b915050610da8565b73ffffffffffffffffffffffffffffffffffffffff8116301480159061331357505f5473ffffffffffffffffffffffffffffffffffffffff828116911614155b801561336b57507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613392575060015473ffffffffffffffffffffffffffffffffffffffff828116911614155b1561342a5773ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260409020544311156133f8576133ce4360016149b2565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526008602052604090205561342a565b6040517fc81ae82a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015474010000000000000000000000000000000000000000900460ff16156134a5576305f5e10083108061346957506a01a784379d99db4200000083115b156134a0576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134b0565b6132cb858585612eed565b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561355857507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156135b057507f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561367a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526006602052604090205460ff1615613614576040517fab8a036000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613659575f80fd5b505af192505050801561366a575060015b156134a5576132cb858585612eed565b7f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613725573073ffffffffffffffffffffffffffffffffffffffff16636ac5eeee6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613712575f80fd5b505af1925050508015613723575060015b505b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290613759908490614a09565b909155505060015460148404907501000000000000000000000000000000000000000000900463ffffffff9081166102580116421015613797576002025b80840393507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461380857305f9081526003602052604090208054820190556139c2565b7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036139c25773ffffffffffffffffffffffffffffffffffffffff8581165f908152600760205260408120549091166138ae577f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22226138d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f90815260076020526040902054165b73ffffffffffffffffffffffffffffffffffffffff8082165f818152600360209081526040808320805460058a0490810190915583548616845292819020805498849003988901905551878152949550909391928a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167faa63193cea477530e577a5b8c61efd36b21b453c430fdb45e1b7e9fadca44bb7836040516139b791815260200190565b60405180910390a350505b5073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259087815260200190565b60405180910390a3506001949350505050565b600154604080517f53aad1d900000000000000000000000000000000000000000000000000000000815290515f92839273ffffffffffffffffffffffffffffffffffffffff90911691633dc63b739183916353aad1d9916004808201926020929091908290030181865afa158015613ab2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ad69190614d17565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815260029190910b6004820152602401602060405180830381865afa158015613b2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4f91906149c5565b6001546040517f7a5a542000000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192505f91829173ffffffffffffffffffffffffffffffffffffffff1690637a5a542090604401602060405180830381865afa158015613bc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bec91906149c5565b60408051610100810182527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff9081168252306020830181905261271083850152606083015242608083015260a0820184905260c082018c90525f60e083015291517f414bf3890000000000000000000000000000000000000000000000000000000081529293507f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564919091169163414bf38991613d36916004015f6101008201905073ffffffffffffffffffffffffffffffffffffffff80845116835280602085015116602084015262ffffff60408501511660408401528060608501511660608401526080840151608084015260a084015160a084015260c084015160c08401528060e08501511660e08401525092915050565b6020604051808303815f875af1158015613d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7691906149c5565b915080870396505f613d8a888489896141e1565b9196509250905082811115613dcb576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87821115613e05576040517f87822c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2828903655af3107a4000811115613e75576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528860048201528160248201525f806044835f875af150505b50670de0b6b3a764000082850310613e9657613e943088848703612eed565b505b60408051878152602081018a90529081018490526060810185905273ffffffffffffffffffffffffffffffffffffffff8816907fd5928c9413a900ce1d8ea824af263af41ba51a2f90976ca72e9a7f2a68786f979060800160405180910390a25050505050949350505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2303164e8d4a51000811115613f4957604051630d0e30db81525f8060048385875af150505b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9060019073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190602401602060405180830381865afa158015613fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ffb91906149c5565b0390507f000000000000000000000000b0df68e0bf4f54d06a4a448735d2a3d7d97a22227f000000000000000000000000ceb492c5e67385e2a08265352d646a0c32a5d08564e8d4a51000831115611bb4576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528260048201526064604185020460248201525f806044835f895af1507fa9059cbb0000000000000000000000000000000000000000000000000000000081528160048201526064602385020460248201525f806044835f895af1505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f786500000000000000000000000000000000000000000000000000000000815293516004850152915173ffffffffffffffffffffffffffffffffffffffff9081166024850152915181166044840152925190921660648201525f9182917f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889091169063fc6f78659060840160408051808303815f875af11580156141b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d79190614cda565b9094909350915050565b5f805f8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561424f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142739190614d17565b6001546040517f396a28ba000000000000000000000000000000000000000000000000000000008152600481018990529192505f9173ffffffffffffffffffffffffffffffffffffffff9091169063396a28ba90602401602060405180830381865afa1580156142e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143099190614d17565b90507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2772860020b85876143e89190614aeb565b60020b126143ff576143fa8587614aeb565b614421565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff277285b60020b8152602001620d88d86144378688614b2c565b60020b1361444e576144498587614b2c565b614453565b620d88d85b60020b81526020018c81526020018b81526020015f81526020015f81526020018973ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b81526004016144af9190614b6d565b6080604051808303815f875af11580156144cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144ef9190614c58565b929c909b5091995090975050505050505050565b5f5b8381101561451d578181015183820152602001614505565b50505f910152565b602081525f8251806020840152614543816040850160208701614503565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114614596575f80fd5b50565b5f80604083850312156145aa575f80fd5b82356145b581614575565b946020939093013593505050565b5f805f805f60a086880312156145d7575f80fd5b8535945060208601359350604086013592506060860135915060808601356145fe81614575565b809150509295509295909350565b5f8083601f84011261461c575f80fd5b50813567ffffffffffffffff811115614633575f80fd5b6020830191508360208260051b850101111561464d575f80fd5b9250929050565b5f805f8060408587031215614667575f80fd5b843567ffffffffffffffff8082111561467e575f80fd5b61468a8883890161460c565b909650945060208701359150808211156146a2575f80fd5b506146af8782880161460c565b95989497509550505050565b5f805f606084860312156146cd575f80fd5b83356146d881614575565b925060208401356146e881614575565b929592945050506040919091013590565b5f60208284031215614709575f80fd5b8135610da881614575565b5f805f60608486031215614726575f80fd5b833561ffff81168114614737575f80fd5b925060208401359150604084013561474e81614575565b809150509250925092565b5f805f806080858703121561476c575f80fd5b84359350602085013561477e81614575565b925060408501359150606085013561479581614575565b939692955090935050565b5f80604083850312156147b1575f80fd5b82356147bc81614575565b915060208301356147cc81614575565b809150509250929050565b5f805f80606085870312156147ea575f80fd5b8435935060208501359250604085013567ffffffffffffffff8082111561480f575f80fd5b818701915087601f830112614822575f80fd5b813581811115614830575f80fd5b886020828501011115614841575f80fd5b95989497505060200194505050565b5f60208284031215614860575f80fd5b8151610da881614575565b80516fffffffffffffffffffffffffffffffff8116811461488a575f80fd5b919050565b5f805f606084860312156148a1575f80fd5b83516148ac81614575565b60208501519093506148bd81614575565b91506148cb6040850161486b565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821602808216919082811461492d5761492d6148d4565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6fffffffffffffffffffffffffffffffff8084168061498457614984614935565b92169190910492915050565b5f602082840312156149a0575f80fd5b815162ffffff81168114610da8575f80fd5b8082018082111561067b5761067b6148d4565b5f602082840312156149d5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561067b5761067b6148d4565b63ffffffff818116838216019080821115614a3957614a396148d4565b5092915050565b5f60208284031215614a50575f80fd5b610da88261486b565b5f8160020b8360020b80614a6f57614a6f614935565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000083141615614ac357614ac36148d4565b90059392505050565b5f8260020b8260020b028060020b9150808214614a3957614a396148d4565b600282810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561067b5761067b6148d4565b600281810b9083900b01627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561067b5761067b6148d4565b815173ffffffffffffffffffffffffffffffffffffffff16815261016081016020830151614bb3602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151614bca604084018262ffffff169052565b506060830151614bdf606084018260020b9052565b506080830151614bf4608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614c478285018273ffffffffffffffffffffffffffffffffffffffff169052565b505061014092830151919092015290565b5f805f8060808587031215614c6b575f80fd5b84519350614c7b6020860161486b565b6040860151606090960151949790965092505050565b5f60208284031215614ca1575f80fd5b81518015158114610da8575f80fd5b5f82614cbe57614cbe614935565b500490565b808202811582820484141761067b5761067b6148d4565b5f8060408385031215614ceb575f80fd5b505080516020909101519092909150565b5f8251614d0d818460208701614503565b9190910192915050565b5f60208284031215614d27575f80fd5b81518060020b8114610da8575f80fdfea2646970667358221220fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db64736f6c63430008150033

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

000000000000000000000000633347e08e48901b3c2f4200884a1feddac5195600000000000000000000000002d30a0c5790e03016165f851994093656a57aef

-----Decoded View---------------
Arg [0] : _apest (address): 0x633347e08E48901B3C2f4200884a1fEddAc51956
Arg [1] : _tickMaths (address): 0x02d30A0c5790e03016165f851994093656a57aEF

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000633347e08e48901b3c2f4200884a1feddac51956
Arg [1] : 00000000000000000000000002d30a0c5790e03016165f851994093656a57aef


Deployed Bytecode Sourcemap

14461:28458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21859:107;;;;;;;;;;-1:-1:-1;21939:19:0;;;;;;;;;;;;;;;;;21859:107;;;;;;;:::i;:::-;;;;;;;;22906:210;;;;;;;;;;-1:-1:-1;22906:210:0;;;;;:::i;:::-;;:::i;:::-;;;1373:14:1;;1366:22;1348:41;;1336:2;1321:18;22906:210:0;1208:187:1;33977:1302:0;;;;;;:::i;:::-;;:::i;:::-;;;2072:25:1;;;2060:2;2045:18;33977:1302:0;1926:177:1;22186:108:0;;;;;;;;;;-1:-1:-1;22274:12:0;22186:108;;42517:110;;;;;;;;;;-1:-1:-1;42567:10:0;42605:13;;;42517:110;;;2416:42:1;2404:55;;;2386:74;;2374:2;2359:18;42517:110:0;2240:226:1;24296:544:0;;;;;;;;;;-1:-1:-1;24296:544:0;;;;;:::i;:::-;;:::i;:::-;;23124:317;;;;;;;;;;-1:-1:-1;23124:317:0;;;;;:::i;:::-;;:::i;42404:105::-;;;;;;;;;;-1:-1:-1;42404:105:0;;;;;:::i;:::-;42488:13;;;;42461:7;42488:13;;;:8;:13;;;;;;;;42404:105;22085:93;;;;;;;;;;-1:-1:-1;22085:93:0;;22168:2;4476:36:1;;4464:2;4449:18;22085:93:0;4334:184:1;42635:91:0;;;;;;;;;;-1:-1:-1;42707:11:0;42635:91;;42734:77;;;;;;;;;;-1:-1:-1;42799:4:0;42734:77;;40340:1921;;;;;;;;;;-1:-1:-1;40340:1921:0;;;;;:::i;:::-;;:::i;27925:1087::-;;;;;;;;;;;;;:::i;22302:177::-;;;;;;;;;;-1:-1:-1;22302:177:0;;;;;:::i;:::-;22453:18;;22421:7;22453:18;;;:9;:18;;;;;;;22302:177;38686:1620;;;;;;:::i;:::-;;:::i;21974:103::-;;;;;;;;;;-1:-1:-1;22056:13:0;;;;;;;;;;;;;;;;;21974:103;;30537:408;;;;;;;;;;;;;:::i;22487:202::-;;;;;;;;;;-1:-1:-1;22487:202:0;;;;;:::i;:::-;;:::i;19533:2171::-;;;:::i;21712:139::-;;;;;;;;;;-1:-1:-1;21755:10:0;:36;;21802:41;;21755:36;21775:15;21755:36;;;;;21802:41;;;;;;;;;;;;;;24296:544;22697:201;;;;;;;;;;-1:-1:-1;22697:201:0;;;;;:::i;:::-;22863:18;;;;22831:7;22863:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22697:201;30953:1073;;;;;;;;;;-1:-1:-1;30953:1073:0;;;;;:::i;:::-;;:::i;18577:911::-;;;;;;;;;;-1:-1:-1;18577:911:0;;;;;:::i;:::-;;:::i;42284:112::-;;;;;;;;;;-1:-1:-1;42284:112:0;;;;;:::i;:::-;42370:18;;42346:4;42370:18;;;:13;:18;;;;;;;;;42284:112;42819:97;;;;;;;;;;-1:-1:-1;42895:13:0;42819:97;;22906:210;23025:4;23047:39;4708:10;23070:7;23079:6;23047:8;:39::i;:::-;-1:-1:-1;23104:4:0;22906:210;;;;;:::o;33977:1302::-;34193:32;;;;;;;;2072:25:1;;;34158:18:0;;34229:10;;34193:46;:15;:23;;;;2045:18:1;;34193:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;34189:65;;34248:6;;;;;;;;;;;;;;34189:65;34319:11;;:46;;;;;;;;2072:25:1;;;34266:14:0;;;;;;34319:11;;;:37;;2045:18:1;;34319:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34265:100;;-1:-1:-1;34265:100:0;-1:-1:-1;34265:100:0;-1:-1:-1;34377:10:0;;34403:103;34435:7;34492:3;34458:30;34478:9;34265:100;34458:30;:::i;:::-;34457:38;;;;:::i;:::-;34403:17;:103::i;:::-;34376:130;;;;34519:14;34536:198;34568:4;34558:14;;:6;:14;;;:32;;34584:6;34558:32;;;34575:6;34558:32;34624:11;;:39;;;;;:11;8723:15:1;;;34624:39:0;;;8705:34:1;8775:15;;;8755:18;;;8748:43;34605:4:0;;34624:11;;:23;;8617:18:1;;34624:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34688:4;34678:14;;:6;:14;;;:24;;34700:2;34678:24;;;34695:2;34678:24;34717:6;34536:7;:198::i;:::-;34519:215;;34747:17;34777:4;34767:14;;:6;:14;;;:42;;34798:11;34803:6;34798:2;:11;:::i;:::-;34767:42;;;34784:11;34789:6;34784:2;:11;:::i;:::-;34747:62;;34820:13;34836:4;34820:20;;34897:4;34891:11;34968:66;34941:8;34916:133;35091:9;35084:4;35074:8;35070:19;35063:38;35160:1;35157;35151:4;35141:8;35138:1;35131:5;35124;35119:43;-1:-1:-1;;35206:65:0;;;;;;;;9446:25:1;;;35249:10:0;9548:18:1;;;9541:43;9600:18;;;9593:34;;;35206:15:0;9663::1;;9643:18;;;9636:43;35206:4:0;;:15;;35229:9;;9418:19:1;;35206:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35186:85;33977:1302;-1:-1:-1;;;;;;;;;;;;;;33977:1302:0:o;24296:544::-;24419:2;24447:22;;;24439:41;;;;;;;10081:2:1;24439:41:0;;;10063:21:1;10120:1;10100:18;;;10093:29;10158:8;10138:18;;;10131:36;10184:18;;24439:41:0;;;;;;;;;24495:10;:19;24509:5;24495:19;;24491:166;;24539:10;;;;;;;24553:1;24539:15;24531:38;;;;;;;10415:2:1;24531:38:0;;;10397:21:1;10454:2;10434:18;;;10427:30;10493:12;10473:18;;;10466:40;10523:18;;24531:38:0;10213:334:1;24531:38:0;24605:10;24592:24;;;;:12;:24;;;;;;24620:12;24592:40;;24584:61;;;;;;;10754:2:1;24584:61:0;;;10736:21:1;10793:1;10773:18;;;10766:29;10831:10;10811:18;;;10804:38;10859:18;;24584:61:0;10552:331:1;24584:61:0;24672:9;24667:166;24687:4;24683:1;:8;24667:166;;;24739:45;24754:10;24766:2;;24769:1;24766:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24773:7;;24781:1;24773:10;;;;;;;:::i;:::-;;;;;;;24739:14;:45::i;:::-;-1:-1:-1;24803:3:0;;24667:166;;;;24393:447;24296:544;;;;:::o;23124:317::-;23337:17;;;23255:4;23337:17;;;:11;:17;;;;;;;;4708:10;23337:26;;;;;;;;23313:60;;23337:17;;4708:10;;23337:35;;23366:6;;23337:35;:::i;:::-;23313:8;:60::i;:::-;23384:27;23394:4;23400:2;23404:6;23384:9;:27::i;:::-;;23429:4;23422:11;;;23124:317;;;;;;:::o;40340:1921::-;40460:4;:9;;40468:1;40460:9;40456:1798;;40559:13;;;;40537:10;:36;40533:55;;40582:6;;;;;;;;;;;;;;40533:55;40644:1;40611:35;;40619:3;40611:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;40603:44;;;;;;40712:13;40705:20;;:3;:20;;;40697:29;;;;;;40757:12;;;;;;:7;:12;;;;;;;;;;40756:13;40741:28;;;;;;;-1:-1:-1;;40340:1921:0:o;40456:1798::-;40806:10;:22;40820:8;40806:22;;40802:41;;40837:6;;;;;;;;;;;;;;40802:41;40864:4;:9;;40872:1;40864:9;40860:1383;;40959:11;;;:26;;;40974:6;40984:1;40974:11;40959:26;40951:35;;;;;;41005:12;:28;;;;;;;;;;;;40340:1921;;;:::o;40860:1383::-;41059:4;:9;;41067:1;41059:9;41055:1188;;41147:6;41137;:16;;41129:25;;;;;;41173:12;:29;;;;;;;;;;40340:1921;;;:::o;41055:1188::-;41228:4;:9;;41236:1;41228:9;41224:1019;;41302:20;;;41317:4;41302:20;;;;:44;;;41333:13;41326:20;;:3;:20;;;;41302:44;41294:53;;;;;;41388:18;;;;;;:13;:18;;;;;;;;;;41387:19;41366:40;;;;;;;-1:-1:-1;;40340:1921:0:o;41224:1019::-;41432:4;:9;;41440:1;41432:9;41428:815;;41554:11;;41512:62;;;;;:33;41554:11;;;41512:62;;;11378:74:1;41554:11:0;11468:18:1;;;11461:50;41512:15:0;:33;;;;;;11351:18:1;;41512:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41593:11:0;:29;;;;;;;;;;;;;41641:53;;;;;;;;11378:74:1;;;;11468:18;;;11461:50;;;;41641:15:0;:33;;;;-1:-1:-1;41641:33:0;;-1:-1:-1;11351:18:1;;41641:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41713:18:0;;;;;;;;:13;:18;;;;;;;;:25;;;;41734:4;41713:25;;;41757:11;:16;;;;;41782:15;41757:42;;;;;;;;;41802:17;41757:62;;-1:-1:-1;40340:1921:0;;;:::o;41428:815::-;41845:4;:9;;41853:1;41845:9;41841:402;;41931:10;;:30;;:10;;;;;41945:15;41931:30;:::i;:::-;41912:49;;:15;:49;;41904:58;;;;;;41981:61;;;;;42018:4;41981:61;;;11962:34:1;41981:28:0;42025:8;12032:15:1;;12012:18;;;12005:43;12064:18;;;12057:34;;;41981:15:0;:28;;;;11874:18:1;;41981:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40340:1921;;;:::o;41841:402::-;42068:4;:9;;42076:1;42068:9;42064:179;;42150:13;:33;;;;;;;;;;;;42202:18;;:13;:18;;;;;:25;;;;-1:-1:-1;42202:25:0;;;42064:179;40340:1921;;;:::o;27925:1087::-;28027:4;27988:18;28009:24;;;:9;:24;;;;;;28080:4;28065:12;:19;28052:10;:32;28048:79;;;28105:7;27925:1087::o;28048:79::-;28165:10;28187:4;28165:27;;;;:82;;-1:-1:-1;28235:11:0;;;;28213:10;:34;;28165:82;:139;;;;-1:-1:-1;28290:13:0;;;;28268:10;:36;;28165:139;28143:190;;;28327:6;;;;;;;;;;;;;;28143:190;28415:3;28400:12;:18;28439:20;;;28435:81;;;28493:7;28480:20;;28435:81;28587:391;;;;;;;;28660:4;28587:391;;;28532:36;28698:4;28587:391;;;;;;;;28730:5;28587:391;;;;;;;;;;;;28815:15;28587:391;;;;;;;;;;;;-1:-1:-1;28587:391:0;;;;;;;;;;;;28532:461;;;;;12507:13:1;;12503:22;;28532:461:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12666:8;12636:39;12614:20;;;12607:69;12718:24;;12714:33;;12692:20;;;12685:63;12786:24;;12764:20;;;12757:54;12849:24;;12827:20;;;12820:54;12912:24;;12890:20;;;12883:54;12979:24;12975:33;;12953:20;;;12946:63;28542:8:0;28532:36;;;;;;12396:19:1;;28532:461:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38686:1620::-;38832:15;38881:13;;38932:9;38923:19;;;:8;:19;;;;;;38881:13;;;;;38923:19;;;;39018:18;;;;;;;:59;;-1:-1:-1;39057:20:0;;;;39018:59;:99;;;;-1:-1:-1;39098:19:0;;;;;39018:99;38996:199;;;39161:9;39152:19;;;;:8;:19;;;;;:27;;;;:19;:27;;;;;38996:199;39222:9;39244:1;39213:19;;;:8;:19;;;;;;:33;:19;39209:154;;-1:-1:-1;39276:2:0;39209:154;;;-1:-1:-1;39337:9:0;39328:19;;;;:8;:19;;;;;;;;39209:154;39537:1;39487:3;39430:9;39476:14;;;39523:15;;;39510:29;;;39584:4;39634:14;;;39631:114;;39723:1;39720;39717;39713:2;39709:1;39696:11;39692:19;39688:2;39681:5;39676:49;39672:54;39631:114;39779:6;39775:2;39772:14;39768:19;39765:191;;;39862:1;39859;39856;39852:2;39848:1;39835:11;39831:19;39827:2;39820:5;39815:49;39811:54;39934:1;39931;39928;39924:2;39911:11;39903:6;39896:5;39891:45;39887:50;39765:191;39998:4;39992:11;40066:9;40056:8;40049:27;40149:1;40146;40141:3;40131:8;40121;40110:9;40103:5;40098:53;40094:58;;40205:6;40188:37;;40201:2;40188:37;;;40213:11;40188:37;;;;2072:25:1;;2060:2;2045:18;;1926:177;40188:37:0;;;;;;;;40247:40;40260:6;40268:8;40278:4;40284:2;40247:12;:40::i;:::-;40240:47;38686:1620;-1:-1:-1;;;;;;;;;;38686:1620:0:o;30537:408::-;30598:10;30620:4;30598:27;;;;:78;;-1:-1:-1;30664:11:0;;;;30642:10;:34;;30598:78;:126;;;;-1:-1:-1;30693:10:0;:31;30715:8;30693:31;;;30598:126;:179;;;;-1:-1:-1;30763:13:0;;;;30741:10;:36;;30598:179;30580:222;;;30796:6;;;;;;;;;;;;;;30580:222;30825:13;30817:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;30813:125;;30873:53;;;;;30910:4;30873:53;;;13516:74:1;30917:1:0;13606:18:1;;;13599:34;;;13649:18;;;13642:34;;;13712:3;13692:18;;;13685:31;13732:19;;;13725:30;30881:13:0;30873:28;;;;;13772:19:1;;30873:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30813:125;30537:408::o;22487:202::-;22602:4;22624:35;4708:10;22648:2;22652:6;22624:9;:35::i;:::-;-1:-1:-1;22677:4:0;;22487:202;-1:-1:-1;;;22487:202:0:o;19533:2171::-;19588:10;:19;19602:5;19588:19;;19584:38;;19616:6;;;;;;;;;;;;;;19584:38;19633:10;:36;;;;;19653:15;19633:36;;;;;;19695:5;19727:10;19756;19763:3;19695:5;19756:10;:::i;:::-;19755:18;;19770:3;19755:18;:::i;:::-;19748:25;;19784:10;19805;19832:4;19826:19;;;19853:9;19826:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19891:15;:20;;;19926:482;;;;;;;;19992:4;19926:482;;;;;;20031:4;19926:482;;;;;;20060:5;19926:482;;;;;;20102:6;20095:4;:13;;;;:::i;:::-;19926:482;;;;;;20138:13;:4;20145:6;20138:13;:::i;:::-;19926:482;;;;;;20186:15;20198:3;20186:9;:15;:::i;:::-;19926:482;;;;20236:5;19926:482;;;;20272:1;19926:482;;;;20304:1;19926:482;;;;20343:4;19926:482;;;;;;20377:15;19926:482;;;19891:528;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20474:11;;;20432:61;;;;;:33;20474:11;;;20432:61;;;11378:74:1;11468:18;;;11461:50;;;;19876:543:0;;-1:-1:-1;19876:543:0;;-1:-1:-1;20432:15:0;:33;;;;-1:-1:-1;20432:33:0;;-1:-1:-1;11351:18:1;;20432:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20506:17;20534:2;20526:5;:10;;;;:::i;:::-;20506:30;;20562:15;:20;;;20597:469;;;;;;;;20663:4;20597:469;;;;;;20702:4;20597:469;;;;;;20731:5;20597:469;;;;;;20773:6;20766:4;:13;;;;:::i;:::-;20597:469;;;;;;20809:10;20816:3;20809:4;:10;:::i;:::-;20597:469;;;;;;20854:1;20597:469;;;;20890:9;20597:469;;;;20930:1;20597:469;;;;20962:1;20597:469;;;;21001:4;20597:469;;;;;;21035:15;20597:469;;;20562:515;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21141:347;;;;;;;;21090:36;21202:4;21141:347;;;;21243:4;21141:347;;;;;;21272:5;21141:347;;;;;;21307:8;21141:347;;;;;;;;21344:15;21141:347;;;;;;21388:7;21141:347;;;;;;-1:-1:-1;21141:347:0;;;;;;;;;;;;21090:409;;;;;12507:13:1;;12503:22;;21090:409:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12666:8;12636:39;12614:20;;;12607:69;12718:24;;12714:33;;12692:20;;;12685:63;12786:24;12764:20;;;12757:54;12849:24;12827:20;;;12820:54;12912:24;;12890:20;;;12883:54;12979:24;;12975:33;;12953:20;;;12946:63;20549:528:0;;-1:-1:-1;21100:8:0;21090:36;;-1:-1:-1;21090:36:0;;-1:-1:-1;12396:19:1;;;-1:-1:-1;21090:409:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21531:37:0;;;;;21562:4;21531:37;;;2386:74:1;21512:16:0;;21538:4;21531:22;;;;;2359:18:1;;21531:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21512:56;-1:-1:-1;21585:13:0;;21581:91;;21615:21;21622:4;21615:21;;21637:8;21647:12;21658:1;21647:8;:12;:::i;:::-;21615:45;;;;;;;;;;16860:42:1;16848:55;;;21615:45:0;;;16830:74:1;16920:18;;;16913:34;16803:18;;21615:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21581:91;-1:-1:-1;;21682:10:0;:14;;;;;;-1:-1:-1;;;;19533:2171:0:o;30953:1073::-;31077:10;:27;31091:13;31077:27;;31073:46;;31113:6;;;;;;;;;;;;;;31073:46;31172:15;;31130:21;;31154:33;;31172:15;;;;;31154;:33;:::i;:::-;31130:57;;31218:10;31202:13;:26;31198:821;;;31245:15;:13;:15::i;:::-;31275;:41;;;;;31300:15;31275:41;;;;;;31337:12;;;;-1:-1:-1;31337:17:0;31333:30;;31356:7;;;31333:30;31420:12;;31379:15;;31420:12;;31398:18;31414:2;31398:13;:18;:::i;:::-;31397:35;;;;:::i;:::-;31479:42;31469:53;;:9;:53;;;;31379;;-1:-1:-1;31469:64:0;-1:-1:-1;31447:561:0;;31601:9;:101;;;:112;;;;;;;31746:13;31601:101;31736:24;31601:101;31736:24;;;31601:101;31736:24;;;;:35;;;;;;31799:174;31637:42;;31799:174;;;;31706:7;2072:25:1;;2060:2;2045:18;;1926:177;31799:174:0;;;;;;;;31230:789;31198:821;31062:964;30953:1073;;;;:::o;18577:911::-;18664:10;:19;18678:5;18664:19;;18660:38;;18692:6;;;;;;;;;;;;;;18660:38;18713:10;;;;;;;:15;18709:36;;18737:8;;;;;;;;;;;;;;18709:36;18780:11;:36;;;;;;;;;;;;;;:11;18827:35;;;:13;:35;;;;;;;;:42;;;;;;;;;;;18900:11;;;;18880:33;;:11;:33;;;;;;18922:15;18880:59;;;;;;;;;;;18942:41;18880:103;;;;19014:11;;;;18994:33;;;;;;;;19036:8;18994:52;;;;;;;;;:86;;;19118:51;;;;;;;;;;;19182:35;;;;;;;;;:61;;;;;;;;:105;;;;19322:13;;;;19300:37;;;;;;;:44;;;;;;;;;;;19393:13;;19355:65;;19378:4;;19393:13;19409:10;19355:14;:65::i;:::-;-1:-1:-1;19433:13:0;;;:47;;;;;;;;2386:74:1;;;;19433:13:0;;;:35;;2359:18:1;;19433:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23954:334;24086:19;;;24082:45;;24114:13;;;;;;;;;;;;;;24082:45;24142:21;;;24138:47;;24172:13;;;;;;;;;;;;;;24138:47;24196:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24248:32;;2072:25:1;;;24248:32:0;;2045:18:1;24248:32:0;;;;;;;23954:334;;;:::o;32462:504::-;32649:250;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32649:250:0;;;;;;;;;;;;32868:15;32649:250;;;;;;32601:309;;;;;17783:13:1;;32601:309:0;;;17765:32:1;17839:24;;17835:65;;;17813:20;;;17806:95;17939:24;;17917:20;;;17910:54;18002:24;17980:20;;;17973:54;18065:24;;18043:20;;;18036:54;-1:-1:-1;;32601:15:0;:33;;;;;17737:19:1;;32601:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32932:26;32950:7;32932:17;:26::i;:::-;32921:37;;;;-1:-1:-1;32462:504:0;-1:-1:-1;;;32462:504:0:o;32974:995::-;33146:11;33185:4;33174:15;;:7;:15;;;;:43;;;;-1:-1:-1;33193:24:0;;;33212:4;33193:24;;33174:43;33170:280;;;33265:158;;;33364:8;33234:12;16848:55:1;;;33265:158:0;;;16830:74:1;16920:18;;;;16913:34;;;33265:158:0;;;;;;;;;;16803:18:1;;;;33265:158:0;;;;;;;;;33310:23;33265:158;;;33234:204;;:12;;;;:204;;33265:158;33234:204;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33170:280;33479:4;33468:15;;:7;:15;;;:35;;;;33499:4;33487:16;;:8;:16;;;33468:35;33460:64;;;;;;;18845:2:1;33460:64:0;;;18827:21:1;18884:2;18864:18;;;18857:30;18923:18;18903;;;18896:46;18959:18;;33460:64:0;18643:340:1;33460:64:0;33592:358;;;;;;;;33541:36;33592:358;;;;;;;;;;;;;;;;;;;;;;;;33766:4;33592:358;;;;;;33800:15;33592:358;;;;;;;;;;;;;;;;;;-1:-1:-1;33592:358:0;;;;;;33541:420;;;;;12507:13:1;;12503:22;;33541:420:0;;;12485:41:1;12568:24;;12564:33;;12542:20;;;12535:63;12640:24;;12636:39;;;12614:20;;;12607:69;12718:24;12714:33;;12692:20;;;12685:63;12786:24;;12764:20;;;12757:54;12849:24;12827:20;;;12820:54;12912:24;12890:20;;;12883:54;12979:24;;12975:33;;12953:20;;;12946:63;33551:8:0;33541:36;;;;;;12396:19:1;;33541:420:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33535:426;32974:995;-1:-1:-1;;;;;;32974:995:0:o;23449:497::-;23593:17;;;23576:4;23593:17;;;:9;:17;;;;;:27;;23614:6;;23593:17;23576:4;;23593:27;;23614:6;;23593:27;:::i;:::-;;;;-1:-1:-1;;23656:20:0;;;;;;;;:9;:20;;;;;:30;;;;;;23744:13;23726:32;;;23744:13;;23726:32;;;;:84;;-1:-1:-1;23796:13:0;;;23775:35;;;23796:13;;23775:35;;23726:84;:138;;;;;23848:15;23827:37;;:9;:37;;;;23726:138;23708:208;;;23898:9;23881:35;;23890:6;23881:35;;;23909:6;23881:35;;;;2072:25:1;;2060:2;2045:18;;1926:177;23881:35:0;;;;;;;;-1:-1:-1;23934:4:0;23449:497;;;;;:::o;24848:3069::-;24970:4;25015:14;25042:13;25032:23;;:6;:23;;;:44;;25070:6;25032:44;;;25058:9;25032:44;25015:61;;25101:13;25091:23;;:6;:23;;;;:53;;;;;25131:13;25118:26;;:9;:26;;;;25091:53;25087:87;;;-1:-1:-1;25168:6:0;25087:87;25191:10;;;;;;;25205:1;25191:15;25187:63;;25230:8;;;;;;;;;;;;;;25187:63;25293:13;25280:26;;:9;:26;;;:80;;;;25344:15;25323:37;;:9;:37;;;25280:80;:118;;;-1:-1:-1;25377:21:0;;;;;;;:13;:21;;;;;;;;25280:118;:159;;;-1:-1:-1;25415:24:0;;;;;;;:13;:24;;;;;;;;25280:159;25262:264;;;25473:41;25488:6;25496:9;25507:6;25473:14;:41::i;:::-;25466:48;;;;;25262:264;25556:23;;;25574:4;25556:23;;;;:72;;-1:-1:-1;25614:13:0;;;25596:32;;;25614:13;;25596:32;;25556:72;:123;;;;;25663:15;25645:34;;:6;:34;;;;25556:123;:170;;;;-1:-1:-1;25714:11:0;;;25696:30;;;25714:11;;25696:30;;25556:170;25538:449;;;25810:20;;;;;;;:12;:20;;;;;;25833:12;-1:-1:-1;25806:170:0;;;25889:16;:12;25904:1;25889:16;:::i;:::-;25866:20;;;;;;;:12;:20;;;;;:39;25806:170;;;25953:7;;;;;;;;;;;;;;25806:170;26003:12;;;;;;;:17;25999:189;;26050:3;26041:6;:12;:37;;;;26066:12;26057:6;:21;26041:37;26037:58;;;26087:8;;;;;;;;;;;;;;26037:58;25999:189;;;26135:41;26150:6;26158:9;26169:6;26135:14;:41::i;25999:189::-;26255:13;26245:23;;:6;:23;;;;:74;;;;;26303:15;26285:34;;:6;:34;;;;26245:74;:117;;;;;26349:13;26336:26;;:9;:26;;;;26245:117;26227:319;;;26393:18;;;;;;;:7;:18;;;;;;;;26389:37;;;26420:6;;;;;;;;;;;;;;26389:37;26445:4;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26441:31;;;26493:41;26508:6;26516:9;26527:6;26493:14;:41::i;26227:319::-;26597:13;26587:23;;:6;:23;;;26583:94;;26635:4;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26631:31;;26700:17;;;;;;;:9;:17;;;;;:27;;26721:6;;26700:17;:27;;26721:6;;26700:27;:::i;:::-;;;;-1:-1:-1;;26929:10:0;;26829:2;26820:11;;;26929:10;;;;;;;26942;26929:23;26911:41;:15;:41;26848:214;;;27045:1;27037:9;26848:214;27088:4;27078:14;;;;27197:15;27179:34;;:6;:34;;;27175:604;;27252:4;27234:24;;;;:9;:24;;;;;:32;;;;;;27175:604;;;27310:15;27292:34;;:6;:34;;;27288:491;;27361:33;:19;;;27347:11;27361:19;;;:8;:19;;;;;;27347:11;;27361:19;:108;;27461:8;27361:108;;;27418:19;;;;;;;;:8;:19;;;;;;;27361:108;27531:14;;;;27488:13;27531:14;;;:9;:14;;;;;;;;:23;;27511:1;27504:8;;27531:23;;;;;;27625:13;;;;27607:33;;;;;;:41;;27573:13;;;;27607:41;;;;;27674:30;2072:25:1;;;27347:122:0;;-1:-1:-1;27504:8:0;;27531:14;;27674:30;;;;;2045:18:1;27674:30:0;;;;;;;27752:3;27728:35;;27741:9;27728:35;;;27757:5;27728:35;;;;2072:25:1;;2060:2;2045:18;;1926:177;27728:35:0;;;;;;;;27328:451;;27288:491;-1:-1:-1;27795:20:0;;;;;;;;:9;:20;;;;;;;:30;;;;;;27852:35;27795:20;;27852:35;;;;;;;27819:6;2072:25:1;;2060:2;2045:18;;1926:177;27852:35:0;;;;;;;;-1:-1:-1;27905:4:0;;24848:3069;-1:-1:-1;;;;24848:3069:0:o;36482:2196::-;36707:11;;36759:28;;;;;;;;36625:15;;;;36707:11;;;;;:33;;:11;;36759:26;;:28;;;;;;;;;;;;;;;36707:11;36759:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36707:95;;;;;;;;;;19441:1:1;19430:21;;;;36707:95:0;;;19412:40:1;19385:18;;36707:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36876:11;;:103;;;;;;;;19637:25:1;;;19678:18;;;19671:34;;;36678:124:0;;-1:-1:-1;36819:17:0;;;;36876:11;;;:24;;19610:18:1;;36876:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37061:398;;;;;;;;37126:4;37006:36;37061:398;;;;;37171:4;37061:398;;;;;;37204:5;37061:398;;;;;;;;37289:15;37061:398;;;;;;;;;;;;;;;;-1:-1:-1;37061:398:0;;;;37006:468;;;;;36853:126;;-1:-1:-1;37016:8:0;37006:36;;;;;;;:468;;;;12369:4:1;12411:3;12400:9;12396:19;12388:27;;12434:42;12522:2;12513:6;12507:13;12503:22;12492:9;12485:41;12594:2;12586:4;12578:6;12574:17;12568:24;12564:33;12557:4;12546:9;12542:20;12535:63;12666:8;12658:4;12650:6;12646:17;12640:24;12636:39;12629:4;12618:9;12614:20;12607:69;12744:2;12736:4;12728:6;12724:17;12718:24;12714:33;12707:4;12696:9;12692:20;12685:63;12804:4;12796:6;12792:17;12786:24;12779:4;12768:9;12764:20;12757:54;12867:4;12859:6;12855:17;12849:24;12842:4;12831:9;12827:20;12820:54;12930:4;12922:6;12918:17;12912:24;12905:4;12894:9;12890:20;12883:54;13005:2;12997:4;12989:6;12985:17;12979:24;12975:33;12968:4;12957:9;12953:20;12946:63;;12199:816;;;;;37006:468:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36994:480;;37501:12;37489:24;;;;37528:13;37589:127;37621:8;37648:9;37676:4;37699:2;37589:13;:127::i;:::-;37556:160;;-1:-1:-1;37556:160:0;-1:-1:-1;37556:160:0;-1:-1:-1;37737:17:0;;;37733:38;;;37763:8;;;;;;;;;;;;;;37733:38;37805:8;37790:12;:23;37786:44;;;37822:8;;;;;;;;;;;;;;37786:44;37867:4;37935:27;;;38001:15;37983:34;;37980:477;;;38063:4;38057:11;38158:66;38123:8;38090:157;38297:2;38290:4;38280:8;38276:19;38269:31;38350:13;38343:4;38333:8;38329:19;38322:42;38435:1;38432;38426:4;38416:8;38413:1;38402:9;38395:5;38390:47;38386:52;;37980:477;;38513:4;38504:5;38492:9;:17;:25;38488:100;;38536:52;38559:4;38566:2;38582:5;38570:9;:17;38536:14;:52::i;:::-;;38488:100;38610:49;;;19947:25:1;;;20003:2;19988:18;;19981:34;;;20031:18;;;20024:34;;;20089:2;20074:18;;20067:34;;;38610:49:0;;;;;;19934:3:1;19919:19;38610:49:0;;;;;;;36653:2018;;;;;36482:2196;;;;;;:::o;29020:1509::-;29110:4;29176:9;29168:18;29215:13;29207:22;;29204:219;;;29275:4;29269:11;29319:9;29309:8;29302:27;29401:1;29398;29393:3;29383:8;29378:3;29367:9;29360:5;29355:48;29351:53;;29204:219;-1:-1:-1;29466:37:0;;;;;29497:4;29466:37;;;2386:74:1;29452:11:0;;29506:1;;29466:22;29473:4;29466:22;;;;2359:18:1;;29466:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;-1:-1:-1;29539:8:0;29579:13;29646;29638:22;;29635:861;;;29706:4;29700:11;29801:66;29766:8;29733:157;29940:6;29933:4;29923:8;29919:19;29912:35;30015:3;30010:2;30005:3;30001:12;29997:22;29990:4;29980:8;29976:19;29969:51;30091:1;30088;30082:4;30072:8;30069:1;30058:9;30051:5;30046:47;30042:52;30184:66;30149:8;30116:157;30323:6;30316:4;30306:8;30302:19;30295:35;30398:3;30393:2;30388:3;30384:12;30380:22;30373:4;30363:8;30359:19;30352:51;30474:1;30471;30465:4;30455:8;30452:1;30441:9;30434:5;30429:47;30425:52;;29616:895;;;;29020:1509::o;32034:420::-;32203:232;;;;;;;;;;;32318:4;32203:232;;;;;;32354:17;32203:232;;;;;;;;;;;;32165:281;;;;;20337:13:1;;32165:281:0;;;20319:32:1;20393:24;;32165:23:0;20389:73:1;;;20367:20;;;20360:103;20492:24;;20607:21;;20585:20;;;20578:51;20671:24;;20667:33;;;20645:20;;;20638:63;-1:-1:-1;;;;32165:15:0;:23;;;;;;20291:19:1;;32165:281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32154:292;;;;-1:-1:-1;32034:420:0;-1:-1:-1;;32034:420:0:o;35287:1187::-;35474:15;35504:20;35539;35587:10;35600:11;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35667:11;;35656:45;;;;;;;;2072:25:1;;;35587:41:0;;-1:-1:-1;35639:14:0;;35667:11;;;;;35656:39;;2045:18:1;;35656:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35639:62;;35754:15;:20;;;35789:666;;;;;;;;35855:4;35789:666;;;;;;35894:4;35789:666;;;;;;35923:5;35789:666;;;;;;35982:7;35958:32;;35965:8;35958:4;:15;;;;:::i;:::-;:32;;;:109;;36052:15;36059:8;36052:4;:15;:::i;:::-;35958:109;;;36020:7;35958:109;35789:666;;;;;;36121:6;36097:15;36104:8;36097:4;:15;:::i;:::-;:31;;;:107;;36189:15;36196:8;36189:4;:15;:::i;:::-;36097:107;;;36158:6;36097:107;35789:666;;;;;;36239:11;35789:666;;;;36285:14;35789:666;;;;36330:1;35789:666;;;;36362:1;35789:666;;;;36393:2;35789:666;;;;;;36424:15;35789:666;;;35754:712;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35712:754;;;;-1:-1:-1;35712:754:0;;-1:-1:-1;35287:1187:0;;-1:-1:-1;;;;;;;;35287:1187:0:o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:455::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;640:2;628:15;645:66;624:88;609:104;;;;715:2;605:113;;269:455;-1:-1:-1;;269:455:1:o;729:154::-;815:42;808:5;804:54;797:5;794:65;784:93;;873:1;870;863:12;784:93;729:154;:::o;888:315::-;956:6;964;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;:::-;1141:5;1193:2;1178:18;;;;1165:32;;-1:-1:-1;;;888:315:1:o;1400:521::-;1495:6;1503;1511;1519;1527;1580:3;1568:9;1559:7;1555:23;1551:33;1548:53;;;1597:1;1594;1587:12;1548:53;1633:9;1620:23;1610:33;;1690:2;1679:9;1675:18;1662:32;1652:42;;1741:2;1730:9;1726:18;1713:32;1703:42;;1792:2;1781:9;1777:18;1764:32;1754:42;;1846:3;1835:9;1831:19;1818:33;1860:31;1885:5;1860:31;:::i;:::-;1910:5;1900:15;;;1400:521;;;;;;;;:::o;2471:367::-;2534:8;2544:6;2598:3;2591:4;2583:6;2579:17;2575:27;2565:55;;2616:1;2613;2606:12;2565:55;-1:-1:-1;2639:20:1;;2682:18;2671:30;;2668:50;;;2714:1;2711;2704:12;2668:50;2751:4;2743:6;2739:17;2727:29;;2811:3;2804:4;2794:6;2791:1;2787:14;2779:6;2775:27;2771:38;2768:47;2765:67;;;2828:1;2825;2818:12;2765:67;2471:367;;;;;:::o;2843:773::-;2965:6;2973;2981;2989;3042:2;3030:9;3021:7;3017:23;3013:32;3010:52;;;3058:1;3055;3048:12;3010:52;3098:9;3085:23;3127:18;3168:2;3160:6;3157:14;3154:34;;;3184:1;3181;3174:12;3154:34;3223:70;3285:7;3276:6;3265:9;3261:22;3223:70;:::i;:::-;3312:8;;-1:-1:-1;3197:96:1;-1:-1:-1;3400:2:1;3385:18;;3372:32;;-1:-1:-1;3416:16:1;;;3413:36;;;3445:1;3442;3435:12;3413:36;;3484:72;3548:7;3537:8;3526:9;3522:24;3484:72;:::i;:::-;2843:773;;;;-1:-1:-1;3575:8:1;-1:-1:-1;;;;2843:773:1:o;3621:456::-;3698:6;3706;3714;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3841:31;3866:5;3841:31;:::i;:::-;3891:5;-1:-1:-1;3948:2:1;3933:18;;3920:32;3961:33;3920:32;3961:33;:::i;:::-;3621:456;;4013:7;;-1:-1:-1;;;4067:2:1;4052:18;;;;4039:32;;3621:456::o;4082:247::-;4141:6;4194:2;4182:9;4173:7;4169:23;4165:32;4162:52;;;4210:1;4207;4200:12;4162:52;4249:9;4236:23;4268:31;4293:5;4268:31;:::i;4523:481::-;4599:6;4607;4615;4668:2;4656:9;4647:7;4643:23;4639:32;4636:52;;;4684:1;4681;4674:12;4636:52;4723:9;4710:23;4773:6;4766:5;4762:18;4755:5;4752:29;4742:57;;4795:1;4792;4785:12;4742:57;4818:5;-1:-1:-1;4870:2:1;4855:18;;4842:32;;-1:-1:-1;4926:2:1;4911:18;;4898:32;4939:33;4898:32;4939:33;:::i;:::-;4991:7;4981:17;;;4523:481;;;;;:::o;5009:525::-;5095:6;5103;5111;5119;5172:3;5160:9;5151:7;5147:23;5143:33;5140:53;;;5189:1;5186;5179:12;5140:53;5225:9;5212:23;5202:33;;5285:2;5274:9;5270:18;5257:32;5298:31;5323:5;5298:31;:::i;:::-;5348:5;-1:-1:-1;5400:2:1;5385:18;;5372:32;;-1:-1:-1;5456:2:1;5441:18;;5428:32;5469:33;5428:32;5469:33;:::i;:::-;5009:525;;;;-1:-1:-1;5009:525:1;;-1:-1:-1;;5009:525:1:o;5539:388::-;5607:6;5615;5668:2;5656:9;5647:7;5643:23;5639:32;5636:52;;;5684:1;5681;5674:12;5636:52;5723:9;5710:23;5742:31;5767:5;5742:31;:::i;:::-;5792:5;-1:-1:-1;5849:2:1;5834:18;;5821:32;5862:33;5821:32;5862:33;:::i;:::-;5914:7;5904:17;;;5539:388;;;;;:::o;5932:727::-;6020:6;6028;6036;6044;6097:2;6085:9;6076:7;6072:23;6068:32;6065:52;;;6113:1;6110;6103:12;6065:52;6149:9;6136:23;6126:33;;6206:2;6195:9;6191:18;6178:32;6168:42;;6261:2;6250:9;6246:18;6233:32;6284:18;6325:2;6317:6;6314:14;6311:34;;;6341:1;6338;6331:12;6311:34;6379:6;6368:9;6364:22;6354:32;;6424:7;6417:4;6413:2;6409:13;6405:27;6395:55;;6446:1;6443;6436:12;6395:55;6486:2;6473:16;6512:2;6504:6;6501:14;6498:34;;;6528:1;6525;6518:12;6498:34;6573:7;6568:2;6559:6;6555:2;6551:15;6547:24;6544:37;6541:57;;;6594:1;6591;6584:12;6541:57;5932:727;;;;-1:-1:-1;;6625:2:1;6617:11;;-1:-1:-1;;;5932:727:1:o;6664:251::-;6734:6;6787:2;6775:9;6766:7;6762:23;6758:32;6755:52;;;6803:1;6800;6793:12;6755:52;6835:9;6829:16;6854:31;6879:5;6854:31;:::i;6920:192::-;6999:13;;7052:34;7041:46;;7031:57;;7021:85;;7102:1;7099;7092:12;7021:85;6920:192;;;:::o;7117:470::-;7205:6;7213;7221;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;7322:9;7316:16;7341:31;7366:5;7341:31;:::i;:::-;7441:2;7426:18;;7420:25;7391:5;;-1:-1:-1;7454:33:1;7420:25;7454:33;:::i;:::-;7506:7;-1:-1:-1;7532:49:1;7577:2;7562:18;;7532:49;:::i;:::-;7522:59;;7117:470;;;;;:::o;7592:184::-;7644:77;7641:1;7634:88;7741:4;7738:1;7731:15;7765:4;7762:1;7755:15;7781:274;7853:34;7919:10;;;7931;;;7915:27;7962:20;;;;7853:34;8001:24;;;7991:58;;8029:18;;:::i;:::-;7991:58;;7781:274;;;;:::o;8060:184::-;8112:77;8109:1;8102:88;8209:4;8206:1;8199:15;8233:4;8230:1;8223:15;8249:216;8289:1;8315:34;8376:2;8373:1;8369:10;8398:3;8388:37;;8405:18;;:::i;:::-;8443:10;;8439:20;;;;;8249:216;-1:-1:-1;;8249:216:1:o;8802:278::-;8871:6;8924:2;8912:9;8903:7;8899:23;8895:32;8892:52;;;8940:1;8937;8930:12;8892:52;8972:9;8966:16;9022:8;9015:5;9011:20;9004:5;9001:31;8991:59;;9046:1;9043;9036:12;9085:125;9150:9;;;9171:10;;;9168:36;;;9184:18;;:::i;9690:184::-;9760:6;9813:2;9801:9;9792:7;9788:23;9784:32;9781:52;;;9829:1;9826;9819:12;9781:52;-1:-1:-1;9852:16:1;;9690:184;-1:-1:-1;9690:184:1:o;10888:::-;10940:77;10937:1;10930:88;11037:4;11034:1;11027:15;11061:4;11058:1;11051:15;11077:128;11144:9;;;11165:11;;;11162:37;;;11179:18;;:::i;11522:172::-;11589:10;11619;;;11631;;;11615:27;;11654:11;;;11651:37;;;11668:18;;:::i;:::-;11651:37;11522:172;;;;:::o;13020:208::-;13090:6;13143:2;13131:9;13122:7;13118:23;13114:32;13111:52;;;13159:1;13156;13149:12;13111:52;13182:40;13212:9;13182:40;:::i;13802:389::-;13840:1;13881;13878;13867:16;13917:1;13914;13903:16;13938:3;13928:37;;13945:18;;:::i;:::-;14066:66;14061:3;14058:75;13989:66;13984:3;13981:75;13977:157;13974:183;;;14137:18;;:::i;:::-;14171:14;;;13802:389;-1:-1:-1;;;13802:389:1:o;14196:237::-;14234:7;14311:1;14308;14297:16;14293:1;14290;14279:16;14275:39;14348:11;14345:1;14334:26;14323:37;;14391:11;14382:7;14379:24;14369:58;;14407:18;;:::i;14438:247::-;14536:1;14525:16;;;14507;;;;14503:39;14567:66;14557:77;;14646:8;14636:19;;14554:102;14551:128;;;14659:18;;:::i;14690:243::-;14786:1;14757:16;;;14775;;;;14753:39;14816:8;14807:18;;14836:66;14827:76;;14804:100;14801:126;;;14907:18;;:::i;15034:1220::-;15254:13;;2185:42;2174:54;2162:67;;15222:3;15207:19;;15326:4;15318:6;15314:17;15308:24;15341:54;15389:4;15378:9;15374:20;15360:12;2185:42;2174:54;2162:67;;2108:127;15341:54;;15444:4;15436:6;15432:17;15426:24;15459:55;15508:4;15497:9;15493:20;15477:14;12178:8;12167:20;12155:33;;12102:92;15459:55;;15563:4;15555:6;15551:17;15545:24;15578:54;15626:4;15615:9;15611:20;15595:14;15013:1;15002:20;14990:33;;14938:91;15578:54;;15681:4;15673:6;15669:17;15663:24;15696:54;15744:4;15733:9;15729:20;15713:14;15013:1;15002:20;14990:33;;14938:91;15696:54;;15806:4;15798:6;15794:17;15788:24;15781:4;15770:9;15766:20;15759:54;15869:4;15861:6;15857:17;15851:24;15844:4;15833:9;15829:20;15822:54;15932:4;15924:6;15920:17;15914:24;15907:4;15896:9;15892:20;15885:54;15958:6;16018:2;16010:6;16006:15;16000:22;15995:2;15984:9;15980:18;15973:50;;16042:6;16097:2;16089:6;16085:15;16079:22;16110:54;16160:2;16149:9;16145:18;16129:14;2185:42;2174:54;2162:67;;2108:127;16110:54;-1:-1:-1;;16183:6:1;16231:15;;;16225:22;16205:18;;;;16198:50;15034:1220;:::o;16259:392::-;16356:6;16364;16372;16380;16433:3;16421:9;16412:7;16408:23;16404:33;16401:53;;;16450:1;16447;16440:12;16401:53;16479:9;16473:16;16463:26;;16508:49;16553:2;16542:9;16538:18;16508:49;:::i;:::-;16597:2;16582:18;;16576:25;16641:2;16626:18;;;16620:25;16259:392;;16498:59;;-1:-1:-1;16259:392:1;-1:-1:-1;;;16259:392:1:o;16958:277::-;17025:6;17078:2;17066:9;17057:7;17053:23;17049:32;17046:52;;;17094:1;17091;17084:12;17046:52;17126:9;17120:16;17179:5;17172:13;17165:21;17158:5;17155:32;17145:60;;17201:1;17198;17191:12;17240:120;17280:1;17306;17296:35;;17311:18;;:::i;:::-;-1:-1:-1;17345:9:1;;17240:120::o;17365:168::-;17438:9;;;17469;;17486:15;;;17480:22;;17466:37;17456:71;;17507:18;;:::i;18101:245::-;18180:6;18188;18241:2;18229:9;18220:7;18216:23;18212:32;18209:52;;;18257:1;18254;18247:12;18209:52;-1:-1:-1;;18280:16:1;;18336:2;18321:18;;;18315:25;18280:16;;18315:25;;-1:-1:-1;18101:245:1:o;18351:287::-;18480:3;18518:6;18512:13;18534:66;18593:6;18588:3;18581:4;18573:6;18569:17;18534:66;:::i;:::-;18616:16;;;;;18351:287;-1:-1:-1;;18351:287:1:o;18988:277::-;19056:6;19109:2;19097:9;19088:7;19084:23;19080:32;19077:52;;;19125:1;19122;19115:12;19077:52;19157:9;19151:16;19210:5;19207:1;19196:20;19189:5;19186:31;19176:59;;19231:1;19228;19221:12

Swarm Source

ipfs://fb8badff437aa9a7dd33288b7e2a376e3b0985736d5275e9fb693176c26504db
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.