ETH Price: $2,272.26 (-7.28%)

Contract

0x0B64bA230D4c9d133aA7a52ceFF1620178b07c55

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
0x8a4fcfcc4bf40392a1b3fa4ff71c8c16c310859f5e67a5cc7b7d497d75403950 -(pending)2025-11-02 9:26:0391 days ago1762075563IN
0x0B64bA23...178b07c55
0 ETH(Pending)(Pending)
Swap285425922026-02-02 2:45:406 mins ago1770000340IN
0x0B64bA23...178b07c55
0 ETH0.000011840.0575
Swap285415792026-02-02 1:49:001 hr ago1769996940IN
0x0B64bA23...178b07c55
0 ETH0.000010920.05300541
Swap285415602026-02-02 1:48:141 hr ago1769996894IN
0x0B64bA23...178b07c55
0 ETH0.000010960.05322311
Swap285415102026-02-02 1:45:521 hr ago1769996752IN
0x0B64bA23...178b07c55
0 ETH0.000009410.04571332
Swap285411872026-02-02 1:30:441 hr ago1769995844IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285407062026-02-02 1:10:501 hr ago1769994650IN
0x0B64bA23...178b07c55
0 ETH0.000014240.0691416
Swap285395562026-02-02 0:18:262 hrs ago1769991506IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285392932026-02-02 0:06:482 hrs ago1769990808IN
0x0B64bA23...178b07c55
0 ETH0.000009980.05844539
Swap285392282026-02-02 0:04:022 hrs ago1769990642IN
0x0B64bA23...178b07c55
0 ETH0.000011440.05553059
Swap285392232026-02-02 0:03:522 hrs ago1769990632IN
0x0B64bA23...178b07c55
0 ETH0.000013410.0651
Swap285392082026-02-02 0:03:222 hrs ago1769990602IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285391692026-02-02 0:01:562 hrs ago1769990516IN
0x0B64bA23...178b07c55
0 ETH0.000012360.06
Swap285390512026-02-01 23:54:482 hrs ago1769990088IN
0x0B64bA23...178b07c55
0 ETH0.000018860.09157043
Swap285390472026-02-01 23:54:382 hrs ago1769990078IN
0x0B64bA23...178b07c55
0 ETH0.000018860.09157043
Swap285390012026-02-01 23:52:062 hrs ago1769989926IN
0x0B64bA23...178b07c55
0 ETH0.000015710.07628309
Swap285387112026-02-01 23:37:083 hrs ago1769989028IN
0x0B64bA23...178b07c55
0 ETH0.000011040.05360058
Swap285384302026-02-01 23:24:283 hrs ago1769988268IN
0x0B64bA23...178b07c55
0 ETH0.00001340.06504689
Swap285383152026-02-01 23:19:503 hrs ago1769987990IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285382842026-02-01 23:18:243 hrs ago1769987904IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285382802026-02-01 23:18:123 hrs ago1769987892IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285382212026-02-01 23:15:563 hrs ago1769987756IN
0x0B64bA23...178b07c55
0 ETH0.000007680.041904
Swap285382172026-02-01 23:15:483 hrs ago1769987748IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285380512026-02-01 23:09:443 hrs ago1769987384IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
Swap285380372026-02-01 23:09:143 hrs ago1769987354IN
0x0B64bA23...178b07c55
0 ETH0.000008630.041904
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
285425922026-02-02 2:45:406 mins ago1770000340
0x0B64bA23...178b07c55
0 ETH
285425922026-02-02 2:45:406 mins ago1770000340
0x0B64bA23...178b07c55
0 ETH
285425922026-02-02 2:45:406 mins ago1770000340
0x0B64bA23...178b07c55
0 ETH
285415792026-02-02 1:49:001 hr ago1769996940
0x0B64bA23...178b07c55
0 ETH
285415792026-02-02 1:49:001 hr ago1769996940
0x0B64bA23...178b07c55
0 ETH
285415792026-02-02 1:49:001 hr ago1769996940
0x0B64bA23...178b07c55
0 ETH
285415602026-02-02 1:48:141 hr ago1769996894
0x0B64bA23...178b07c55
0 ETH
285415602026-02-02 1:48:141 hr ago1769996894
0x0B64bA23...178b07c55
0 ETH
285415602026-02-02 1:48:141 hr ago1769996894
0x0B64bA23...178b07c55
0 ETH
285415102026-02-02 1:45:521 hr ago1769996752
0x0B64bA23...178b07c55
0 ETH
285415102026-02-02 1:45:521 hr ago1769996752
0x0B64bA23...178b07c55
0 ETH
285415102026-02-02 1:45:521 hr ago1769996752
0x0B64bA23...178b07c55
0 ETH
285411872026-02-02 1:30:441 hr ago1769995844
0x0B64bA23...178b07c55
0 ETH
285411872026-02-02 1:30:441 hr ago1769995844
0x0B64bA23...178b07c55
0 ETH
285411872026-02-02 1:30:441 hr ago1769995844
0x0B64bA23...178b07c55
0 ETH
285407062026-02-02 1:10:501 hr ago1769994650
0x0B64bA23...178b07c55
0 ETH
285407062026-02-02 1:10:501 hr ago1769994650
0x0B64bA23...178b07c55
0 ETH
285407062026-02-02 1:10:501 hr ago1769994650
0x0B64bA23...178b07c55
0 ETH
285395562026-02-02 0:18:262 hrs ago1769991506
0x0B64bA23...178b07c55
0 ETH
285395562026-02-02 0:18:262 hrs ago1769991506
0x0B64bA23...178b07c55
0 ETH
285395562026-02-02 0:18:262 hrs ago1769991506
0x0B64bA23...178b07c55
0 ETH
285392932026-02-02 0:06:482 hrs ago1769990808
0x0B64bA23...178b07c55
0 ETH
285392932026-02-02 0:06:482 hrs ago1769990808
0x0B64bA23...178b07c55
0 ETH
285392932026-02-02 0:06:482 hrs ago1769990808
0x0B64bA23...178b07c55
0 ETH
285392282026-02-02 0:04:022 hrs ago1769990642
0x0B64bA23...178b07c55
0 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyncSwapRouterV3

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 2000000 runs

Other Settings:
paris EvmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at lineascan.build/ on 2025-04-10
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
//      ___                         ___           ___           ___           ___           ___                   
//     /  /\          __           /  /\         /  /\         /  /\         /  /\         /  /\          ___     
//    /  /::\        |  |\        /  /::|       /  /::\       /  /::\       /  /:/_       /  /::\        /  /\    
//   /__/:/\:\       |  |:|      /  /:|:|      /  /:/\:\     /__/:/\:\     /  /:/ /\     /  /:/\:\      /  /::\   
//  _\_ \:\ \:\      |  |:|     /  /:/|:|__   /  /:/  \:\   _\_ \:\ \:\   /  /:/ /:/_   /  /::\ \:\    /  /:/\:\  
// /__/\ \:\ \:\     |__|:|__  /__/:/ |:| /\ /__/:/ \  \:\ /__/\ \:\ \:\ /__/:/ /:/ /\ /__/:/\:\_\:\  /  /::\ \:\ 
// \  \:\ \:\_\/     /  /::::\ \__\/  |:|/:/ \  \:\  \__\/ \  \:\ \:\_\/ \  \:\/:/ /:/ \__\/  \:\/:/ /__/:/\:\_\:\
//  \  \:\_\:\      /  /:/~~~~     |  |:/:/   \  \:\        \  \:\_\:\    \  \::/ /:/       \__\::/  \__\/  \:\/:/
//   \  \:\/:/     /__/:/          |__|::/     \  \:\        \  \:\/:/     \  \:\/:/        /  /:/        \  \::/ 
//    \  \::/      \__\/           /__/:/       \  \:\        \  \::/       \  \::/        /__/:/          \__\/  
//     \__\/                       \__\/         \__\/         \__\/         \__\/         \__\/                  
//
// Welcome to the SyncSwap V3 Router!
//

pragma solidity ^0.8.0;

interface IRouter {
    struct SwapStep {
        address pool;
        bytes data;
        address callback;
        bytes callbackData;
        bool useVault;

        address tokenOut;
        bool zeroForOne;
        address recipient;
        uint160 sqrtPriceLimitX96;
    }

    struct SwapPath {
        SwapStep[] steps;
        address tokenIn;
        uint amountIn;
    }

    struct SplitPermitParams {
        address token;
        uint approveAmount;
        uint deadline;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct ArrayPermitParams {
        uint approveAmount;
        uint deadline;
        bytes signature;
    }
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

interface IStaking {
    function stake(uint amount, address to) external;
    function stake(address token, uint amount, address to) external;
}

interface IPoolFactory {
    function master() external view returns (address);

    function getDeployData() external view returns (bytes memory);

    function createPool(bytes calldata data) external returns (address pool);
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(msg.sender);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract Rescuable is Ownable {
    /// @dev Rescues ERC20 tokens.
    function rescueERC20(address token, address to, uint256 amount) external onlyOwner {
        require(to != address(0) && to != token, "Invalid to");

        uint balance = IERC20(token).balanceOf(address(this));

        if (amount == 0) {
            TransferHelper.safeTransfer(token, to, balance);
        } else {
            require(amount <= balance, "Exceeds balance");
            TransferHelper.safeTransfer(token, to, amount);
        }
    }

    /// @dev Rescues Ether.
    function rescueETH(address payable to, uint256 amount) external onlyOwner {
        if (amount == 0) {
            amount = address(this).balance;
        }
        TransferHelper.safeTransferETH(to, amount);
    }
}

/// @dev The ETH transfer has failed.
error ETHTransferFailed();

/// @dev The ERC20 `transferFrom` has failed.
error TransferFromFailed();

/// @dev The ERC20 `transfer` has failed.
error TransferFailed();

/// @dev The ERC20 `approve` has failed.
error ApproveFailed();

/// @dev Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true / false.
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("approve(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ApproveFailed();
        }
    }

    function safeTransfer(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transfer(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFailed();
        }
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFromFailed();
        }
    }

    function safeTransferETH(address to, uint value) internal {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, ) = to.call{value: value}("");

        if (!success) {
            revert ETHTransferFailed();
        }
    }
}

interface IERC20Base {
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);
    function transfer(address to, uint amount) external returns (bool);
    function transferFrom(address from, address to, uint amount) external returns (bool);
    
    event Approval(address indexed owner, address indexed spender, uint amount);
    event Transfer(address indexed from, address indexed to, uint amount);
}

interface IERC20 is IERC20Base {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

interface IERC20Permit is IERC20 {
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner) external view returns (uint);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

interface IERC20Permit2 is IERC20Permit {
    function permit2(address owner, address spender, uint amount, uint deadline, bytes calldata signature) external;
}

/// @title Interface for permit
/// @notice Interface used by DAI/CHAI for permit
interface IERC20PermitAllowed {
    /// @notice Approve the spender to spend some tokens via the holder signature
    /// @dev This is the permit interface used by DAI and CHAI
    /// @param holder The address of the token holder, the token owner
    /// @param spender The address of the token spender
    /// @param nonce The holder's nonce, increases at each call to permit
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0
    /// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s`
    /// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s`
    /// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v`
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

abstract contract SelfPermit {
    function selfPermit(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    function selfPermitIfNecessary(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit(token, value, deadline, v, r, s);
        }
    }

    function selfPermitAllowed(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s);
    }

    function selfPermitAllowedIfNecessary(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max) {
            selfPermitAllowed(token, nonce, expiry, v, r, s);
        }
    }

    function selfPermit2(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) public payable {
        IERC20Permit2(token).permit2(msg.sender, address(this), value, deadline, signature);
    }

    function selfPermit2IfNecessary(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit2(token, value, deadline, signature);
        }
    }
}

/// @title Permissionless pool actions
/// @notice Contains pool methods that can be called by anyone
interface ICLPoolActions {
    /// @notice Initialize function used in proxy deployment
    /// @dev Can be called once only
    /// Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value
    /// @dev not locked because it initializes unlocked
    /// @param _factory The CL factory contract address
    /// @param _token0 The first token of the pool by address sort order
    /// @param _token1 The second token of the pool by address sort order
    /// @param _tickSpacing The pool tick spacing
    /// @param _sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96
    function initialize(
        address _factory,
        address _token0,
        address _token1,
        int24 _tickSpacing,
        uint160 _sqrtPriceX96
    ) external;

    /// @notice Initialize gauge and nft manager
    /// @dev Callable only once, by the gauge factory
    /// @param _gauge The gauge corresponding to this pool
    /// @param _nft The position manager used for position management
    function setGaugeAndPositionManager(address _gauge, address _nft) external;

    /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position
    /// @dev The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback
    /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends
    /// on tickLower, tickUpper, the amount of liquidity, and the current price.
    /// @param recipient The address for which the liquidity will be created
    /// @param tickLower The lower tick of the position in which to add liquidity
    /// @param tickUpper The upper tick of the position in which to add liquidity
    /// @param amount The amount of liquidity to mint
    /// @param data Any data that should be passed through to the callback
    /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback
    /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback
    function mint(address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data)
        external
        returns (uint256 amount0, uint256 amount1);

    /// @notice Collects tokens owed to a position
    /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.
    /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or
    /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the
    /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.
    /// @param recipient The address which should receive the fees collected
    /// @param tickLower The lower tick of the position for which to collect fees
    /// @param tickUpper The upper tick of the position for which to collect fees
    /// @param amount0Requested How much token0 should be withdrawn from the fees owed
    /// @param amount1Requested How much token1 should be withdrawn from the fees owed
    /// @return amount0 The amount of fees collected in token0
    /// @return amount1 The amount of fees collected in token1
    function collect(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount0Requested,
        uint128 amount1Requested
    ) external returns (uint128 amount0, uint128 amount1);

    /// @notice Collects tokens owed to a position
    /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.
    /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or
    /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the
    /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.
    /// @param recipient The address which should receive the fees collected
    /// @param tickLower The lower tick of the position for which to collect fees
    /// @param tickUpper The upper tick of the position for which to collect fees
    /// @param amount0Requested How much token0 should be withdrawn from the fees owed
    /// @param amount1Requested How much token1 should be withdrawn from the fees owed
    /// @param owner Owner of the position in the pool (nft manager or gauge)
    /// @return amount0 The amount of fees collected in token0
    /// @return amount1 The amount of fees collected in token1
    function collect(
        address recipient,
        int24 tickLower,
        int24 tickUpper,
        uint128 amount0Requested,
        uint128 amount1Requested,
        address owner
    ) external returns (uint128 amount0, uint128 amount1);

    /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position
    /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0
    /// @dev Fees must be collected separately via a call to #collect
    /// @param tickLower The lower tick of the position for which to burn liquidity
    /// @param tickUpper The upper tick of the position for which to burn liquidity
    /// @param amount How much liquidity to burn
    /// @return amount0 The amount of token0 sent to the recipient
    /// @return amount1 The amount of token1 sent to the recipient
    function burn(int24 tickLower, int24 tickUpper, uint128 amount)
        external
        returns (uint256 amount0, uint256 amount1);

    /// @notice Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position
    /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0
    /// @dev Fees must be collected separately via a call to #collect
    /// @param tickLower The lower tick of the position for which to burn liquidity
    /// @param tickUpper The upper tick of the position for which to burn liquidity
    /// @param amount How much liquidity to burn
    /// @param owner Owner of the position in the pool (nft manager or gauge)
    /// @return amount0 The amount of token0 sent to the recipient
    /// @return amount1 The amount of token1 sent to the recipient
    function burn(int24 tickLower, int24 tickUpper, uint128 amount, address owner)
        external
        returns (uint256 amount0, uint256 amount1);

    /// @notice Convert existing liquidity into staked liquidity
    /// @notice Only callable by the gauge associated with this pool
    /// @param stakedLiquidityDelta The amount by which to increase or decrease the staked liquidity
    /// @param tickLower The lower tick of the position for which to stake liquidity
    /// @param tickUpper The upper tick of the position for which to stake liquidity
    /// @param positionUpdate If the nft and gauge position should be updated
    function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper, bool positionUpdate) external;

    /// @notice Swap token0 for token1, or token1 for token0
    /// @dev The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback
    /// @param recipient The address to receive the output of the swap
    /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0
    /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)
    /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this
    /// value after the swap. If one for zero, the price cannot be greater than this value after the swap
    /// @param data Any data to be passed through to the callback
    /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive
    /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive
    function swap(
        address recipient,
        bool zeroForOne,
        int256 amountSpecified,
        uint160 sqrtPriceLimitX96,
        bytes calldata data
    ) external returns (int256 amount0, int256 amount1);

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

    /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback
    /// @dev The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallback
    /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling
    /// with 0 amount{0,1} and sending the donation amount(s) from the callback
    /// @param recipient The address which will receive the token0 and token1 amounts
    /// @param amount0 The amount of token0 to send
    /// @param amount1 The amount of token1 to send
    /// @param data Any data to be passed through to the callback
    function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external;

    /// @notice Increase the maximum number of price and liquidity observations that this pool will store
    /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to
    /// the input observationCardinalityNext.
    /// @param observationCardinalityNext The desired minimum number of observations for the pool to store
    function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;

    /// @notice Updates rewardGrowthGlobalX128 every time when any tick is crossed,
    /// or when any position is staked/unstaked from the gauge
    function updateRewardsGrowthGlobal() external;

    /// @notice Syncs rewards with gauge
    /// @param rewardRate the rate rewards being distributed during the epoch
    /// @param rewardReserve the available rewards to be distributed during the epoch
    /// @param periodFinish the end of the current period of rewards, updated once per epoch
    function syncReward(uint256 rewardRate, uint256 rewardReserve, uint256 periodFinish) external;
}

/// @notice Helper utility that enables calling multiple local methods in a single call.
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol)
/// License-Identifier: GPL-2.0-or-later
abstract contract Multicall {
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        results = new bytes[](data.length);
        
        for (uint i; i < data.length;) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;

            // cannot realistically overflow on human timescales
            unchecked {
                ++i;
            }
        }
    }
}

interface IPool {
    struct TokenAmount {
        address token;
        uint amount;
    }

    /// @dev Returns the address of pool master.
    function master() external view returns (address);

    /// @dev Returns the vault.
    function vault() external view returns (address);

    /// @dev Returns the pool type.
    function poolType() external view returns (uint16);

    /// @dev Returns the assets of the pool.
    function getAssets() external view returns (address[] memory assets);

    /// @dev Returns the swap fee of the pool.
    function getSwapFee(address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24 swapFee);

    /// @dev Returns the protocol fee of the pool.
    function getProtocolFee() external view returns (uint24 protocolFee);

    /// @dev Mints liquidity.
    function mint(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (uint liquidity);

    /// @dev Burns liquidity.
    function burn(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount[] memory tokenAmounts);

    /// @dev Burns liquidity with single output token.
    function burnSingle(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);

    /// @dev Swaps between tokens.
    function swap(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);
}

interface IBasePool is IPool, IERC20Permit2 {
    function token0() external view returns (address);
    function token1() external view returns (address);

    function reserve0() external view returns (uint);
    function reserve1() external view returns (uint);
    function invariantLast() external view returns (uint);

    function getReserves() external view returns (uint, uint);
    function getAmountOut(address tokenIn, uint amountIn, address sender) external view returns (uint amountOut);
    function getAmountIn(address tokenOut, uint amountOut, address sender) external view returns (uint amountIn);

    event Mint(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );

    event Sync(
        uint reserve0,
        uint reserve1
    );
}

interface IVault {
    function wETH() external view returns (address);

    function reserves(address token) external view returns (uint reserve);

    function balanceOf(address token, address owner) external view returns (uint balance);

    function deposit(address token, address to) external payable returns (uint amount);

    function depositETH(address to) external payable returns (uint amount);

    function transferAndDeposit(address token, address to, uint amount) external payable returns (uint);

    function transfer(address token, address to, uint amount) external;

    function withdraw(address token, address to, uint amount) external;

    function withdrawAlternative(address token, address to, uint amount, uint8 mode) external;

    function withdrawETH(address to, uint amount) external;
}

interface INFTPositionManager {
    struct MintParams {
        address token0;
        address token1;
        int24 tickSpacing;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
        uint160 sqrtPriceX96;
    }

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

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

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

error NotEnoughLiquidityMinted();
error TooLittleReceived();
error Expired();

/// @notice The router is a universal interface for users to access
/// functions across different protocol parts in one place.
///
/// It handles the allowances and transfers of tokens, and
/// allows chained swaps/operations across multiple pools, with
/// additional features like slippage protection and permit support.
///
contract SyncSwapRouterV3 is IRouter, SelfPermit, Multicall, Rescuable {

    struct TokenInput {
        address token;
        uint amount;
        bool useVault;
    }

    address public constant vault = 0x7160570BB153Edd0Ea1775EC2b2Ac9b65F1aB61B;
    address public constant wETH = 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f;
    address private constant NATIVE_TOKEN = address(0);

    mapping(address => mapping(address => bool)) public isPoolEntered;
    mapping(address => address[]) public enteredPools;

    modifier ensure(uint deadline) {
        // solhint-disable-next-line not-rely-on-time
        if (block.timestamp > deadline) {
            revert Expired();
        }
        _;
    }

    receive() external payable {
        //require(msg.sender == wETH, "Not wETH");
    }

    function enteredPoolsLength(address account) external view returns (uint) {
        return enteredPools[account].length;
    }

    function _transferFromSender(address token, address to, uint amount, bool useVault) private {
        if (useVault) {
            if (token == NATIVE_TOKEN || (token == wETH && address(this).balance >= amount)) {
                // Deposit ETH to the vault.
                IVault(vault).deposit{value: amount}(NATIVE_TOKEN, to);
            } else {
                // Transfer tokens to the vault.
                TransferHelper.safeTransferFrom(token, msg.sender, vault, amount);

                // Notify the vault to deposit to receiver.
                IVault(vault).deposit(token, to);
            }
        } else {
            if (token == NATIVE_TOKEN || (token == wETH && address(this).balance >= amount)) {
                // Wrap native ETH to wETH.
                IWETH(wETH).deposit{value: amount}();

                // Send wETH to the receiver.
                IWETH(wETH).transfer(to, amount);
            } else {
                // Transfer tokens to the receiver.
                TransferHelper.safeTransferFrom(token, msg.sender, to, amount);
            }
        }
    }

    function _transferAndAddLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData
    ) private returns (uint liquidity) {
        // Send all input tokens to the pool.
        uint n = inputs.length;

        TokenInput memory input;

        for (uint i; i < n; ) {
            input = inputs[i];

            _transferFromSender(input.token, pool, input.amount, input.useVault);

            unchecked {
                ++i;
            }
        }

        liquidity = IPool(pool).mint(data, msg.sender, callback, callbackData);

        if (liquidity < minLiquidity) {
            revert NotEnoughLiquidityMinted();
        }
    }

    function _markPoolEntered(address pool) private {
        if (!isPoolEntered[pool][msg.sender]) {
            isPoolEntered[pool][msg.sender] = true;
            enteredPools[msg.sender].push(pool);
        }
    }

    function addLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        address staking
    ) public payable returns (uint liquidity) {
        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );

        if (staking != address(0)) {
            address to = abi.decode(data, (address));
            IStaking(staking).stake(liquidity, to);
        }
    }

    function addLiquidity2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        address staking
    ) external payable returns (uint liquidity) {
        liquidity = addLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData,
            staking
        );

        _markPoolEntered(pool);
    }

    function addLiquidityWithPermit(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits,
        address staking
    ) public payable returns (uint liquidity) {
        // Approve all tokens via permit.
        uint n = permits.length;

        SplitPermitParams memory params;

        for (uint i; i < n; ) {
            params = permits[i];

            IERC20Permit(params.token).permit(
                msg.sender,
                address(this),
                params.approveAmount,
                params.deadline,
                params.v,
                params.r,
                params.s
            );

            unchecked {
                ++i;
            }
        }

        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );

        if (staking != address(0)) {
            address to = abi.decode(data, (address));
            IStaking(staking).stake(liquidity, to);
        }
    }

    function addLiquidityWithPermit2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits,
        address staking
    ) public payable returns (uint liquidity) {
        liquidity = addLiquidityWithPermit(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData,
            permits,
            staking
        );

        _markPoolEntered(pool);
    }

    // Burn Liquidity
    function _transferAndBurnLiquidity(
        address pool,
        uint liquidity,
        bytes memory data,
        uint[] memory minAmounts,
        address callback,
        bytes calldata callbackData
    ) private returns (IPool.TokenAmount[] memory amounts) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amounts = IPool(pool).burn(data, msg.sender, callback, callbackData);

        uint n = amounts.length;

        for (uint i; i < n; ) {
            IPool.TokenAmount memory tokenAmount = amounts[i];

            if (tokenAmount.amount < minAmounts[i]) {
                revert TooLittleReceived();
            }

            unchecked {
                ++i;
            }
        }
    }

    function burnLiquidity(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData
    ) external returns (IPool.TokenAmount[] memory amounts) {
        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    function burnLiquidityWithPermit(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData,
        ArrayPermitParams memory permit
    ) external returns (IPool.TokenAmount[] memory amounts) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    // Burn Liquidity Single
    function _transferAndBurnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) private returns (IPool.TokenAmount memory amountOut) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amountOut = IPool(pool).burnSingle(data, msg.sender, callback, callbackData);

        if (amountOut.amount < minAmount) {
            revert TooLittleReceived();
        }
    }

    function burnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) external returns (IPool.TokenAmount memory amountOut) {
        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    function burnLiquiditySingleWithPermit(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData,
        ArrayPermitParams calldata permit
    ) external returns (IPool.TokenAmount memory amountOut) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external {
        require(amount0Delta > 0 || amount1Delta > 0); // swaps entirely within 0-liquidity regions are not supported

        (address tokenIn, uint amountToPay) = abi.decode(data, (address, uint));

        //pay(tokenIn, address(this), msg.sender, amountToPay);

        /*
        if ((tokenIn == wETH || tokenIn == NATIVE_TOKEN) && address(this).balance >= amountToPay) {
            // pay with WETH
            IWETH(wETH).deposit{value: amountToPay}(); // wrap only what is needed to pay
            IWETH(wETH).transfer(msg.sender, amountToPay);
        } else {
            // pay with tokens already in the contract (for the exact input multihop case)
            TransferHelper.safeTransfer(tokenIn, msg.sender, amountToPay);
        }
        */

        // pay with tokens already in the contract (for the exact input multihop case)
        TransferHelper.safeTransfer(tokenIn == NATIVE_TOKEN ? wETH : tokenIn, msg.sender, amountToPay);
    }

    struct SwapState {
        IPool.TokenAmount lastAmountOut;
        uint lastStepIndex;
    }

    // Swap
    function _swap(
        SwapPath[] memory paths,
        uint amountOutMin,
        address ethUnwrapRecipient
    ) private returns (IPool.TokenAmount memory amountOut) {
        uint pathsLength = paths.length;

        SwapPath memory path;
        SwapStep memory step;

        SwapState memory state;

        for (uint pathIndex; pathIndex < pathsLength; ) {
            path = paths[pathIndex];

            // Prefund the first step.
            step = path.steps[0];

            // Receive funds from sender.
            if (step.recipient == address(0)) {
                _transferFromSender(
                    path.tokenIn,
                    step.pool, // prefund the first pool
                    path.amountIn,
                    step.useVault
                );
            } else {
                // range pools
                _transferFromSender(
                    path.tokenIn,
                    address(this), // send to router first for range pools
                    path.amountIn,
                    step.useVault
                );

                state.lastAmountOut = IPool.TokenAmount(path.tokenIn, path.amountIn);
            }

            // Cache steps length.
            state.lastStepIndex = path.steps.length - 1;

            uint stepIndex;
            while (true) {

                if (step.recipient == address(0)) {
                    state.lastAmountOut = IBasePool(step.pool).swap(
                        step.data, msg.sender, step.callback, step.callbackData
                    );
                } else {
                    // Using output amount of last step, or the path input amount for the first step.

                    // input token and amount
                    bytes memory rangePoolCallbackData = abi.encode(state.lastAmountOut.token, state.lastAmountOut.amount);

                    (int256 amount0, int256 amount1) = ICLPoolActions(step.pool).swap(
                        step.recipient,
                        step.zeroForOne,
                        int256(state.lastAmountOut.amount),
                        (
                            step.sqrtPriceLimitX96 == 0
                            ? (step.zeroForOne ? 4295128740 : 1461446703485210103287273052203988822378723970341)
                            : step.sqrtPriceLimitX96
                        ),
                        rangePoolCallbackData,
                        msg.sender,
                        step.callback,
                        step.callbackData
                    );

                    state.lastAmountOut = IPool.TokenAmount({
                        token: step.tokenOut,
                        amount: step.zeroForOne ? uint(-amount1) : uint(-amount0)
                    });
                }

                if (stepIndex >= state.lastStepIndex) {
                    amountOut.token = state.lastAmountOut.token;
                    amountOut.amount += state.lastAmountOut.amount;

                    break; // next path
                } else {
                    bool previousStepUseVault = step.useVault;

                    unchecked {
                        ++stepIndex;
                    }

                    // Cache the next step.
                    step = path.steps[stepIndex];

                    if (!previousStepUseVault && step.useVault) {
                        uint amount = IERC20(state.lastAmountOut.token).balanceOf(address(this));

                        // Transfer tokens to the vault.
                        TransferHelper.safeTransfer(state.lastAmountOut.token, vault, amount);

                        // Notify the vault to deposit.
                        IVault(vault).deposit(state.lastAmountOut.token, step.pool);
                    }
                }
            }

            unchecked {
                ++pathIndex;
            }
        }

        if (amountOut.amount < amountOutMin) {
            revert TooLittleReceived();
        }

        if (ethUnwrapRecipient != address(0)) {
            IWETH(wETH).withdraw(IERC20(wETH).balanceOf(address(this)));
            TransferHelper.safeTransferETH(ethUnwrapRecipient, address(this).balance);
        }
    }

    function swap(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline,
        address ethUnwrapRecipient
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        amountOut = _swap(
            paths,
            amountOutMin,
            ethUnwrapRecipient
        );
    }

    function swapWithPermit(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline,
        SplitPermitParams calldata permit,
        address ethUnwrapRecipient
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        // Approve input tokens via permit.
        IERC20Permit(permit.token).permit(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.v,
            permit.r,
            permit.s
        );

        amountOut = _swap(
            paths,
            amountOutMin,
            ethUnwrapRecipient
        );
    }

    function createPosition(
        address nftPositionManager,
        address pool,
        INFTPositionManager.MintParams calldata params
    ) public payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) {
        if (params.token0 != wETH || msg.value == 0) {
            _transferFromSender(params.token0, address(this), params.amount0Desired, false);
            _safeApproveToken(params.token0, nftPositionManager, params.amount0Desired);
        }

        if (params.token1 != wETH || msg.value == 0) {
            _transferFromSender(params.token1, address(this), params.amount1Desired, false);
            _safeApproveToken(params.token1, nftPositionManager, params.amount1Desired);
        }

        (tokenId, liquidity, amount0, amount1) = INFTPositionManager(nftPositionManager).mint{value: msg.value}(params);

        // refund
        _refundTokenTo(params.token0, msg.sender);
        _refundTokenTo(params.token1, msg.sender);

        _markPoolEntered(pool);
    }

    function createPositionWithPermit(
        address nftPositionManager,
        address pool,
        INFTPositionManager.MintParams calldata params,
        SplitPermitParams[] memory permits
    ) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1) {
        // Approve all tokens via permit.
        uint n = permits.length;

        SplitPermitParams memory permitParams;

        for (uint i; i < n; ) {
            permitParams = permits[i];

            IERC20Permit(permitParams.token).permit(
                msg.sender,
                address(this),
                permitParams.approveAmount,
                permitParams.deadline,
                permitParams.v,
                permitParams.r,
                permitParams.s
            );

            unchecked {
                ++i;
            }
        }

        (tokenId, liquidity, amount0, amount1) = createPosition(
            nftPositionManager,
            pool,
            params
        );
    }

    function increaseLiquidity(
        address nftPositionManager,
        address tokenA,
        address tokenB,
        INFTPositionManager.IncreaseLiquidityParams calldata params
    ) public payable returns (uint128 liquidity, uint256 amount0, uint256 amount1) {
        if (tokenA != wETH || msg.value == 0) {
            _transferFromSender(tokenA, address(this), params.amount0Desired, false);
            _safeApproveToken(tokenA, nftPositionManager, params.amount0Desired);
        }

        if (tokenB != wETH || msg.value == 0) {
            _transferFromSender(tokenB, address(this), params.amount1Desired, false);
            _safeApproveToken(tokenB, nftPositionManager, params.amount1Desired);
        }

        (liquidity, amount0, amount1) = INFTPositionManager(nftPositionManager).increaseLiquidity{value: msg.value}(params);

        // refund
        _refundTokenTo(tokenA, msg.sender);
        _refundTokenTo(tokenB, msg.sender);
    }

    function increaseLiquidityWithPermit(
        address nftPositionManager,
        address tokenA,
        address tokenB,
        INFTPositionManager.IncreaseLiquidityParams calldata params,
        SplitPermitParams[] memory permits
    ) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1) {
        // Approve all tokens via permit.
        uint n = permits.length;

        SplitPermitParams memory permitParams;

        for (uint i; i < n; ) {
            permitParams = permits[i];

            IERC20Permit(permitParams.token).permit(
                msg.sender,
                address(this),
                permitParams.approveAmount,
                permitParams.deadline,
                permitParams.v,
                permitParams.r,
                permitParams.s
            );

            unchecked {
                ++i;
            }
        }

        (liquidity, amount0, amount1) = increaseLiquidity(
            nftPositionManager,
            tokenA,
            tokenB,
            params
        );
    }

    function _refundTokenTo(address token, address to) private {
        if (token == NATIVE_TOKEN || token == wETH) {
            uint balance = IERC20(wETH).balanceOf(address(this));
            if (balance != 0) {
                IWETH(wETH).withdraw(balance);
            }
            if (address(this).balance != 0) {
                TransferHelper.safeTransferETH(to, address(this).balance);
            }
        } else {
            uint balance = IERC20(token).balanceOf(address(this));
            if (balance != 0) {
                TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
            }
        }
    }

    function _safeApproveToken(address token, address spender, uint amount) private {
        if (token != NATIVE_TOKEN) {
            if (IERC20(token).allowance(address(this), spender) < amount) {
                TransferHelper.safeApprove(token, spender, 0); // set to 0 first for better compatibility
                TransferHelper.safeApprove(token, spender, type(uint).max);
            }
        }
    }

    /// @notice Wrapper function to allow pool deployment to be batched.
    function createPool(address _factory, bytes calldata data) external payable returns (address) {
        return IPoolFactory(_factory).createPool(data);
    }

    function _stake(address target, address token, uint amount) private {
        TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount);

        if (IERC20(token).allowance(address(this), target) < amount) {
            /// @dev This can approve arbitrary contract, the router is not intended to store any funds.
            TransferHelper.safeApprove(token, target, type(uint).max);
        }
    }

    /// @dev Universal function to stake tokens to a target contract.
    function stake(address target, address token, uint amount, address to) external {
        _stake(target, token, amount);
        IStaking(target).stake(amount, to);
    }

    function stakeWithToken(address target, address token, uint amount, address to) external {
        _stake(target, token, amount);
        IStaking(target).stake(token, amount, to);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"ApproveFailed","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"NotEnoughLiquidityMinted","type":"error"},{"inputs":[],"name":"TooLittleReceived","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV3.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV3.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV3.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV3.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquidity","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquiditySingle","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquiditySingleWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquidityWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftPositionManager","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"}],"internalType":"struct INFTPositionManager.MintParams","name":"params","type":"tuple"}],"name":"createPosition","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftPositionManager","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"}],"internalType":"struct INFTPositionManager.MintParams","name":"params","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"}],"name":"createPositionWithPermit","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"enteredPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enteredPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftPositionManager","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct INFTPositionManager.IncreaseLiquidityParams","name":"params","type":"tuple"}],"name":"increaseLiquidity","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftPositionManager","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct INFTPositionManager.IncreaseLiquidityParams","name":"params","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"}],"name":"increaseLiquidityWithPermit","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isPoolEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2IfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stakeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"bool","name":"useVault","type":"bool"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"ethUnwrapRecipient","type":"address"}],"name":"swap","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"bool","name":"useVault","type":"bool"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams","name":"permit","type":"tuple"},{"internalType":"address","name":"ethUnwrapRecipient","type":"address"}],"name":"swapWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"amount0Delta","type":"int256"},{"internalType":"int256","name":"amount1Delta","type":"int256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052348015600f57600080fd5b50601733601b565b606b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6154bc8061007a6000396000f3fe6080604052600436106102385760003560e01c80638eb8287111610138578063eb1432f0116100b0578063f44e537a1161007f578063fb68908811610064578063fb6890881461068e578063fbfa77cf146106a1578063fc31d54a146106c957600080fd5b8063f44e537a1461064e578063fa461e331461066e57600080fd5b8063eb1432f0146105e0578063f2428621146105f3578063f2fde38b1461061b578063f3995c671461063b57600080fd5b8063ad271fa311610107578063b6541ffe116100ec578063b6541ffe14610577578063b956b3fb1461058a578063c2e3140a146105cd57600080fd5b8063ad271fa314610537578063b2118a8d1461055757600080fd5b80638eb82871146104ad5780639dd41df2146104f1578063a4a78f0c14610504578063ac9650d81461051757600080fd5b8063523acafa116101cb5780636cc781cd1161019a5780637d10c9d61161017f5780637d10c9d61461044f5780638aa74f711461046f5780638da5cb5b1461048257600080fd5b80636cc781cd14610427578063715018a61461043a57600080fd5b8063523acafa146103c157806353c43f15146103d45780636291027c146103f4578063688ee44c1461041457600080fd5b806339be51261161020757806339be5126146103015780634659a4941461032257806346e8f38f146103355780634f25b8581461037657600080fd5b8063099a04e5146102445780630ae6a646146102665780632b4abadb1461028f578063353766c6146102d457600080fd5b3661023f57005b600080fd5b34801561025057600080fd5b5061026461025f36600461396e565b6106dc565b005b610279610274366004613e1a565b6106fd565b6040516102869190613e93565b60405180910390f35b34801561029b57600080fd5b506102af6102aa36600461396e565b610856565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610286565b3480156102e057600080fd5b506102f46102ef366004613fac565b61089b565b60405161028691906140a8565b61031461030f366004614232565b6109ba565b604051908152602001610286565b61026461033036600461433f565b610bc6565b610348610343366004614399565b610c81565b604080516fffffffffffffffffffffffffffffffff9094168452602084019290925290820152606001610286565b34801561038257600080fd5b506103b16103913660046143f5565b600160209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610286565b6103486103cf36600461442e565b610e27565b3480156103e057600080fd5b506102796103ef3660046144b7565b610f7a565b34801561040057600080fd5b5061026461040f366004614557565b610f9c565b6102646104223660046145aa565b611036565b6102646104353660046145aa565b6110e6565b34801561044657600080fd5b5061026461117b565b34801561045b57600080fd5b5061027961046a366004614626565b61118f565b61027961047d3660046146f1565b611242565b34801561048e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102af565b6104c06104bb36600461475c565b6112a6565b604080519485526fffffffffffffffffffffffffffffffff9093166020850152918301526060820152608001610286565b6102af6104ff3660046147a5565b611490565b61026461051236600461433f565b611532565b61052a6105253660046147fa565b611604565b60405161028691906148aa565b34801561054357600080fd5b506102f461055236600461492d565b611774565b34801561056357600080fd5b50610264610572366004614a04565b6117fb565b6104c0610585366004614a45565b6119e0565b34801561059657600080fd5b506103146105a5366004614abb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b6102646105db36600461433f565b611b34565b6103146105ee366004614adf565b611bde565b3480156105ff57600080fd5b506102af73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b34801561062757600080fd5b50610264610636366004614abb565b611bfd565b61026461064936600461433f565b611cb4565b34801561065a57600080fd5b50610264610669366004614557565b611d31565b34801561067a57600080fd5b50610264610689366004614bc2565b611d9f565b61031461069c366004614232565b611e0d565b3480156106ad57600080fd5b506102af737160570bb153edd0ea1775ec2b2ac9b65f1ab61b81565b6103146106d7366004614adf565b611e2d565b6106e4611f07565b806000036106ef5750475b6106f98282611fa4565b5050565b6040805180820190915260008082526020820152838042111561074c576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107596020850185614abb565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf33306020880135604089013561079060808b0160608c01614c15565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152608087013560a482015260a087013560c482015260e401600060405180830381600087803b15801561082857600080fd5b505af115801561083c573d6000803e3d6000fd5b5050505061084b878785612043565b979650505050505050565b6002602052816000526040600020818154811061087257600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc93610902933393309390929091600401614c30565b600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050506109ab8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050612787565b9b9a5050505050505050505050565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b82811015610ae957858181518110610a0d57610a0d614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ac657600080fd5b505af1158015610ada573d6000803e3d6000fd5b505050508060010190506109f3565b50610afb8e8e8e8e8e8e8e8e8e612982565b925073ffffffffffffffffffffffffffffffffffffffff841615610bb5576000610b278b8d018d614abb565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff808316602483015291925090861690637acb775790604401600060405180830381600087803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050505050505050565b6000808073ffffffffffffffffffffffffffffffffffffffff861673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f141580610cbc575034155b15610ce157610cd2863086602001356000612ae0565b610ce186888660200135612e4a565b73ffffffffffffffffffffffffffffffffffffffff851673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f141580610d18575034155b15610d3d57610d2e853086604001356000612ae0565b610d3d85888660400135612e4a565b604080517f219f5d170000000000000000000000000000000000000000000000000000000081528535600482015260208601356024820152908501356044820152606085013560648201526080850135608482015260a085013560a482015273ffffffffffffffffffffffffffffffffffffffff88169063219f5d1790349060c40160606040518083038185885af1158015610ddd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e029190614cd6565b91945092509050610e138633612f3c565b610e1d8533612f3c565b9450945094915050565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529091829182919060005b82811015610f5a57868181518110610e7e57610e7e614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50505050806001019050610e64565b50610f678a8a8a8a610c81565b919c909b50909950975050505050505050565b604080518082019091526000808252602082015261084b8787878787876131e7565b610fa7848484613372565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152851690637acb7757906044015b600060405180830381600087803b15801561101857600080fd5b505af115801561102c573d6000803e3d6000fd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90604401602060405180830381865afa1580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc9190614d0b565b10156110df576110df85858585856110e6565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc9061114290339030908990899089908990600401614d6d565b600060405180830381600087803b15801561115c57600080fd5b505af1158015611170573d6000803e3d6000fd5b505050505050505050565b611183611f07565b61118d6000613448565b565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc3330853560208701356111d56040890189614dc5565b6040518763ffffffff1660e01b81526004016111f696959493929190614d6d565b600060405180830381600087803b15801561121057600080fd5b505af1158015611224573d6000803e3d6000fd5b505050506112368888888888886131e7565b98975050505050505050565b60408051808201909152600080825260208201528280421115611291576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129c868685612043565b9695505050505050565b600080808073e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6112cd6020870187614abb565b73ffffffffffffffffffffffffffffffffffffffff161415806112ee575034155b1561132b576113106113036020870187614abb565b308760a001356000612ae0565b61132b6113206020870187614abb565b888760a00135612e4a565b73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6113506040870160208801614abb565b73ffffffffffffffffffffffffffffffffffffffff16141580611371575034155b156113b4576113966113896040870160208801614abb565b308760c001356000612ae0565b6113b46113a96040870160208801614abb565b888760c00135612e4a565b6040517fb5007d1f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063b5007d1f903490611408908990600401614e3c565b60806040518083038185885af1158015611426573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061144b9190614f6f565b9296509094509250905061146b6114656020870187614abb565b33612f3c565b61147e6114656040870160208801614abb565b611487866134bd565b93509350935093565b6040517f13b8683f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f906114e79086908690600401614fab565b6020604051808303816000875af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190614fbf565b949350505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190614d0b565b10156115fc576115fc868686868686610bc6565b505050505050565b60608167ffffffffffffffff81111561161f5761161f61399a565b60405190808252806020026020018201604052801561165257816020015b606081526020019060019003908161163d5790505b50905060005b8281101561176d576000803086868581811061167657611676614c87565b90506020028101906116889190614dc5565b604051611696929190614fdc565b600060405180830381855af49150503d80600081146116d1576040519150601f19603f3d011682016040523d82523d6000602084013e6116d6565b606091505b509150915081611745576044815110156116ef57600080fd5b600481019050808060200190518101906117099190614fec565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c9190615063565b60405180910390fd5b8084848151811061175857611758614c87565b60209081029190910101525050600101611658565b5092915050565b60606117ed8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050612787565b9a9950505050505050505050565b611803611f07565b73ffffffffffffffffffffffffffffffffffffffff82161580159061185457508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f496e76616c696420746f00000000000000000000000000000000000000000000604482015260640161173c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190614d0b565b9050816000036119655761196084848361358a565b6119da565b808211156119cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f457863656564732062616c616e63650000000000000000000000000000000000604482015260640161173c565b6119da84848461358a565b50505050565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052909182918291829160005b82811015611b1457878181518110611a3857611a38614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015611af157600080fd5b505af1158015611b05573d6000803e3d6000fd5b50505050806001019050611a1e565b50611b208a8a8a6112a6565b929d919c509a509098509650505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca9190614d0b565b10156115fc576115fc868686868686611cb4565b6000611bf28b8b8b8b8b8b8b8b8b8b611e2d565b90506117ed8b6134bd565b611c05611f07565b73ffffffffffffffffffffffffffffffffffffffff8116611ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161173c565b611cb181613448565b50565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610c47565b611d3c848484613372565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052828116604483015285169063294091cd90606401610ffe565b6000841380611dae5750600083135b611db757600080fd5b600080611dc68385018561396e565b90925090506115fc73ffffffffffffffffffffffffffffffffffffffff831615611df05782611e06565b73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f5b338361358a565b6000611e228c8c8c8c8c8c8c8c8c8c8c6109ba565b90506109ab8c6134bd565b6000611e408b8b8b8b8b8b8b8b8b612982565b905073ffffffffffffffffffffffffffffffffffffffff8216156117ed576000611e6c888a018a614abb565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff808316602483015291925090841690637acb775790604401600060405180830381600087803b158015611ee057600080fd5b505af1158015611ef4573d6000803e3d6000fd5b50505050509a9950505050505050505050565b33611f2760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161173c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611ffe576040519150601f19603f3d011682016040523d82523d6000602084013e612003565b606091505b505090508061203e576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b604080518082018252600080825260208083018290528651845160608082018752808252818401859052818701859052865161012081018852858152808501829052808801869052808201829052608080820187905260a0820187905260c0820187905260e0820187905261010082018790528851908101895297880186815291880186905290875292860193909352929360005b84811015612633578881815181106120f2576120f2614c87565b60200260200101519350836000015160008151811061211357612113614c87565b60200260200101519250600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1603612176576121718460200151846000015186604001518660800151612ae0565b6121c3565b61218e84602001513086604001518660800151612ae0565b60408051808201825260208087015173ffffffffffffffffffffffffffffffffffffffff168252918601519181019190915282525b8351516121d2906001906150a5565b602083015260005b60e084015173ffffffffffffffffffffffffffffffffffffffff1661229157836000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f856020015133876040015188606001516040518563ffffffff1660e01b815260040161224894939291906150b8565b60408051808303816000875af1158015612266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228a9190615170565b8352612435565b825180516020918201516040516000936122ce9392910173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6040516020818303038152906040529050600080866000015173ffffffffffffffffffffffffffffffffffffffff1663078981648860e001518960c001518960000151602001518b610100015173ffffffffffffffffffffffffffffffffffffffff16600014612343578b610100015161236d565b8b60c001516123665773fffd8963efd1fc6a506488495d951d5263988d2561236d565b6401000276a45b88338e604001518f606001516040518963ffffffff1660e01b815260040161239c98979695949392919061518c565b60408051808303816000875af11580156123ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123de9190615231565b9150915060405180604001604052808860a0015173ffffffffffffffffffffffffffffffffffffffff1681526020018860c001516124245761241f84615255565b61242d565b61242d83615255565b905286525050505b8260200151811061247b5782515173ffffffffffffffffffffffffffffffffffffffff1687528251602090810151908801805161247390839061528d565b90525061262a565b6080840151855180516001909301928390811061249a5761249a614c87565b60200260200101519450801580156124b3575084608001515b15612624578351516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254b9190614d0b565b85515190915061257090737160570bb153edd0ea1775ec2b2ac9b65f1ab61b8361358a565b84515186516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f08906044016020604051808303816000875af11580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126219190614d0b565b50505b506121da565b506001016120d8565b508685602001511015612672576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86161561277c576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f90632e1a7d4d9082906370a0823190602401602060405180830381865afa1580156126fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127229190614d0b565b6040518263ffffffff1660e01b815260040161274091815260200190565b600060405180830381600087803b15801561275a57600080fd5b505af115801561276e573d6000803e3d6000fd5b5050505061277c8647611fa4565b505050509392505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff881660248201819052604482018890526060916323b872dd906064016020604051808303816000875af1158015612803573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282791906152a0565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b9061288290899033908990899089906004016152bd565b6000604051808303816000875af11580156128a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128e7919081019061531b565b805190915060005b8181101561297557600083828151811061290b5761290b614c87565b6020026020010151905087828151811061292757612927614c87565b60200260200101518160200151101561296c576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001016128ef565b5050979650505050505050565b60408051606081018252600080825260208201819052918101829052889060005b828110156129f5578b8b828181106129bd576129bd614c87565b9050606002018036038101906129d391906153b1565b91506129ed82600001518e84602001518560400151612ae0565b6001016129a3565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a90612a52908c908c9033908c908c908c906004016153fe565b6020604051808303816000875af1158015612a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a959190614d0b565b925086831015612ad1576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b8015612cc15773ffffffffffffffffffffffffffffffffffffffff84161580612b3d575073ffffffffffffffffffffffffffffffffffffffff841673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f148015612b3d5750814710155b15612bf5576040517ff9609f080000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f0890849060440160206040518083038185885af1158015612bca573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bef9190614d0b565b506119da565b612c158433737160570bb153edd0ea1775ec2b2ac9b65f1ab61b856136c8565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015284166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f08906044016020604051808303816000875af1158015612c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bef9190614d0b565b73ffffffffffffffffffffffffffffffffffffffff84161580612d18575073ffffffffffffffffffffffffffffffffffffffff841673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f148015612d185750814710155b15612e3e5773e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d7957600080fd5b505af1158015612d8d573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024810186905273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f935063a9059cbb925060440190506020604051808303816000875af1158015612e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bef91906152a0565b6119da843385856136c8565b73ffffffffffffffffffffffffffffffffffffffff83161561203e576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015282919085169063dd62ed3e90604401602060405180830381865afa158015612edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eff9190614d0b565b101561203e57612f118383600061380e565b61203e83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61380e565b73ffffffffffffffffffffffffffffffffffffffff82161580612f88575073ffffffffffffffffffffffffffffffffffffffff821673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f145b156130b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073e5d7c2a44ffddf6b295a15c148167daaaf5cf34f906370a0823190602401602060405180830381865afa158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190614d0b565b905080156130a3576040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f90632e1a7d4d90602401600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050505b471561203e5761203e8247611fa4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131449190614d0b565b9050801561203e576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261203e908490849073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156131be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e29190614d0b565b61358a565b6040805180820182526000808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff88166024820181905260448201889052906323b872dd906064016020604051808303816000875af1158015613273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329791906152a0565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea906132f09088903390889088906004016150b8565b60408051808303816000875af115801561330e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133329190615170565b9050838160200151101561129c576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61337e823330846136c8565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015282919084169063dd62ed3e90604401602060405180830381865afa1580156133f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134179190614d0b565b101561203e5761203e82847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61380e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff16611cb15773ffffffffffffffffffffffffffffffffffffffff166000818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691613621919061546a565b6000604051808303816000865af19150503d806000811461365e576040519150601f19603f3d011682016040523d82523d6000602084013e613663565b606091505b5091509150811580613691575080511580159061369157508080602001905181019061368f91906152a0565b155b156110df576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613767919061546a565b6000604051808303816000865af19150503d80600081146137a4576040519150601f19603f3d011682016040523d82523d6000602084013e6137a9565b606091505b50915091508115806137d757508051158015906137d75750808060200190518101906137d591906152a0565b155b156115fc576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905291516000928392908716916138a5919061546a565b6000604051808303816000865af19150503d80600081146138e2576040519150601f19603f3d011682016040523d82523d6000602084013e6138e7565b606091505b5091509150811580613915575080511580159061391557508080602001905181019061391391906152a0565b155b156110df576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611cb157600080fd5b6000806040838503121561398157600080fd5b823561398c8161394c565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156139ec576139ec61399a565b60405290565b604051610120810167ffffffffffffffff811182821017156139ec576139ec61399a565b60405160c0810167ffffffffffffffff811182821017156139ec576139ec61399a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a8057613a8061399a565b604052919050565b600067ffffffffffffffff821115613aa257613aa261399a565b5060051b60200190565b8035613ab78161394c565b919050565b600067ffffffffffffffff821115613ad657613ad661399a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b1357600080fd5b8135613b26613b2182613abc565b613a39565b818152846020838601011115613b3b57600080fd5b816020850160208301376000918101602001919091529392505050565b8015158114611cb157600080fd5b8035613ab781613b58565b600082601f830112613b8257600080fd5b613b8f613b218335613a88565b82358082526020808301929160051b850101851015613bad57600080fd5b602084015b6020853560051b860101811015613df95767ffffffffffffffff81351115613bd957600080fd5b8035850160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828903011215613c0f57600080fd5b613c176139c9565b67ffffffffffffffff60208301351115613c3057600080fd5b60208083013583010188601f820112613c4857600080fd5b613c55613b218235613a88565b81358082526020808301929160051b8401018b1015613c7357600080fd5b602083015b6020843560051b850101811015613dc65767ffffffffffffffff81351115613c9f57600080fd5b803584016101207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f03011215613cd657600080fd5b613cde6139f2565b613cea60208301613aac565b815267ffffffffffffffff60408301351115613d0557600080fd5b613d188e60206040850135850101613b02565b6020820152613d2960608301613aac565b604082015267ffffffffffffffff60808301351115613d4757600080fd5b613d5a8e60206080850135850101613b02565b6060820152613d6b60a08301613b66565b6080820152613d7c60c08301613aac565b60a0820152613d8d60e08301613b66565b60c0820152613d9f6101008301613aac565b60e0820152613db16101208301613aac565b61010082015284525060209283019201613c78565b50835250613dd8905060408301613aac565b60208281019190915260609290920135604082015284529283019201613bb2565b50949350505050565b600060c08284031215613e1457600080fd5b50919050565b60008060008060006101408688031215613e3357600080fd5b853567ffffffffffffffff811115613e4a57600080fd5b613e5688828901613b71565b9550506020860135935060408601359250613e748760608801613e02565b9150610120860135613e858161394c565b809150509295509295909350565b815173ffffffffffffffffffffffffffffffffffffffff16815260208083015190820152604081015b92915050565b60008083601f840112613ed457600080fd5b50813567ffffffffffffffff811115613eec57600080fd5b602083019150836020828501011115613f0457600080fd5b9250929050565b60008083601f840112613f1d57600080fd5b50813567ffffffffffffffff811115613f3557600080fd5b6020830191508360208260051b8501011115613f0457600080fd5b600060608284031215613f6257600080fd5b613f6a6139c9565b82358152602080840135908201529050604082013567ffffffffffffffff811115613f9457600080fd5b613fa084828501613b02565b60408301525092915050565b60008060008060008060008060008060e08b8d031215613fcb57600080fd5b613fd48b613aac565b995060208b0135985060408b013567ffffffffffffffff811115613ff757600080fd5b6140038d828e01613ec2565b90995097505060608b013567ffffffffffffffff81111561402357600080fd5b61402f8d828e01613f0b565b9097509550614042905060808c01613aac565b935060a08b013567ffffffffffffffff81111561405e57600080fd5b61406a8d828e01613ec2565b90945092505060c08b013567ffffffffffffffff81111561408a57600080fd5b6140968d828e01613f50565b9150509295989b9194979a5092959850565b602080825282518282018190526000918401906040840190835b8181101561410b576140f5838551805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b60209390930192604092909201916001016140c2565b509095945050505050565b60008083601f84011261412857600080fd5b50813567ffffffffffffffff81111561414057600080fd5b602083019150836020606083028501011115613f0457600080fd5b803560ff81168114613ab757600080fd5b600082601f83011261417d57600080fd5b813561418b613b2182613a88565b80828252602082019150602060c084028601019250858311156141ad57600080fd5b602085015b838110156142285760c081880312156141ca57600080fd5b6141d2613a16565b81356141dd8161394c565b815260208281013590820152604080830135908201526141ff6060830161415b565b60608201526080828101359082015260a08083013590820152835260209092019160c0016141b2565b5095945050505050565b60008060008060008060008060008060006101008c8e03121561425457600080fd5b61425d8c613aac565b9a5060208c013567ffffffffffffffff81111561427957600080fd5b6142858e828f01614116565b909b5099505060408c013567ffffffffffffffff8111156142a557600080fd5b6142b18e828f01613ec2565b90995097505060608c013595506142ca60808d01613aac565b945060a08c013567ffffffffffffffff8111156142e657600080fd5b6142f28e828f01613ec2565b90955093505060c08c013567ffffffffffffffff81111561431257600080fd5b61431e8e828f0161416c565b92505061432d60e08d01613aac565b90509295989b509295989b9093969950565b60008060008060008060c0878903121561435857600080fd5b86356143638161394c565b9550602087013594506040870135935061437f6060880161415b565b9598949750929560808101359460a0909101359350915050565b60008060008061012085870312156143b057600080fd5b84356143bb8161394c565b935060208501356143cb8161394c565b925060408501356143db8161394c565b91506143ea8660608701613e02565b905092959194509250565b6000806040838503121561440857600080fd5b82356144138161394c565b915060208301356144238161394c565b809150509250929050565b6000806000806000610140868803121561444757600080fd5b85356144528161394c565b945060208601356144628161394c565b935060408601356144728161394c565b92506144818760608801613e02565b915061012086013567ffffffffffffffff81111561449e57600080fd5b6144aa8882890161416c565b9150509295509295909350565b60008060008060008060c087890312156144d057600080fd5b86356144db8161394c565b955060208701359450604087013567ffffffffffffffff8111156144fe57600080fd5b61450a89828a01613b02565b9450506060870135925060808701356145228161394c565b915060a087013567ffffffffffffffff81111561453e57600080fd5b61454a89828a01613b02565b9150509295509295509295565b6000806000806080858703121561456d57600080fd5b84356145788161394c565b935060208501356145888161394c565b925060408501359150606085013561459f8161394c565b939692955090935050565b6000806000806000608086880312156145c257600080fd5b85356145cd8161394c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156145f757600080fd5b61460388828901613ec2565b969995985093965092949392505050565b600060608284031215613e1457600080fd5b600080600080600080600060e0888a03121561464157600080fd5b873561464c8161394c565b965060208801359550604088013567ffffffffffffffff81111561466f57600080fd5b61467b8a828b01613b02565b9550506060880135935061469160808901613aac565b925060a088013567ffffffffffffffff8111156146ad57600080fd5b6146b98a828b01613b02565b92505060c088013567ffffffffffffffff8111156146d657600080fd5b6146e28a828b01614614565b91505092959891949750929550565b6000806000806080858703121561470757600080fd5b843567ffffffffffffffff81111561471e57600080fd5b61472a87828801613b71565b9450506020850135925060408501359150606085013561459f8161394c565b60006101808284031215613e1457600080fd5b60008060006101c0848603121561477257600080fd5b833561477d8161394c565b9250602084013561478d8161394c565b915061479c8560408601614749565b90509250925092565b6000806000604084860312156147ba57600080fd5b83356147c58161394c565b9250602084013567ffffffffffffffff8111156147e157600080fd5b6147ed86828701613ec2565b9497909650939450505050565b6000806020838503121561480d57600080fd5b823567ffffffffffffffff81111561482457600080fd5b61483085828601613f0b565b90969095509350505050565b60005b8381101561485757818101518382015260200161483f565b50506000910152565b6000815180845261487881602086016020860161483c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015614921577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261490c858351614860565b945060209384019391909101906001016148d2565b50929695505050505050565b600080600080600080600080600060c08a8c03121561494b57600080fd5b89356149568161394c565b985060208a0135975060408a013567ffffffffffffffff81111561497957600080fd5b6149858c828d01613ec2565b90985096505060608a013567ffffffffffffffff8111156149a557600080fd5b6149b18c828d01613f0b565b90965094505060808a01356149c58161394c565b925060a08a013567ffffffffffffffff8111156149e157600080fd5b6149ed8c828d01613ec2565b915080935050809150509295985092959850929598565b600080600060608486031215614a1957600080fd5b8335614a248161394c565b92506020840135614a348161394c565b929592945050506040919091013590565b6000806000806101e08587031215614a5c57600080fd5b8435614a678161394c565b93506020850135614a778161394c565b9250614a868660408701614749565b91506101c085013567ffffffffffffffff811115614aa357600080fd5b614aaf8782880161416c565b91505092959194509250565b600060208284031215614acd57600080fd5b8135614ad88161394c565b9392505050565b60008060008060008060008060008060e08b8d031215614afe57600080fd5b8a35614b098161394c565b995060208b013567ffffffffffffffff811115614b2557600080fd5b614b318d828e01614116565b909a5098505060408b013567ffffffffffffffff811115614b5157600080fd5b614b5d8d828e01613ec2565b90985096505060608b01359450614b7660808c01613aac565b935060a08b013567ffffffffffffffff811115614b9257600080fd5b614b9e8d828e01613ec2565b9094509250614bb1905060c08c01613aac565b90509295989b9194979a5092959850565b60008060008060608587031215614bd857600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614bfd57600080fd5b614c0987828801613ec2565b95989497509550505050565b600060208284031215614c2757600080fd5b614ad88261415b565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015282606082015260a06080820152600061084b60a0830184614860565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80516fffffffffffffffffffffffffffffffff81168114613ab757600080fd5b600080600060608486031215614ceb57600080fd5b614cf484614cb6565b602085015160409095015190969495509392505050565b600060208284031215614d1d57600080fd5b5051919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015283606082015260a06080820152600061123660a083018486614d24565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614dfa57600080fd5b83018035915067ffffffffffffffff821115614e1557600080fd5b602001915036819003821315613f0457600080fd5b8035600281900b8114613ab757600080fd5b6101808101614e6882614e4e85613aac565b73ffffffffffffffffffffffffffffffffffffffff169052565b614e7460208401613aac565b73ffffffffffffffffffffffffffffffffffffffff166020830152614e9b60408401614e2a565b614eaa604084018260020b9052565b50614eb760608401614e2a565b614ec6606084018260020b9052565b50614ed360808401614e2a565b614ee2608084018260020b9052565b5060a0838101359083015260c0808401359083015260e080840135908301526101008084013590830152614f196101208401613aac565b73ffffffffffffffffffffffffffffffffffffffff166101208301526101408381013590830152614f4d6101608401613aac565b73ffffffffffffffffffffffffffffffffffffffff811661016084015261176d565b60008060008060808587031215614f8557600080fd5b84519350614f9560208601614cb6565b6040860151606090960151949790965092505050565b60208152600061152a602083018486614d24565b600060208284031215614fd157600080fd5b8151614ad88161394c565b8183823760009101908152919050565b600060208284031215614ffe57600080fd5b815167ffffffffffffffff81111561501557600080fd5b8201601f8101841361502657600080fd5b8051615034613b2182613abc565b81815285602083850101111561504957600080fd5b61505a82602083016020860161483c565b95945050505050565b602081526000614ad86020830184614860565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613ebc57613ebc615076565b6080815260006150cb6080830187614860565b73ffffffffffffffffffffffffffffffffffffffff8616602084015273ffffffffffffffffffffffffffffffffffffffff85166040840152828103606084015261084b8185614860565b60006040828403121561512757600080fd5b6040805190810167ffffffffffffffff8111828210171561514a5761514a61399a565b8060405250809150825161515d8161394c565b8152602092830151920191909152919050565b60006040828403121561518257600080fd5b614ad88383615115565b73ffffffffffffffffffffffffffffffffffffffff89168152871515602082015286604082015273ffffffffffffffffffffffffffffffffffffffff86166060820152610100608082015260006151e7610100830187614860565b73ffffffffffffffffffffffffffffffffffffffff861660a084015273ffffffffffffffffffffffffffffffffffffffff851660c084015282810360e08401526109ab8185614860565b6000806040838503121561524457600080fd5b505080516020909101519092909150565b60007f8000000000000000000000000000000000000000000000000000000000000000820361528657615286615076565b5060000390565b80820180821115613ebc57613ebc615076565b6000602082840312156152b257600080fd5b8151614ad881613b58565b6080815260006152d06080830188614860565b73ffffffffffffffffffffffffffffffffffffffff8716602084015273ffffffffffffffffffffffffffffffffffffffff861660408401528281036060840152611236818587614d24565b60006020828403121561532d57600080fd5b815167ffffffffffffffff81111561534457600080fd5b8201601f8101841361535557600080fd5b8051615363613b2182613a88565b8082825260208201915060208360061b85010192508683111561538557600080fd5b6020840193505b8284101561129c5761539e8785615115565b825260208201915060408401935061538c565b600060608284031280156153c457600080fd5b506153cd6139c9565b82356153d88161394c565b81526020838101359082015260408301356153f281613b58565b60408201529392505050565b60808152600061541260808301888a614d24565b73ffffffffffffffffffffffffffffffffffffffff8716602084015273ffffffffffffffffffffffffffffffffffffffff86166040840152828103606084015261545d818587614d24565b9998505050505050505050565b6000825161547c81846020870161483c565b919091019291505056fea26469706673582212200ba9d751058e78741e949b91cc9ca6682bd0d70ca75bbaaa56d9d49f4bbcb92264736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106102385760003560e01c80638eb8287111610138578063eb1432f0116100b0578063f44e537a1161007f578063fb68908811610064578063fb6890881461068e578063fbfa77cf146106a1578063fc31d54a146106c957600080fd5b8063f44e537a1461064e578063fa461e331461066e57600080fd5b8063eb1432f0146105e0578063f2428621146105f3578063f2fde38b1461061b578063f3995c671461063b57600080fd5b8063ad271fa311610107578063b6541ffe116100ec578063b6541ffe14610577578063b956b3fb1461058a578063c2e3140a146105cd57600080fd5b8063ad271fa314610537578063b2118a8d1461055757600080fd5b80638eb82871146104ad5780639dd41df2146104f1578063a4a78f0c14610504578063ac9650d81461051757600080fd5b8063523acafa116101cb5780636cc781cd1161019a5780637d10c9d61161017f5780637d10c9d61461044f5780638aa74f711461046f5780638da5cb5b1461048257600080fd5b80636cc781cd14610427578063715018a61461043a57600080fd5b8063523acafa146103c157806353c43f15146103d45780636291027c146103f4578063688ee44c1461041457600080fd5b806339be51261161020757806339be5126146103015780634659a4941461032257806346e8f38f146103355780634f25b8581461037657600080fd5b8063099a04e5146102445780630ae6a646146102665780632b4abadb1461028f578063353766c6146102d457600080fd5b3661023f57005b600080fd5b34801561025057600080fd5b5061026461025f36600461396e565b6106dc565b005b610279610274366004613e1a565b6106fd565b6040516102869190613e93565b60405180910390f35b34801561029b57600080fd5b506102af6102aa36600461396e565b610856565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610286565b3480156102e057600080fd5b506102f46102ef366004613fac565b61089b565b60405161028691906140a8565b61031461030f366004614232565b6109ba565b604051908152602001610286565b61026461033036600461433f565b610bc6565b610348610343366004614399565b610c81565b604080516fffffffffffffffffffffffffffffffff9094168452602084019290925290820152606001610286565b34801561038257600080fd5b506103b16103913660046143f5565b600160209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610286565b6103486103cf36600461442e565b610e27565b3480156103e057600080fd5b506102796103ef3660046144b7565b610f7a565b34801561040057600080fd5b5061026461040f366004614557565b610f9c565b6102646104223660046145aa565b611036565b6102646104353660046145aa565b6110e6565b34801561044657600080fd5b5061026461117b565b34801561045b57600080fd5b5061027961046a366004614626565b61118f565b61027961047d3660046146f1565b611242565b34801561048e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102af565b6104c06104bb36600461475c565b6112a6565b604080519485526fffffffffffffffffffffffffffffffff9093166020850152918301526060820152608001610286565b6102af6104ff3660046147a5565b611490565b61026461051236600461433f565b611532565b61052a6105253660046147fa565b611604565b60405161028691906148aa565b34801561054357600080fd5b506102f461055236600461492d565b611774565b34801561056357600080fd5b50610264610572366004614a04565b6117fb565b6104c0610585366004614a45565b6119e0565b34801561059657600080fd5b506103146105a5366004614abb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b6102646105db36600461433f565b611b34565b6103146105ee366004614adf565b611bde565b3480156105ff57600080fd5b506102af73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f81565b34801561062757600080fd5b50610264610636366004614abb565b611bfd565b61026461064936600461433f565b611cb4565b34801561065a57600080fd5b50610264610669366004614557565b611d31565b34801561067a57600080fd5b50610264610689366004614bc2565b611d9f565b61031461069c366004614232565b611e0d565b3480156106ad57600080fd5b506102af737160570bb153edd0ea1775ec2b2ac9b65f1ab61b81565b6103146106d7366004614adf565b611e2d565b6106e4611f07565b806000036106ef5750475b6106f98282611fa4565b5050565b6040805180820190915260008082526020820152838042111561074c576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107596020850185614abb565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf33306020880135604089013561079060808b0160608c01614c15565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152608087013560a482015260a087013560c482015260e401600060405180830381600087803b15801561082857600080fd5b505af115801561083c573d6000803e3d6000fd5b5050505061084b878785612043565b979650505050505050565b6002602052816000526040600020818154811061087257600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc93610902933393309390929091600401614c30565b600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050506109ab8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050612787565b9b9a5050505050505050505050565b81516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b82811015610ae957858181518110610a0d57610a0d614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ac657600080fd5b505af1158015610ada573d6000803e3d6000fd5b505050508060010190506109f3565b50610afb8e8e8e8e8e8e8e8e8e612982565b925073ffffffffffffffffffffffffffffffffffffffff841615610bb5576000610b278b8d018d614abb565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff808316602483015291925090861690637acb775790604401600060405180830381600087803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050505050505050565b6000808073ffffffffffffffffffffffffffffffffffffffff861673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f141580610cbc575034155b15610ce157610cd2863086602001356000612ae0565b610ce186888660200135612e4a565b73ffffffffffffffffffffffffffffffffffffffff851673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f141580610d18575034155b15610d3d57610d2e853086604001356000612ae0565b610d3d85888660400135612e4a565b604080517f219f5d170000000000000000000000000000000000000000000000000000000081528535600482015260208601356024820152908501356044820152606085013560648201526080850135608482015260a085013560a482015273ffffffffffffffffffffffffffffffffffffffff88169063219f5d1790349060c40160606040518083038185885af1158015610ddd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e029190614cd6565b91945092509050610e138633612f3c565b610e1d8533612f3c565b9450945094915050565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529091829182919060005b82811015610f5a57868181518110610e7e57610e7e614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50505050806001019050610e64565b50610f678a8a8a8a610c81565b919c909b50909950975050505050505050565b604080518082019091526000808252602082015261084b8787878787876131e7565b610fa7848484613372565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152851690637acb7757906044015b600060405180830381600087803b15801561101857600080fd5b505af115801561102c573d6000803e3d6000fd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90604401602060405180830381865afa1580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc9190614d0b565b10156110df576110df85858585856110e6565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc9061114290339030908990899089908990600401614d6d565b600060405180830381600087803b15801561115c57600080fd5b505af1158015611170573d6000803e3d6000fd5b505050505050505050565b611183611f07565b61118d6000613448565b565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc3330853560208701356111d56040890189614dc5565b6040518763ffffffff1660e01b81526004016111f696959493929190614d6d565b600060405180830381600087803b15801561121057600080fd5b505af1158015611224573d6000803e3d6000fd5b505050506112368888888888886131e7565b98975050505050505050565b60408051808201909152600080825260208201528280421115611291576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61129c868685612043565b9695505050505050565b600080808073e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6112cd6020870187614abb565b73ffffffffffffffffffffffffffffffffffffffff161415806112ee575034155b1561132b576113106113036020870187614abb565b308760a001356000612ae0565b61132b6113206020870187614abb565b888760a00135612e4a565b73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f6113506040870160208801614abb565b73ffffffffffffffffffffffffffffffffffffffff16141580611371575034155b156113b4576113966113896040870160208801614abb565b308760c001356000612ae0565b6113b46113a96040870160208801614abb565b888760c00135612e4a565b6040517fb5007d1f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063b5007d1f903490611408908990600401614e3c565b60806040518083038185885af1158015611426573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061144b9190614f6f565b9296509094509250905061146b6114656020870187614abb565b33612f3c565b61147e6114656040870160208801614abb565b611487866134bd565b93509350935093565b6040517f13b8683f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f906114e79086908690600401614fab565b6020604051808303816000875af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190614fbf565b949350505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190614d0b565b10156115fc576115fc868686868686610bc6565b505050505050565b60608167ffffffffffffffff81111561161f5761161f61399a565b60405190808252806020026020018201604052801561165257816020015b606081526020019060019003908161163d5790505b50905060005b8281101561176d576000803086868581811061167657611676614c87565b90506020028101906116889190614dc5565b604051611696929190614fdc565b600060405180830381855af49150503d80600081146116d1576040519150601f19603f3d011682016040523d82523d6000602084013e6116d6565b606091505b509150915081611745576044815110156116ef57600080fd5b600481019050808060200190518101906117099190614fec565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c9190615063565b60405180910390fd5b8084848151811061175857611758614c87565b60209081029190910101525050600101611658565b5092915050565b60606117ed8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050612787565b9a9950505050505050505050565b611803611f07565b73ffffffffffffffffffffffffffffffffffffffff82161580159061185457508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f496e76616c696420746f00000000000000000000000000000000000000000000604482015260640161173c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190614d0b565b9050816000036119655761196084848361358a565b6119da565b808211156119cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f457863656564732062616c616e63650000000000000000000000000000000000604482015260640161173c565b6119da84848461358a565b50505050565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052909182918291829160005b82811015611b1457878181518110611a3857611a38614c87565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015611af157600080fd5b505af1158015611b05573d6000803e3d6000fd5b50505050806001019050611a1e565b50611b208a8a8a6112a6565b929d919c509a509098509650505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca9190614d0b565b10156115fc576115fc868686868686611cb4565b6000611bf28b8b8b8b8b8b8b8b8b8b611e2d565b90506117ed8b6134bd565b611c05611f07565b73ffffffffffffffffffffffffffffffffffffffff8116611ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161173c565b611cb181613448565b50565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610c47565b611d3c848484613372565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052828116604483015285169063294091cd90606401610ffe565b6000841380611dae5750600083135b611db757600080fd5b600080611dc68385018561396e565b90925090506115fc73ffffffffffffffffffffffffffffffffffffffff831615611df05782611e06565b73e5d7c2a44ffddf6b295a15c148167daaaf5cf34f5b338361358a565b6000611e228c8c8c8c8c8c8c8c8c8c8c6109ba565b90506109ab8c6134bd565b6000611e408b8b8b8b8b8b8b8b8b612982565b905073ffffffffffffffffffffffffffffffffffffffff8216156117ed576000611e6c888a018a614abb565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff808316602483015291925090841690637acb775790604401600060405180830381600087803b158015611ee057600080fd5b505af1158015611ef4573d6000803e3d6000fd5b50505050509a9950505050505050505050565b33611f2760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161173c565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611ffe576040519150601f19603f3d011682016040523d82523d6000602084013e612003565b606091505b505090508061203e576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b604080518082018252600080825260208083018290528651845160608082018752808252818401859052818701859052865161012081018852858152808501829052808801869052808201829052608080820187905260a0820187905260c0820187905260e0820187905261010082018790528851908101895297880186815291880186905290875292860193909352929360005b84811015612633578881815181106120f2576120f2614c87565b60200260200101519350836000015160008151811061211357612113614c87565b60200260200101519250600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1603612176576121718460200151846000015186604001518660800151612ae0565b6121c3565b61218e84602001513086604001518660800151612ae0565b60408051808201825260208087015173ffffffffffffffffffffffffffffffffffffffff168252918601519181019190915282525b8351516121d2906001906150a5565b602083015260005b60e084015173ffffffffffffffffffffffffffffffffffffffff1661229157836000015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f856020015133876040015188606001516040518563ffffffff1660e01b815260040161224894939291906150b8565b60408051808303816000875af1158015612266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228a9190615170565b8352612435565b825180516020918201516040516000936122ce9392910173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6040516020818303038152906040529050600080866000015173ffffffffffffffffffffffffffffffffffffffff1663078981648860e001518960c001518960000151602001518b610100015173ffffffffffffffffffffffffffffffffffffffff16600014612343578b610100015161236d565b8b60c001516123665773fffd8963efd1fc6a506488495d951d5263988d2561236d565b6401000276a45b88338e604001518f606001516040518963ffffffff1660e01b815260040161239c98979695949392919061518c565b60408051808303816000875af11580156123ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123de9190615231565b9150915060405180604001604052808860a0015173ffffffffffffffffffffffffffffffffffffffff1681526020018860c001516124245761241f84615255565b61242d565b61242d83615255565b905286525050505b8260200151811061247b5782515173ffffffffffffffffffffffffffffffffffffffff1687528251602090810151908801805161247390839061528d565b90525061262a565b6080840151855180516001909301928390811061249a5761249a614c87565b60200260200101519450801580156124b3575084608001515b15612624578351516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254b9190614d0b565b85515190915061257090737160570bb153edd0ea1775ec2b2ac9b65f1ab61b8361358a565b84515186516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f08906044016020604051808303816000875af11580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126219190614d0b565b50505b506121da565b506001016120d8565b508685602001511015612672576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86161561277c576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f90632e1a7d4d9082906370a0823190602401602060405180830381865afa1580156126fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127229190614d0b565b6040518263ffffffff1660e01b815260040161274091815260200190565b600060405180830381600087803b15801561275a57600080fd5b505af115801561276e573d6000803e3d6000fd5b5050505061277c8647611fa4565b505050509392505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff881660248201819052604482018890526060916323b872dd906064016020604051808303816000875af1158015612803573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282791906152a0565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b9061288290899033908990899089906004016152bd565b6000604051808303816000875af11580156128a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128e7919081019061531b565b805190915060005b8181101561297557600083828151811061290b5761290b614c87565b6020026020010151905087828151811061292757612927614c87565b60200260200101518160200151101561296c576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001016128ef565b5050979650505050505050565b60408051606081018252600080825260208201819052918101829052889060005b828110156129f5578b8b828181106129bd576129bd614c87565b9050606002018036038101906129d391906153b1565b91506129ed82600001518e84602001518560400151612ae0565b6001016129a3565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a90612a52908c908c9033908c908c908c906004016153fe565b6020604051808303816000875af1158015612a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a959190614d0b565b925086831015612ad1576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b8015612cc15773ffffffffffffffffffffffffffffffffffffffff84161580612b3d575073ffffffffffffffffffffffffffffffffffffffff841673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f148015612b3d5750814710155b15612bf5576040517ff9609f080000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff84166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f0890849060440160206040518083038185885af1158015612bca573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bef9190614d0b565b506119da565b612c158433737160570bb153edd0ea1775ec2b2ac9b65f1ab61b856136c8565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015284166024820152737160570bb153edd0ea1775ec2b2ac9b65f1ab61b9063f9609f08906044016020604051808303816000875af1158015612c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bef9190614d0b565b73ffffffffffffffffffffffffffffffffffffffff84161580612d18575073ffffffffffffffffffffffffffffffffffffffff841673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f148015612d185750814710155b15612e3e5773e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d7957600080fd5b505af1158015612d8d573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024810186905273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f935063a9059cbb925060440190506020604051808303816000875af1158015612e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bef91906152a0565b6119da843385856136c8565b73ffffffffffffffffffffffffffffffffffffffff83161561203e576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015282919085169063dd62ed3e90604401602060405180830381865afa158015612edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eff9190614d0b565b101561203e57612f118383600061380e565b61203e83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61380e565b73ffffffffffffffffffffffffffffffffffffffff82161580612f88575073ffffffffffffffffffffffffffffffffffffffff821673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f145b156130b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073e5d7c2a44ffddf6b295a15c148167daaaf5cf34f906370a0823190602401602060405180830381865afa158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190614d0b565b905080156130a3576040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905273e5d7c2a44ffddf6b295a15c148167daaaf5cf34f90632e1a7d4d90602401600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050505b471561203e5761203e8247611fa4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131449190614d0b565b9050801561203e576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261203e908490849073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156131be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e29190614d0b565b61358a565b6040805180820182526000808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff88166024820181905260448201889052906323b872dd906064016020604051808303816000875af1158015613273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329791906152a0565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea906132f09088903390889088906004016150b8565b60408051808303816000875af115801561330e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133329190615170565b9050838160200151101561129c576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61337e823330846136c8565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015282919084169063dd62ed3e90604401602060405180830381865afa1580156133f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134179190614d0b565b101561203e5761203e82847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61380e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff16611cb15773ffffffffffffffffffffffffffffffffffffffff166000818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691613621919061546a565b6000604051808303816000865af19150503d806000811461365e576040519150601f19603f3d011682016040523d82523d6000602084013e613663565b606091505b5091509150811580613691575080511580159061369157508080602001905181019061368f91906152a0565b155b156110df576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613767919061546a565b6000604051808303816000865af19150503d80600081146137a4576040519150601f19603f3d011682016040523d82523d6000602084013e6137a9565b606091505b50915091508115806137d757508051158015906137d75750808060200190518101906137d591906152a0565b155b156115fc576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905291516000928392908716916138a5919061546a565b6000604051808303816000865af19150503d80600081146138e2576040519150601f19603f3d011682016040523d82523d6000602084013e6138e7565b606091505b5091509150811580613915575080511580159061391557508080602001905181019061391391906152a0565b155b156110df576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611cb157600080fd5b6000806040838503121561398157600080fd5b823561398c8161394c565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156139ec576139ec61399a565b60405290565b604051610120810167ffffffffffffffff811182821017156139ec576139ec61399a565b60405160c0810167ffffffffffffffff811182821017156139ec576139ec61399a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a8057613a8061399a565b604052919050565b600067ffffffffffffffff821115613aa257613aa261399a565b5060051b60200190565b8035613ab78161394c565b919050565b600067ffffffffffffffff821115613ad657613ad661399a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b1357600080fd5b8135613b26613b2182613abc565b613a39565b818152846020838601011115613b3b57600080fd5b816020850160208301376000918101602001919091529392505050565b8015158114611cb157600080fd5b8035613ab781613b58565b600082601f830112613b8257600080fd5b613b8f613b218335613a88565b82358082526020808301929160051b850101851015613bad57600080fd5b602084015b6020853560051b860101811015613df95767ffffffffffffffff81351115613bd957600080fd5b8035850160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828903011215613c0f57600080fd5b613c176139c9565b67ffffffffffffffff60208301351115613c3057600080fd5b60208083013583010188601f820112613c4857600080fd5b613c55613b218235613a88565b81358082526020808301929160051b8401018b1015613c7357600080fd5b602083015b6020843560051b850101811015613dc65767ffffffffffffffff81351115613c9f57600080fd5b803584016101207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f03011215613cd657600080fd5b613cde6139f2565b613cea60208301613aac565b815267ffffffffffffffff60408301351115613d0557600080fd5b613d188e60206040850135850101613b02565b6020820152613d2960608301613aac565b604082015267ffffffffffffffff60808301351115613d4757600080fd5b613d5a8e60206080850135850101613b02565b6060820152613d6b60a08301613b66565b6080820152613d7c60c08301613aac565b60a0820152613d8d60e08301613b66565b60c0820152613d9f6101008301613aac565b60e0820152613db16101208301613aac565b61010082015284525060209283019201613c78565b50835250613dd8905060408301613aac565b60208281019190915260609290920135604082015284529283019201613bb2565b50949350505050565b600060c08284031215613e1457600080fd5b50919050565b60008060008060006101408688031215613e3357600080fd5b853567ffffffffffffffff811115613e4a57600080fd5b613e5688828901613b71565b9550506020860135935060408601359250613e748760608801613e02565b9150610120860135613e858161394c565b809150509295509295909350565b815173ffffffffffffffffffffffffffffffffffffffff16815260208083015190820152604081015b92915050565b60008083601f840112613ed457600080fd5b50813567ffffffffffffffff811115613eec57600080fd5b602083019150836020828501011115613f0457600080fd5b9250929050565b60008083601f840112613f1d57600080fd5b50813567ffffffffffffffff811115613f3557600080fd5b6020830191508360208260051b8501011115613f0457600080fd5b600060608284031215613f6257600080fd5b613f6a6139c9565b82358152602080840135908201529050604082013567ffffffffffffffff811115613f9457600080fd5b613fa084828501613b02565b60408301525092915050565b60008060008060008060008060008060e08b8d031215613fcb57600080fd5b613fd48b613aac565b995060208b0135985060408b013567ffffffffffffffff811115613ff757600080fd5b6140038d828e01613ec2565b90995097505060608b013567ffffffffffffffff81111561402357600080fd5b61402f8d828e01613f0b565b9097509550614042905060808c01613aac565b935060a08b013567ffffffffffffffff81111561405e57600080fd5b61406a8d828e01613ec2565b90945092505060c08b013567ffffffffffffffff81111561408a57600080fd5b6140968d828e01613f50565b9150509295989b9194979a5092959850565b602080825282518282018190526000918401906040840190835b8181101561410b576140f5838551805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b60209390930192604092909201916001016140c2565b509095945050505050565b60008083601f84011261412857600080fd5b50813567ffffffffffffffff81111561414057600080fd5b602083019150836020606083028501011115613f0457600080fd5b803560ff81168114613ab757600080fd5b600082601f83011261417d57600080fd5b813561418b613b2182613a88565b80828252602082019150602060c084028601019250858311156141ad57600080fd5b602085015b838110156142285760c081880312156141ca57600080fd5b6141d2613a16565b81356141dd8161394c565b815260208281013590820152604080830135908201526141ff6060830161415b565b60608201526080828101359082015260a08083013590820152835260209092019160c0016141b2565b5095945050505050565b60008060008060008060008060008060006101008c8e03121561425457600080fd5b61425d8c613aac565b9a5060208c013567ffffffffffffffff81111561427957600080fd5b6142858e828f01614116565b909b5099505060408c013567ffffffffffffffff8111156142a557600080fd5b6142b18e828f01613ec2565b90995097505060608c013595506142ca60808d01613aac565b945060a08c013567ffffffffffffffff8111156142e657600080fd5b6142f28e828f01613ec2565b90955093505060c08c013567ffffffffffffffff81111561431257600080fd5b61431e8e828f0161416c565b92505061432d60e08d01613aac565b90509295989b509295989b9093969950565b60008060008060008060c0878903121561435857600080fd5b86356143638161394c565b9550602087013594506040870135935061437f6060880161415b565b9598949750929560808101359460a0909101359350915050565b60008060008061012085870312156143b057600080fd5b84356143bb8161394c565b935060208501356143cb8161394c565b925060408501356143db8161394c565b91506143ea8660608701613e02565b905092959194509250565b6000806040838503121561440857600080fd5b82356144138161394c565b915060208301356144238161394c565b809150509250929050565b6000806000806000610140868803121561444757600080fd5b85356144528161394c565b945060208601356144628161394c565b935060408601356144728161394c565b92506144818760608801613e02565b915061012086013567ffffffffffffffff81111561449e57600080fd5b6144aa8882890161416c565b9150509295509295909350565b60008060008060008060c087890312156144d057600080fd5b86356144db8161394c565b955060208701359450604087013567ffffffffffffffff8111156144fe57600080fd5b61450a89828a01613b02565b9450506060870135925060808701356145228161394c565b915060a087013567ffffffffffffffff81111561453e57600080fd5b61454a89828a01613b02565b9150509295509295509295565b6000806000806080858703121561456d57600080fd5b84356145788161394c565b935060208501356145888161394c565b925060408501359150606085013561459f8161394c565b939692955090935050565b6000806000806000608086880312156145c257600080fd5b85356145cd8161394c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156145f757600080fd5b61460388828901613ec2565b969995985093965092949392505050565b600060608284031215613e1457600080fd5b600080600080600080600060e0888a03121561464157600080fd5b873561464c8161394c565b965060208801359550604088013567ffffffffffffffff81111561466f57600080fd5b61467b8a828b01613b02565b9550506060880135935061469160808901613aac565b925060a088013567ffffffffffffffff8111156146ad57600080fd5b6146b98a828b01613b02565b92505060c088013567ffffffffffffffff8111156146d657600080fd5b6146e28a828b01614614565b91505092959891949750929550565b6000806000806080858703121561470757600080fd5b843567ffffffffffffffff81111561471e57600080fd5b61472a87828801613b71565b9450506020850135925060408501359150606085013561459f8161394c565b60006101808284031215613e1457600080fd5b60008060006101c0848603121561477257600080fd5b833561477d8161394c565b9250602084013561478d8161394c565b915061479c8560408601614749565b90509250925092565b6000806000604084860312156147ba57600080fd5b83356147c58161394c565b9250602084013567ffffffffffffffff8111156147e157600080fd5b6147ed86828701613ec2565b9497909650939450505050565b6000806020838503121561480d57600080fd5b823567ffffffffffffffff81111561482457600080fd5b61483085828601613f0b565b90969095509350505050565b60005b8381101561485757818101518382015260200161483f565b50506000910152565b6000815180845261487881602086016020860161483c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015614921577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261490c858351614860565b945060209384019391909101906001016148d2565b50929695505050505050565b600080600080600080600080600060c08a8c03121561494b57600080fd5b89356149568161394c565b985060208a0135975060408a013567ffffffffffffffff81111561497957600080fd5b6149858c828d01613ec2565b90985096505060608a013567ffffffffffffffff8111156149a557600080fd5b6149b18c828d01613f0b565b90965094505060808a01356149c58161394c565b925060a08a013567ffffffffffffffff8111156149e157600080fd5b6149ed8c828d01613ec2565b915080935050809150509295985092959850929598565b600080600060608486031215614a1957600080fd5b8335614a248161394c565b92506020840135614a348161394c565b929592945050506040919091013590565b6000806000806101e08587031215614a5c57600080fd5b8435614a678161394c565b93506020850135614a778161394c565b9250614a868660408701614749565b91506101c085013567ffffffffffffffff811115614aa357600080fd5b614aaf8782880161416c565b91505092959194509250565b600060208284031215614acd57600080fd5b8135614ad88161394c565b9392505050565b60008060008060008060008060008060e08b8d031215614afe57600080fd5b8a35614b098161394c565b995060208b013567ffffffffffffffff811115614b2557600080fd5b614b318d828e01614116565b909a5098505060408b013567ffffffffffffffff811115614b5157600080fd5b614b5d8d828e01613ec2565b90985096505060608b01359450614b7660808c01613aac565b935060a08b013567ffffffffffffffff811115614b9257600080fd5b614b9e8d828e01613ec2565b9094509250614bb1905060c08c01613aac565b90509295989b9194979a5092959850565b60008060008060608587031215614bd857600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614bfd57600080fd5b614c0987828801613ec2565b95989497509550505050565b600060208284031215614c2757600080fd5b614ad88261415b565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff8516602082015283604082015282606082015260a06080820152600061084b60a0830184614860565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80516fffffffffffffffffffffffffffffffff81168114613ab757600080fd5b600080600060608486031215614ceb57600080fd5b614cf484614cb6565b602085015160409095015190969495509392505050565b600060208284031215614d1d57600080fd5b5051919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015283606082015260a06080820152600061123660a083018486614d24565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614dfa57600080fd5b83018035915067ffffffffffffffff821115614e1557600080fd5b602001915036819003821315613f0457600080fd5b8035600281900b8114613ab757600080fd5b6101808101614e6882614e4e85613aac565b73ffffffffffffffffffffffffffffffffffffffff169052565b614e7460208401613aac565b73ffffffffffffffffffffffffffffffffffffffff166020830152614e9b60408401614e2a565b614eaa604084018260020b9052565b50614eb760608401614e2a565b614ec6606084018260020b9052565b50614ed360808401614e2a565b614ee2608084018260020b9052565b5060a0838101359083015260c0808401359083015260e080840135908301526101008084013590830152614f196101208401613aac565b73ffffffffffffffffffffffffffffffffffffffff166101208301526101408381013590830152614f4d6101608401613aac565b73ffffffffffffffffffffffffffffffffffffffff811661016084015261176d565b60008060008060808587031215614f8557600080fd5b84519350614f9560208601614cb6565b6040860151606090960151949790965092505050565b60208152600061152a602083018486614d24565b600060208284031215614fd157600080fd5b8151614ad88161394c565b8183823760009101908152919050565b600060208284031215614ffe57600080fd5b815167ffffffffffffffff81111561501557600080fd5b8201601f8101841361502657600080fd5b8051615034613b2182613abc565b81815285602083850101111561504957600080fd5b61505a82602083016020860161483c565b95945050505050565b602081526000614ad86020830184614860565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613ebc57613ebc615076565b6080815260006150cb6080830187614860565b73ffffffffffffffffffffffffffffffffffffffff8616602084015273ffffffffffffffffffffffffffffffffffffffff85166040840152828103606084015261084b8185614860565b60006040828403121561512757600080fd5b6040805190810167ffffffffffffffff8111828210171561514a5761514a61399a565b8060405250809150825161515d8161394c565b8152602092830151920191909152919050565b60006040828403121561518257600080fd5b614ad88383615115565b73ffffffffffffffffffffffffffffffffffffffff89168152871515602082015286604082015273ffffffffffffffffffffffffffffffffffffffff86166060820152610100608082015260006151e7610100830187614860565b73ffffffffffffffffffffffffffffffffffffffff861660a084015273ffffffffffffffffffffffffffffffffffffffff851660c084015282810360e08401526109ab8185614860565b6000806040838503121561524457600080fd5b505080516020909101519092909150565b60007f8000000000000000000000000000000000000000000000000000000000000000820361528657615286615076565b5060000390565b80820180821115613ebc57613ebc615076565b6000602082840312156152b257600080fd5b8151614ad881613b58565b6080815260006152d06080830188614860565b73ffffffffffffffffffffffffffffffffffffffff8716602084015273ffffffffffffffffffffffffffffffffffffffff861660408401528281036060840152611236818587614d24565b60006020828403121561532d57600080fd5b815167ffffffffffffffff81111561534457600080fd5b8201601f8101841361535557600080fd5b8051615363613b2182613a88565b8082825260208201915060208360061b85010192508683111561538557600080fd5b6020840193505b8284101561129c5761539e8785615115565b825260208201915060408401935061538c565b600060608284031280156153c457600080fd5b506153cd6139c9565b82356153d88161394c565b81526020838101359082015260408301356153f281613b58565b60408201529392505050565b60808152600061541260808301888a614d24565b73ffffffffffffffffffffffffffffffffffffffff8716602084015273ffffffffffffffffffffffffffffffffffffffff86166040840152828103606084015261545d818587614d24565b9998505050505050505050565b6000825161547c81846020870161483c565b919091019291505056fea26469706673582212200ba9d751058e78741e949b91cc9ca6682bd0d70ca75bbaaa56d9d49f4bbcb92264736f6c634300081a0033

Deployed Bytecode Sourcemap

29819:22988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5863:219;;;;;;;;;;-1:-1:-1;5863:219:0;;;;;:::i;:::-;;:::i;:::-;;45702:693;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30295:49;;;;;;;;;;-1:-1:-1;30295:49:0;;;;;:::i;:::-;;:::i;:::-;;;8747:42:1;8735:55;;;8717:74;;8705:2;8690:18;30295:49:0;8571:226:1;37263:756:0;;;;;;;;;;-1:-1:-1;37263:756:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34129:1243::-;;;;;;:::i;:::-;;:::i;:::-;;;16316:25:1;;;16304:2;16289:18;34129:1243:0;16170:177:1;11409:289:0;;;;;;:::i;:::-;;:::i;48509:977::-;;;;;;:::i;:::-;;:::i;:::-;;;;18108:34:1;18096:47;;;18078:66;;18175:2;18160:18;;18153:34;;;;18203:18;;;18196:34;18066:2;18051:18;48509:977:0;17876:360:1;30223:65:0;;;;;;;;;;-1:-1:-1;30223:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18815:14:1;;18808:22;18790:41;;18778:2;18763:18;30223:65:0;18650:187:1;49494:1095:0;;;;;;:::i;:::-;;:::i;38594:463::-;;;;;;;;;;-1:-1:-1;38594:463:0;;;;;:::i;:::-;;:::i;52434:173::-;;;;;;;;;;-1:-1:-1;52434:173:0;;;;;:::i;:::-;;:::i;12333:315::-;;;;;;:::i;:::-;;:::i;12076:249::-;;;;;;:::i;:::-;;:::i;4463:103::-;;;;;;;;;;;;;:::i;39065:755::-;;;;;;;;;;-1:-1:-1;39065:755:0;;;;;:::i;:::-;;:::i;45344:350::-;;;;;;:::i;:::-;;:::i;3824:87::-;;;;;;;;;;-1:-1:-1;3870:7:0;3897:6;;;3824:87;;46403:1038;;;;;;:::i;:::-;;:::i;:::-;;;;25535:25:1;;;25608:34;25596:47;;;25591:2;25576:18;;25569:75;25660:18;;;25653:34;25718:2;25703:18;;25696:34;25522:3;25507:19;46403:1038:0;25304:432:1;51765:159:0;;;;;;:::i;:::-;;:::i;11706:362::-;;;;;;:::i;:::-;;:::i;23783:789::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36789:466::-;;;;;;;;;;-1:-1:-1;36789:466:0;;;;;:::i;:::-;;:::i;5362:464::-;;;;;;;;;;-1:-1:-1;5362:464:0;;;;;:::i;:::-;;:::i;47449:1052::-;;;;;;:::i;:::-;;:::i;30647:128::-;;;;;;;;;;-1:-1:-1;30647:128:0;;;;;:::i;:::-;30739:21;;30715:4;30739:21;;;:12;:21;;;;;:28;;30647:128;11067:334;;;;;;:::i;:::-;;:::i;33591:530::-;;;;;;:::i;:::-;;:::i;30084:73::-;;;;;;;;;;;;30115:42;30084:73;;4721:201;;;;;;;;;;-1:-1:-1;4721:201:0;;;;;:::i;:::-;;:::i;10792:267::-;;;;;;:::i;:::-;;:::i;52615:189::-;;;;;;;;;;-1:-1:-1;52615:189:0;;;;;:::i;:::-;;:::i;39828:1081::-;;;;;;;;;;-1:-1:-1;39828:1081:0;;;;;:::i;:::-;;:::i;35380:615::-;;;;;;:::i;:::-;;:::i;30003:74::-;;;;;;;;;;;;30035:42;30003:74;;32942:641;;;;;;:::i;:::-;;:::i;5863:219::-;3710:13;:11;:13::i;:::-;5952:6:::1;5962:1;5952:11:::0;5948:74:::1;;-1:-1:-1::0;5989:21:0::1;5948:74;6032:42;6063:2;6067:6;6032:30;:42::i;:::-;5863:219:::0;;:::o;45702:693::-;-1:-1:-1;;;;;;;;;;;;;;;;;45924:8:0;30472;30454:15;:26;30450:75;;;30504:9;;;;;;;;;;;;;;30450:75;46048:12:::1;;::::0;::::1;:6:::0;:12:::1;:::i;:::-;46035:33;;;46083:10;46116:4;46136:20;::::0;::::1;;46171:15;::::0;::::1;;46201:8;::::0;;;::::1;::::0;::::1;;:::i;:::-;46035:231;::::0;;::::1;::::0;;;;;;33950:42:1;33938:55;;;46035:231:0::1;::::0;::::1;33920:74:1::0;34030:55;;;;34010:18;;;34003:83;34102:18;;;34095:34;;;;34145:18;;;34138:34;34221:4;34209:17;34188:19;;;34181:46;46224:8:0::1;::::0;::::1;;34243:19:1::0;;;34236:35;46247:8:0::1;::::0;::::1;;34287:19:1::0;;;34280:35;33892:19;;46035:231:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46291:96;46311:5;46331:12;46358:18;46291:5;:96::i;:::-;46279:108:::0;45702:693;-1:-1:-1;;;;;;;45702:693:0:o;30295:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30295:49:0;;-1:-1:-1;30295:49:0:o;37263:756::-;37723:20;;37758:15;;;;37788:16;;;;;37632:183;;;;;37543:34;;37632:23;;;;;;:183;;37670:10;;37703:4;;37723:20;;37758:15;;37632:183;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37838:173;37878:4;37897:9;37921:4;;37838:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37838:173:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37940:10:0;;-1:-1:-1;37940:10:0;;;;37838:173;;;37940:10;;37838:173;37940:10;37838:173;;;;;;;;;-1:-1:-1;37965:8:0;;-1:-1:-1;37988:12:0;;-1:-1:-1;37988:12:0;;-1:-1:-1;37838:25:0;:173::i;:::-;37828:183;37263:756;-1:-1:-1;;;;;;;;;;;37263:756:0:o;34129:1243::-;34527:14;;-1:-1:-1;;;;;;;;34448:14:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34448:14:0;;34527;34603:6;34598:412;34615:1;34611;:5;34598:412;;;34644:7;34652:1;34644:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34684:12;;34784:20;;;;34823:15;;;;;34857:8;;;;34884;;;;34911;;;;34671:263;;;;;34723:10;34671:263;;;33920:74:1;34760:4:0;34010:18:1;;;34003:83;34102:18;;;34095:34;;;;34145:18;;;34138:34;;;;34221:4;34209:17;34188:19;;;34181:46;34243:19;;;34236:35;34287:19;;;34280:35;34644:10:0;;-1:-1:-1;34671:33:0;;;;;;;33892:19:1;;34671:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34980:3;;;;;34598:412;;;;35034:171;35073:4;35092:6;;35113:4;;35132:12;35159:8;35182:12;;35034:24;:171::i;:::-;35022:183;-1:-1:-1;35222:21:0;;;;35218:147;;35260:10;35273:27;;;;35284:4;35273:27;:::i;:::-;35315:38;;;;;;;;35564:25:1;;;35315:23:0;35625:55:1;;;35605:18;;;35598:83;35260:40:0;;-1:-1:-1;35315:23:0;;;;;;35537:18:1;;35315:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35245:120;35218:147;34464:908;;34129:1243;;;;;;;;;;;;;:::o;11409:289::-;11600:90;;;;;11634:10;11600:90;;;36025:74:1;11654:4:0;36115:18:1;;;36108:83;36207:18;;;36200:34;;;36250:18;;;36243:34;;;11676:4:0;36293:19:1;;;36286:51;36386:4;36374:17;;36353:19;;;36346:46;36408:19;;;36401:35;;;36452:19;;;36445:35;;;11600:33:0;;;;;;35997:19:1;;11600:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11409:289;;;;;;:::o;48509:977::-;48724:17;;;48792:14;;;30115:42;48792:14;;;:32;;-1:-1:-1;48810:9:0;:14;48792:32;48788:220;;;48841:72;48861:6;48877:4;48884:6;:21;;;48907:5;48841:19;:72::i;:::-;48928:68;48946:6;48954:18;48974:6;:21;;;48928:17;:68::i;:::-;49024:14;;;30115:42;49024:14;;;:32;;-1:-1:-1;49042:9:0;:14;49024:32;49020:220;;;49073:72;49093:6;49109:4;49116:6;:21;;;49139:5;49073:19;:72::i;:::-;49160:68;49178:6;49186:18;49206:6;:21;;;49160:17;:68::i;:::-;49284:83;;;;;;36754:20:1;;49284:83:0;;;36783:24:1;36877:4;36865:17;;36852:31;36899:20;;;36892:37;36987:17;;;36974:31;37021:20;;;37014:37;37121:4;37109:17;;37096:31;37143:20;;;37136:37;37243:4;37231:17;;37218:31;37265:20;;;37258:37;37365:4;37353:17;;37340:31;37387:20;;;37380:37;49284:57:0;;;;;;49349:9;;36694:19:1;;49284:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49252:115;;-1:-1:-1;49252:115:0;-1:-1:-1;49252:115:0;-1:-1:-1;49399:34:0;49414:6;49422:10;49399:14;:34::i;:::-;49444;49459:6;49467:10;49444:14;:34::i;:::-;48509:977;;;;;;;;:::o;49494:1095::-;49882:14;;-1:-1:-1;;;;;;;;49766:17:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49766:17:0;;;;;;49882:14;49964:6;49959:454;49976:1;49972;:5;49959:454;;;50011:7;50019:1;50011:10;;;;;;;;:::i;:::-;;;;;;;;;;;;50051:18;;50157:26;;;;50202:21;;;;;50242:14;;;;50275;;;;50308;;;;50038:299;;;;;50096:10;50038:299;;;33920:74:1;50133:4:0;34010:18:1;;;34003:83;34102:18;;;34095:34;;;;34145:18;;;34138:34;;;;34221:4;34209:17;34188:19;;;34181:46;34243:19;;;34236:35;34287:19;;;34280:35;50011:10:0;;-1:-1:-1;50038:39:0;;;;;;;33892:19:1;;50038:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50383:3;;;;;49959:454;;;;50457:124;50489:18;50522:6;50543;50564;50457:17;:124::i;:::-;50425:156;;;;-1:-1:-1;50425:156:0;;-1:-1:-1;49494:1095:0;-1:-1:-1;;;;;;;;49494:1095:0:o;38594:463::-;-1:-1:-1;;;;;;;;;;;;;;;;;38871:178:0;38917:4;38936:9;38960:4;38979:9;39003:8;39026:12;38871:31;:178::i;52434:173::-;52525:29;52532:6;52540:5;52547:6;52525;:29::i;:::-;52565:34;;;;;;;;35564:25:1;;;52565:22:0;35625:55:1;;;35605:18;;;35598:83;52565:22:0;;;;;35537:18:1;;52565:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52434:173;;;;:::o;12333:315::-;12508:50;;;;;12532:10;12508:50;;;38232:74:1;12552:4:0;38322:18:1;;;38315:83;12561:5:0;;12508:23;;;;;;38205:18:1;;12508:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;12504:137;;;12583:46;12595:5;12602;12609:8;12619:9;;12583:11;:46::i;:::-;12333:315;;;;;:::o;12076:249::-;12234:83;;;;;:28;;;;;;:83;;12263:10;;12283:4;;12290:5;;12297:8;;12307:9;;;;12234:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12076:249;;;;;:::o;4463:103::-;3710:13;:11;:13::i;:::-;4528:30:::1;4555:1;4528:18;:30::i;:::-;4463:103::o:0;39065:755::-;-1:-1:-1;;;;;;;;;;;;;;;;;39426:23:0;;;;39464:10;39497:4;39517:20;;39552:15;;;;39582:16;;;;39517:6;39582:16;:::i;:::-;39426:183;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39634:178;39680:4;39699:9;39723:4;39742:9;39766:8;39789:12;39634:31;:178::i;:::-;39622:190;39065:755;-1:-1:-1;;;;;;;;39065:755:0:o;45344:350::-;-1:-1:-1;;;;;;;;;;;;;;;;;45512:8:0;30472;30454:15;:26;30450:75;;;30504:9;;;;;;;;;;;;;;30450:75;45590:96:::1;45610:5;45630:12;45657:18;45590:5;:96::i;:::-;45578:108:::0;45344:350;-1:-1:-1;;;;;;45344:350:0:o;46403:1038::-;46575:15;;;;30115:42;46660:13;;;;:6;:13;:::i;:::-;:21;;;;:39;;;-1:-1:-1;46685:9:0;:14;46660:39;46656:241;;;46716:79;46736:13;;;;:6;:13;:::i;:::-;46759:4;46766:6;:21;;;46789:5;46716:19;:79::i;:::-;46810:75;46828:13;;;;:6;:13;:::i;:::-;46843:18;46863:6;:21;;;46810:17;:75::i;:::-;30115:42;46913:13;;;;;;;;:::i;:::-;:21;;;;:39;;;-1:-1:-1;46938:9:0;:14;46913:39;46909:241;;;46969:79;46989:13;;;;;;;;:::i;:::-;47012:4;47019:6;:21;;;47042:5;46969:19;:79::i;:::-;47063:75;47081:13;;;;;;;;:::i;:::-;47096:18;47116:6;:21;;;47063:17;:75::i;:::-;47203:70;;;;;:44;;;;;;47255:9;;47203:70;;47266:6;;47203:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47162:111;;-1:-1:-1;47162:111:0;;-1:-1:-1;47162:111:0;-1:-1:-1;47162:111:0;-1:-1:-1;47305:41:0;47320:13;;;;:6;:13;:::i;:::-;47335:10;47305:14;:41::i;:::-;47357;47372:13;;;;;;;;:::i;47357:41::-;47411:22;47428:4;47411:16;:22::i;:::-;46403:1038;;;;;;;:::o;51765:159::-;51877:39;;;;;51850:7;;51877:33;;;;;;:39;;51911:4;;;;51877:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51870:46;51765:159;-1:-1:-1;;;;51765:159:0:o;11706:362::-;11914:50;;;;;11938:10;11914:50;;;38232:74:1;11958:4:0;38322:18:1;;;38315:83;11967:17:0;;11914:23;;;;;;38205:18:1;;11914:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;11910:151;;;12001:48;12019:5;12026;12033:6;12041:1;12044;12047;12001:17;:48::i;:::-;11706:362;;;;;;:::o;23783:789::-;23849:22;23906:4;23894:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23884:34;;23944:6;23939:626;23952:15;;;23939:626;;;23986:12;;24031:4;24050;;24055:1;24050:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;24023:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23985:73;;;;24080:7;24075:313;;24209:2;24193:6;:13;:18;24189:32;;;24213:8;;;24189:32;24294:4;24286:6;24282:17;24272:27;;24354:6;24343:28;;;;;;;;;;;;:::i;:::-;24336:36;;;;;;;;;;;:::i;:::-;;;;;;;;24075:313;24417:6;24404:7;24412:1;24404:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;-1:-1:-1;;24535:3:0;;23939:626;;;;23783:789;;;;:::o;36789:466::-;37017:34;37074:173;37114:4;37133:9;37157:4;;37074:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37074:173:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37176:10:0;;-1:-1:-1;37176:10:0;;;;37074:173;;;37176:10;;37074:173;37176:10;37074:173;;;;;;;;;-1:-1:-1;37201:8:0;;-1:-1:-1;37224:12:0;;-1:-1:-1;37224:12:0;;-1:-1:-1;37074:25:0;:173::i;:::-;37064:183;36789:466;-1:-1:-1;;;;;;;;;;36789:466:0:o;5362:464::-;3710:13;:11;:13::i;:::-;5464:16:::1;::::0;::::1;::::0;;::::1;::::0;:31:::1;;;5490:5;5484:11;;:2;:11;;;;5464:31;5456:54;;;::::0;::::1;::::0;;44564:2:1;5456:54:0::1;::::0;::::1;44546:21:1::0;44603:2;44583:18;;;44576:30;44642:12;44622:18;;;44615:40;44672:18;;5456:54:0::1;44362:334:1::0;5456:54:0::1;5538:38;::::0;;;;5570:4:::1;5538:38;::::0;::::1;8717:74:1::0;5523:12:0::1;::::0;5538:23:::1;::::0;::::1;::::0;::::1;::::0;8690:18:1;;5538:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5523:53;;5593:6;5603:1;5593:11:::0;5589:230:::1;;5621:47;5649:5;5656:2;5660:7;5621:27;:47::i;:::-;5589:230;;;5719:7;5709:6;:17;;5701:45;;;::::0;::::1;::::0;;44903:2:1;5701:45:0::1;::::0;::::1;44885:21:1::0;44942:2;44922:18;;;44915:30;44981:17;44961:18;;;44954:45;45016:18;;5701:45:0::1;44701:339:1::0;5701:45:0::1;5761:46;5789:5;5796:2;5800:6;5761:27;:46::i;:::-;5445:381;5362:464:::0;;;:::o;47449:1052::-;47811:14;;-1:-1:-1;;;;;;;;47678:15:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47678:15:0;;;;;;;;47893:6;47888:454;47905:1;47901;:5;47888:454;;;47940:7;47948:1;47940:10;;;;;;;;:::i;:::-;;;;;;;;;;;;47980:18;;48086:26;;;;48131:21;;;;;48171:14;;;;48204;;;;48237;;;;47967:299;;;;;48025:10;47967:299;;;33920:74:1;48062:4:0;34010:18:1;;;34003:83;34102:18;;;34095:34;;;;34145:18;;;34138:34;;;;34221:4;34209:17;34188:19;;;34181:46;34243:19;;;34236:35;34287:19;;;34280:35;47940:10:0;;-1:-1:-1;47967:39:0;;;;;;;33892:19:1;;47967:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48312:3;;;;;47888:454;;;;48395:98;48424:18;48457:4;48476:6;48395:14;:98::i;:::-;48354:139;;;;-1:-1:-1;48354:139:0;-1:-1:-1;48354:139:0;;-1:-1:-1;47449:1052:0;-1:-1:-1;;;;;;;47449:1052:0:o;11067:334::-;11264:50;;;;;11288:10;11264:50;;;38232:74:1;11308:4:0;38322:18:1;;;38315:83;11317:5:0;;11264:23;;;;;;38205:18:1;;11264:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;11260:134;;;11339:43;11350:5;11357;11364:8;11374:1;11377;11380;11339:10;:43::i;33591:530::-;33858:14;33897:181;33924:4;33943:6;;33964:4;;33983:12;34010:8;34033:12;;34060:7;33897:12;:181::i;:::-;33885:193;;34091:22;34108:4;34091:16;:22::i;4721:201::-;3710:13;:11;:13::i;:::-;4810:22:::1;::::0;::::1;4802:73;;;::::0;::::1;::::0;;45247:2:1;4802:73:0::1;::::0;::::1;45229:21:1::0;45286:2;45266:18;;;45259:30;45325:34;45305:18;;;45298:62;45396:8;45376:18;;;45369:36;45422:19;;4802:73:0::1;45045:402:1::0;4802:73:0::1;4886:28;4905:8;4886:18;:28::i;:::-;4721:201:::0;:::o;10792:267::-;10972:79;;;;;10999:10;10972:79;;;33920:74:1;11019:4:0;34010:18:1;;;34003:83;34102:18;;;34095:34;;;34145:18;;;34138:34;;;34221:4;34209:17;;34188:19;;;34181:46;34243:19;;;34236:35;;;34287:19;;;34280:35;;;10972:26:0;;;;;;33892:19:1;;10972:79:0;33609:712:1;52615:189:0;52715:29;52722:6;52730:5;52737:6;52715;:29::i;:::-;52755:41;;;;;:22;45672:55:1;;;52755:41:0;;;45654:74:1;45744:18;;;45737:34;;;45807:55;;;45787:18;;;45780:83;52755:22:0;;;;;45627:18:1;;52755:41:0;45452:417:1;39828:1081:0;39965:1;39950:12;:16;:36;;;;39985:1;39970:12;:16;39950:36;39942:45;;;;;;40064:15;;40101:33;;;;40112:4;40101:33;:::i;:::-;40063:71;;-1:-1:-1;40063:71:0;-1:-1:-1;40807:94:0;40835:23;;;;:40;;40868:7;40835:40;;;30115:42;40835:40;40877:10;40889:11;40807:27;:94::i;35380:615::-;35700:14;35739:213;35776:4;35795:6;;35816:4;;35835:12;35862:8;35885:12;;35912:7;35934;35739:22;:213::i;:::-;35727:225;;35965:22;35982:4;35965:16;:22::i;32942:641::-;33206:14;33245:171;33284:4;33303:6;;33324:4;;33343:12;33370:8;33393:12;;33245:24;:171::i;:::-;33233:183;-1:-1:-1;33433:21:0;;;;33429:147;;33471:10;33484:27;;;;33495:4;33484:27;:::i;:::-;33526:38;;;;;;;;35564:25:1;;;33526:23:0;35625:55:1;;;35605:18;;;35598:83;33471:40:0;;-1:-1:-1;33526:23:0;;;;;;35537:18:1;;33526:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33456:120;32942:641;;;;;;;;;;;;:::o;3989:130::-;4064:10;4053:7;3870;3897:6;;;;3824:87;4053:7;:21;;;4045:66;;;;;;;46076:2:1;4045:66:0;;;46058:21:1;;;46095:18;;;46088:30;46154:34;46134:18;;;46127:62;46206:18;;4045:66:0;45874:356:1;8005:260:0;8135:12;8153:2;:7;;8168:5;8153:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8134:44;;;8196:7;8191:67;;8227:19;;;;;;;;;;;;;;8191:67;8063:202;8005:260;;:::o;41034:4302::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;41238:12:0;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41367:14:0;41362:3641;41395:11;41383:9;:23;41362:3641;;;41432:5;41438:9;41432:16;;;;;;;;:::i;:::-;;;;;;;41425:23;;41512:4;:10;;;41523:1;41512:13;;;;;;;;:::i;:::-;;;;;;;41505:20;;41615:1;41589:28;;:4;:14;;;:28;;;41585:655;;41638:203;41680:4;:12;;;41715:4;:9;;;41773:4;:13;;;41809:4;:13;;;41638:19;:203::i;:::-;41585:655;;;41914:221;41956:4;:12;;;41999:4;42067;:13;;;42103:4;:13;;;41914:19;:221::i;:::-;42178:46;;;;;;;;42196:12;;;;;42178:46;;;;42210:13;;;;42178:46;;;;;;;42156:68;;41585:655;42314:10;;:17;:21;;42334:1;;42314:21;:::i;:::-;42292:19;;;:43;42352:14;42381:2539;42419:14;;;;:28;;42415:1458;;42504:4;:9;;;42494:25;;;42546:4;:9;;;42557:10;42569:4;:13;;;42584:4;:17;;;42494:130;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42472:152;;42415:1458;;;42873:19;;:25;;42900:26;;;;;42862:65;;42825:34;;42862:65;;42873:25;42900:26;42862:65;48492:42:1;48480:55;;;;48462:74;;48567:2;48552:18;;48545:34;48450:2;48435:18;;48288:297;42862:65:0;;;;;;;;;;;;;42825:102;;42953:14;42969;43002:4;:9;;;42987:30;;;43044:4;:14;;;43085:4;:15;;;43134:5;:19;;;:26;;;43219:4;:22;;;:27;;43245:1;43219:27;:195;;43392:4;:22;;;43219:195;;;43279:4;:15;;;:80;;43310:49;43279:80;;;43297:10;43279:80;43468:21;43516:10;43553:4;:13;;;43593:4;:17;;;42987:646;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42952:681;;;;43680:173;;;;;;;;43732:4;:13;;;43680:173;;;;;;43780:4;:15;;;:49;;43820:8;43821:7;43820:8;:::i;:::-;43780:49;;;43803:8;43804:7;43803:8;:::i;:::-;43680:173;;43658:195;;-1:-1:-1;;;42415:1458:0;43910:5;:19;;;43897:9;:32;43893:1012;;43972:19;;:25;43954:43;;;;44040:19;;:26;;;;;44020:16;;;:46;;;;44040:26;;44020:46;:::i;:::-;;;-1:-1:-1;44091:5:0;;43893:1012;44186:13;;;;44372:10;;:21;;44261:11;;;;;;;44372:21;;;;;;:::i;:::-;;;;;;;44365:28;;44423:20;44422:21;:38;;;;;44447:4;:13;;;44422:38;44418:468;;;44510:19;;:25;44503:58;;;;;44555:4;44503:58;;;8717:74:1;44489:11:0;;44503:43;;;;;8690:18:1;;44503:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44676:19;;:25;44489:72;;-1:-1:-1;44648:69:0;;30035:42;44489:72;44648:27;:69::i;:::-;44825:19;;:25;44852:9;;44803:59;;;;;38262:42:1;38250:55;;;44803:59:0;;;38232:74:1;38342:55;;38322:18;;;38315:83;30035:42:0;;44803:21;;38205:18:1;;44803:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44462:424;44418:468;44135:770;42381:2539;;;-1:-1:-1;44965:11:0;;41362:3641;;;;45038:12;45019:9;:16;;;:31;45015:90;;;45074:19;;;;;;;;;;;;;;45015:90;45121:32;;;;45117:212;;45191:37;;;;;45222:4;45191:37;;;8717:74:1;30115:42:0;;45170:20;;30115:42;;45191:22;;8690:18:1;;45191:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45170:59;;;;;;;;;;;;;16316:25:1;;16304:2;16289:18;;16170:177;45170:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45244:73;45275:18;45295:21;45244:30;:73::i;:::-;41208:4128;;;;41034:4302;;;;;:::o;36026:755::-;36308:57;;;;;36337:10;36308:57;;;50482:74:1;36308:28:0;;;50572:18:1;;;50565:83;;;50664:18;;;50657:34;;;36261::0;;36308:28;;50455:18:1;;36308:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36388:58:0;;;;;:16;;;;;;:58;;36405:4;;36411:10;;36423:8;;36433:12;;;;36388:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36468:14;;36378:68;;-1:-1:-1;36459:6:0;36495:279;36512:1;36508;:5;36495:279;;;36532:36;36571:7;36579:1;36571:10;;;;;;;;:::i;:::-;;;;;;;36532:49;;36623:10;36634:1;36623:13;;;;;;;;:::i;:::-;;;;;;;36602:11;:18;;;:34;36598:101;;;36664:19;;;;;;;;;;;;;;36598:101;-1:-1:-1;36744:3:0;;36495:279;;;;36297:484;36026:755;;;;;;;;;:::o;31912:795::-;-1:-1:-1;;;;;;;;32155:14:0;-1:-1:-1;;;;;;;;;;;;;;;32238:6:0;;32305;32300:215;32317:1;32313;:5;32300:215;;;32345:6;;32352:1;32345:9;;;;;;;:::i;:::-;;;;;;32337:17;;;;;;;;;;:::i;:::-;;;32371:68;32391:5;:11;;;32404:4;32410:5;:12;;;32424:5;:14;;;32371:19;:68::i;:::-;32485:3;;32300:215;;;-1:-1:-1;32539:58:0;;;;;:16;;;;;;:58;;32556:4;;;;32562:10;;32574:8;;32584:12;;;;32539:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32527:70;;32626:12;32614:9;:24;32610:90;;;32662:26;;;;;;;;;;;;;;32610:90;32171:536;;31912:795;;;;;;;;;;;:::o;30783:1121::-;30890:8;30886:1011;;;30919:21;;;;;:75;;-1:-1:-1;30945:13:0;;;30115:42;30945:13;:48;;;;;30987:6;30962:21;:31;;30945:48;30915:486;;;31061:54;;;;;30212:1;31061:54;;;38232:74:1;38262:42;38342:55;;38322:18;;;38315:83;30035:42:0;;31061:21;;31090:6;;38205:18:1;;31061:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30886:1011;;30915:486;31206:65;31238:5;31245:10;30035:42;31264:6;31206:31;:65::i;:::-;31353:32;;;;;38262:42:1;38250:55;;;31353:32:0;;;38232:74:1;38342:55;;38322:18;;;38315:83;30035:42:0;;31353:21;;38205:18:1;;31353:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30886:1011::-;31437:21;;;;;:75;;-1:-1:-1;31463:13:0;;;30115:42;31463:13;:48;;;;;31505:6;31480:21;:31;;31463:48;31433:453;;;30115:42;31578:19;;;31605:6;31578:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31682:32:0;;;;;48492:42:1;48480:55;;31682:32:0;;;48462:74:1;48552:18;;;48545:34;;;30115:42:0;;-1:-1:-1;31682:20:0;;-1:-1:-1;48435:18:1;;;-1:-1:-1;31682:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31433:453::-;31808:62;31840:5;31847:10;31859:2;31863:6;31808:31;:62::i;51270:413::-;51365:21;;;;51361:315;;51407:47;;;;;51439:4;51407:47;;;38232:74:1;51407:23:0;38342:55:1;;;38322:18;;;38315:83;51457:6:0;;51407:23;;;;;;38205:18:1;;51407:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;51403:262;;;51484:45;51511:5;51518:7;51527:1;51484:26;:45::i;:::-;51591:58;51618:5;51625:7;51634:14;51591:26;:58::i;50597:665::-;50671:21;;;;;:38;;-1:-1:-1;50696:13:0;;;30115:42;50696:13;50671:38;50667:588;;;50741:37;;;;;50772:4;50741:37;;;8717:74:1;50726:12:0;;30115:42;;50741:22;;8690:18:1;;50741:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50726:52;-1:-1:-1;50797:12:0;;50793:82;;50830:29;;;;;;;;16316:25:1;;;30115:42:0;;50830:20;;16289:18:1;;50830:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50793:82;50893:21;:26;50889:124;;50940:57;50971:2;50975:21;50940:30;:57::i;50667:588::-;51060:38;;;;;51092:4;51060:38;;;8717:74:1;51045:12:0;;51060:23;;;;;;8690:18:1;;51060:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51045:53;-1:-1:-1;51117:12:0;;51113:131;;51189:38;;;;;51221:4;51189:38;;;8717:74:1;51150:78:0;;51178:5;;51185:2;;51189:23;;;;;;8690:18:1;;51189:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51150:27;:78::i;38057:529::-;-1:-1:-1;;;;;;;;;;;;;;;;38333:57:0;;;;;38362:10;38333:57;;;50482:74:1;38333:28:0;;;50572:18:1;;;50565:83;;;50664:18;;;50657:34;;;38333:28:0;;;50455:18:1;;38333:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38415:64:0;;;;;:22;;;;;;:64;;38438:4;;38444:10;;38456:8;;38466:12;;38415:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38403:76;;38515:9;38496;:16;;;:28;38492:87;;;38548:19;;;;;;;;;;;;;;51932:423;52011:73;52043:5;52050:10;52070:4;52077:6;52011:31;:73::i;:::-;52101:46;;;;;52133:4;52101:46;;;38232:74:1;52101:23:0;38342:55:1;;;38322:18;;;38315:83;52150:6:0;;52101:23;;;;;;38205:18:1;;52101:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;52097:251;;;52279:57;52306:5;52313:6;52321:14;52279:26;:57::i;5082:191::-;5156:16;5175:6;;;5192:17;;;;;;;;;;5225:40;;5175:6;;;;;;;5225:40;;5156:16;5225:40;5145:128;5082:191;:::o;32715:219::-;32779:19;;;;;;;:13;:19;;;;;;;;32799:10;32779:31;;;;;;;;;;32774:153;;32827:19;;;;;;32861:4;32827:19;;;;;;;;32847:10;32827:31;;;;;;;:38;;;;;;;;32880:12;:24;;;;:35;;;;;;;;;;;;;;;;;;;;;;32715:219::o;7000:470::-;7289:45;;;7278:10;48480:55:1;;;7289:45:0;;;48462:74:1;48552:18;;;;48545:34;;;7289:45:0;;;;;;;;;;48435:18:1;;;;7289:45:0;;;;;;;;;;;;;7278:57;;-1:-1:-1;;;;7278:10:0;;;;:57;;7289:45;7278:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7242:93;;;;7353:7;7352:8;:59;;;-1:-1:-1;7365:11:0;;:16;;;;:45;;;7397:4;7386:24;;;;;;;;;;;;:::i;:::-;7385:25;7365:45;7348:115;;;7435:16;;;;;;;;;;;;;;7478:519;7806:51;;;7795:10;50500:55:1;;;7806:51:0;;;50482:74:1;50592:55;;;50572:18;;;50565:83;50664:18;;;;50657:34;;;7806:51:0;;;;;;;;;;50455:18:1;;;;7806:51:0;;;;;;;;;;;;;7795:63;;-1:-1:-1;;;;7795:10:0;;;;:63;;7806:51;7795:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7759:99;;;;7876:7;7875:8;:59;;;-1:-1:-1;7888:11:0;;:16;;;;:45;;;7920:4;7909:24;;;;;;;;;;;;:::i;:::-;7908:25;7888:45;7871:119;;;7958:20;;;;;;;;;;;;;;6525:467;6812:45;;;6801:10;48480:55:1;;;6812:45:0;;;48462:74:1;48552:18;;;;48545:34;;;6812:45:0;;;;;;;;;;48435:18:1;;;;6812:45:0;;;;;;;;;;;;;6801:57;;-1:-1:-1;;;;6801:10:0;;;;:57;;6812:45;6801:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6765:93;;;;6876:7;6875:8;:59;;;-1:-1:-1;6888:11:0;;:16;;;;:45;;;6920:4;6909:24;;;;;;;;;;;;:::i;:::-;6908:25;6888:45;6871:114;;;6958:15;;;;;;;;;;;;;;14:162:1;108:42;101:5;97:54;90:5;87:65;77:93;;166:1;163;156:12;181:383;257:6;265;318:2;306:9;297:7;293:23;289:32;286:52;;;334:1;331;324:12;286:52;373:9;360:23;392:39;425:5;392:39;:::i;:::-;450:5;528:2;513:18;;;;500:32;;-1:-1:-1;;;181:383:1:o;569:184::-;621:77;618:1;611:88;718:4;715:1;708:15;742:4;739:1;732:15;758:253;830:2;824:9;872:4;860:17;;907:18;892:34;;928:22;;;889:62;886:88;;;954:18;;:::i;:::-;990:2;983:22;758:253;:::o;1016:255::-;1088:2;1082:9;1130:6;1118:19;;1167:18;1152:34;;1188:22;;;1149:62;1146:88;;;1214:18;;:::i;1276:253::-;1348:2;1342:9;1390:4;1378:17;;1425:18;1410:34;;1446:22;;;1407:62;1404:88;;;1472:18;;:::i;1534:334::-;1605:2;1599:9;1661:2;1651:13;;1666:66;1647:86;1635:99;;1764:18;1749:34;;1785:22;;;1746:62;1743:88;;;1811:18;;:::i;:::-;1847:2;1840:22;1534:334;;-1:-1:-1;1534:334:1:o;1873:191::-;1941:4;1974:18;1966:6;1963:30;1960:56;;;1996:18;;:::i;:::-;-1:-1:-1;2041:1:1;2037:14;2053:4;2033:25;;1873:191::o;2069:142::-;2137:20;;2166:39;2137:20;2166:39;:::i;:::-;2069:142;;;:::o;2216:245::-;2264:4;2297:18;2289:6;2286:30;2283:56;;;2319:18;;:::i;:::-;-1:-1:-1;2376:2:1;2364:15;2381:66;2360:88;2450:4;2356:99;;2216:245::o;2466:486::-;2508:5;2561:3;2554:4;2546:6;2542:17;2538:27;2528:55;;2579:1;2576;2569:12;2528:55;2619:6;2606:20;2650:52;2666:35;2694:6;2666:35;:::i;:::-;2650:52;:::i;:::-;2727:6;2718:7;2711:23;2781:3;2774:4;2765:6;2757;2753:19;2749:30;2746:39;2743:59;;;2798:1;2795;2788:12;2743:59;2863:6;2856:4;2848:6;2844:17;2837:4;2828:7;2824:18;2811:59;2919:1;2890:20;;;2912:4;2886:31;2879:42;;;;2894:7;2466:486;-1:-1:-1;;;2466:486:1:o;2957:118::-;3043:5;3036:13;3029:21;3022:5;3019:32;3009:60;;3065:1;3062;3055:12;3080:128;3145:20;;3174:28;3145:20;3174:28;:::i;3213:3287::-;3275:5;3328:3;3321:4;3313:6;3309:17;3305:27;3295:55;;3346:1;3343;3336:12;3295:55;3370:86;3386:69;3447:6;3434:20;3386:69;:::i;3370:86::-;3504:20;;3492:33;;;3550:4;3541:14;;;;3480:3;3590:1;3586:28;3574:41;;3570:52;3567:61;-1:-1:-1;3564:81:1;;;3641:1;3638;3631:12;3564:81;3677:4;3669:6;3665:17;3691:2778;3762:4;3751:6;3738:20;3735:1;3731:28;3723:6;3719:41;3715:52;3710:3;3707:61;3691:2778;;;3850:18;3844:3;3831:17;3828:41;3825:61;;;3882:1;3879;3872:12;3825:61;3934:3;3921:17;3913:6;3909:30;4046:4;3977:66;3972:2;3967:3;3963:12;3959:85;3955:96;3952:116;;;4064:1;4061;4054:12;3952:116;4094:22;;:::i;:::-;4164:18;4156:4;4152:2;4148:13;4135:27;4132:51;4129:71;;;4196:1;4193;4186:12;4129:71;4265:4;4256;4252:2;4248:13;4235:27;4231:2;4227:36;4223:47;4312:3;4305:4;4301:2;4297:13;4293:23;4283:51;;4330:1;4327;4320:12;4283:51;4360:82;4376:65;4437:2;4424:16;4376:65;:::i;4360:82::-;4502:16;;4488:31;;;4552:4;4541:16;;;;4470:5;4592:1;4588:24;4580:33;;4576:44;4573:53;-1:-1:-1;4570:73:1;;;4639:1;4636;4629:12;4570:73;4677:4;4673:2;4669:13;4695:1470;4764:4;4757:2;4744:16;4741:1;4737:24;4733:2;4729:33;4725:44;4718:5;4715:55;4695:1470;;;4870:18;4862:5;4849:19;4846:43;4843:63;;;4902:1;4899;4892:12;4843:63;4954:5;4941:19;4937:2;4933:28;5072:6;5003:66;4998:2;4993:3;4989:12;4985:85;4981:98;4978:118;;;5092:1;5089;5082:12;4978:118;5128:22;;:::i;:::-;5183:33;5210:4;5206:2;5202:13;5183:33;:::i;:::-;5174:7;5167:50;5267:18;5261:2;5257;5253:11;5240:25;5237:49;5234:69;;;5299:1;5296;5289:12;5234:69;5347:68;5411:3;5404:4;5397:2;5393;5389:11;5376:25;5372:2;5368:34;5364:45;5347:68;:::i;:::-;5340:4;5331:7;5327:18;5320:96;5458:33;5485:4;5481:2;5477:13;5458:33;:::i;:::-;5453:2;5444:7;5440:16;5433:59;5543:18;5536:3;5532:2;5528:12;5515:26;5512:50;5509:70;;;5575:1;5572;5565:12;5509:70;5623:69;5688:3;5681:4;5673:3;5669:2;5665:12;5652:26;5648:2;5644:35;5640:46;5623:69;:::i;:::-;5616:4;5607:7;5603:18;5596:97;5736:29;5760:3;5756:2;5752:12;5736:29;:::i;:::-;5730:3;5721:7;5717:17;5710:56;5809:32;5836:3;5832:2;5828:12;5809:32;:::i;:::-;5803:3;5794:7;5790:17;5783:59;5885:29;5909:3;5905:2;5901:12;5885:29;:::i;:::-;5879:3;5870:7;5866:17;5859:56;5958:32;5985:3;5981:2;5977:12;5958:32;:::i;:::-;5952:3;5943:7;5939:17;5932:59;6034:35;6061:6;6057:2;6053:15;6034:35;:::i;:::-;6028:3;6015:17;;6008:62;6087:22;;-1:-1:-1;6146:4:1;6135:16;;;;4794;4695:1470;;;-1:-1:-1;6178:22:1;;-1:-1:-1;6238:31:1;;-1:-1:-1;6265:2:1;6257:11;;6238:31;:::i;:::-;6231:4;6220:16;;;6213:57;;;;6344:4;6336:13;;;;6323:27;6381:2;6370:14;;6363:31;6407:18;;6445:14;;;;3786;3691:2778;;;-1:-1:-1;6487:7:1;3213:3287;-1:-1:-1;;;;3213:3287:1:o;6505:166::-;6575:5;6620:3;6611:6;6606:3;6602:16;6598:26;6595:46;;;6637:1;6634;6627:12;6595:46;-1:-1:-1;6659:6:1;6505:166;-1:-1:-1;6505:166:1:o;6676:909::-;6855:6;6863;6871;6879;6887;6940:3;6928:9;6919:7;6915:23;6911:33;6908:53;;;6957:1;6954;6947:12;6908:53;6997:9;6984:23;7030:18;7022:6;7019:30;7016:50;;;7062:1;7059;7052:12;7016:50;7085:69;7146:7;7137:6;7126:9;7122:22;7085:69;:::i;:::-;7075:79;-1:-1:-1;;7223:2:1;7208:18;;7195:32;;-1:-1:-1;7324:2:1;7309:18;;7296:32;;-1:-1:-1;7373:73:1;7438:7;7433:2;7418:18;;7373:73;:::i;:::-;7363:83;;7498:3;7487:9;7483:19;7470:33;7512:41;7545:7;7512:41;:::i;:::-;7572:7;7562:17;;;6676:909;;;;;;;;:::o;7928:258::-;7803:12;;7817:42;7799:61;7787:74;;7910:4;7899:16;;;7893:23;7877:14;;;7870:47;8120:2;8105:18;;8132:48;7928:258;;;;:::o;8802:347::-;8853:8;8863:6;8917:3;8910:4;8902:6;8898:17;8894:27;8884:55;;8935:1;8932;8925:12;8884:55;-1:-1:-1;8958:20:1;;9001:18;8990:30;;8987:50;;;9033:1;9030;9023:12;8987:50;9070:4;9062:6;9058:17;9046:29;;9122:3;9115:4;9106:6;9098;9094:19;9090:30;9087:39;9084:59;;;9139:1;9136;9129:12;9084:59;8802:347;;;;;:::o;9154:367::-;9217:8;9227:6;9281:3;9274:4;9266:6;9262:17;9258:27;9248:55;;9299:1;9296;9289:12;9248:55;-1:-1:-1;9322:20:1;;9365:18;9354:30;;9351:50;;;9397:1;9394;9387:12;9351:50;9434:4;9426:6;9422:17;9410:29;;9494:3;9487:4;9477:6;9474:1;9470:14;9462:6;9458:27;9454:38;9451:47;9448:67;;;9511:1;9508;9501:12;9526:588;9590:5;9638:4;9626:9;9621:3;9617:19;9613:30;9610:50;;;9656:1;9653;9646:12;9610:50;9678:22;;:::i;:::-;9745:23;;9777:22;;9872:2;9857:18;;;9844:32;9892:14;;;9885:31;9669;-1:-1:-1;9967:2:1;9952:18;;9939:32;9994:18;9983:30;;9980:50;;;10026:1;10023;10016:12;9980:50;10062:45;10103:3;10094:6;10083:9;10079:22;10062:45;:::i;:::-;10057:2;10050:5;10046:14;10039:69;;9526:588;;;;:::o;10119:1566::-;10314:6;10322;10330;10338;10346;10354;10362;10370;10378;10386;10439:3;10427:9;10418:7;10414:23;10410:33;10407:53;;;10456:1;10453;10446:12;10407:53;10479:29;10498:9;10479:29;:::i;:::-;10469:39;-1:-1:-1;10577:2:1;10562:18;;10549:32;;-1:-1:-1;10656:2:1;10641:18;;10628:32;10683:18;10672:30;;10669:50;;;10715:1;10712;10705:12;10669:50;10754:58;10804:7;10795:6;10784:9;10780:22;10754:58;:::i;:::-;10831:8;;-1:-1:-1;10728:84:1;-1:-1:-1;;10919:2:1;10904:18;;10891:32;10948:18;10935:32;;10932:52;;;10980:1;10977;10970:12;10932:52;11019:72;11083:7;11072:8;11061:9;11057:24;11019:72;:::i;:::-;11110:8;;-1:-1:-1;10993:98:1;-1:-1:-1;11164:39:1;;-1:-1:-1;11198:3:1;11183:19;;11164:39;:::i;:::-;11154:49;;11256:3;11245:9;11241:19;11228:33;11286:18;11276:8;11273:32;11270:52;;;11318:1;11315;11308:12;11270:52;11357:60;11409:7;11398:8;11387:9;11383:24;11357:60;:::i;:::-;11436:8;;-1:-1:-1;11331:86:1;-1:-1:-1;;11524:3:1;11509:19;;11496:33;11554:18;11541:32;;11538:52;;;11586:1;11583;11576:12;11538:52;11609:70;11671:7;11660:8;11649:9;11645:24;11609:70;:::i;:::-;11599:80;;;10119:1566;;;;;;;;;;;;;:::o;11690:692::-;11938:2;11950:21;;;12020:13;;11923:18;;;12042:22;;;11890:4;;12121:15;;;12095:2;12080:18;;;11890:4;12164:192;12178:6;12175:1;12172:13;12164:192;;;12227:49;12272:3;12263:6;12257:13;7803:12;;7817:42;7799:61;7787:74;;7910:4;7899:16;;;7893:23;7877:14;;7870:47;7722:201;12227:49;12343:2;12331:15;;;;;12305:2;12296:12;;;;;12200:1;12193:9;12164:192;;;-1:-1:-1;12373:3:1;;11690:692;-1:-1:-1;;;;;11690:692:1:o;12387:389::-;12469:8;12479:6;12533:3;12526:4;12518:6;12514:17;12510:27;12500:55;;12551:1;12548;12541:12;12500:55;-1:-1:-1;12574:20:1;;12617:18;12606:30;;12603:50;;;12649:1;12646;12639:12;12603:50;12686:4;12678:6;12674:17;12662:29;;12749:3;12742:4;12734;12726:6;12722:17;12714:6;12710:30;12706:41;12703:50;12700:70;;;12766:1;12763;12756:12;12781:156;12847:20;;12907:4;12896:16;;12886:27;;12876:55;;12927:1;12924;12917:12;12942:1491;13013:5;13066:3;13059:4;13051:6;13047:17;13043:27;13033:55;;13084:1;13081;13074:12;13033:55;13124:6;13111:20;13151:72;13167:55;13215:6;13167:55;:::i;13151:72::-;13247:3;13271:6;13266:3;13259:19;13303:4;13298:3;13294:14;13287:21;;13367:4;13359;13351:6;13347:17;13339:6;13335:30;13331:41;13317:55;;13395:3;13387:6;13384:15;13381:35;;;13412:1;13409;13402:12;13381:35;13448:4;13440:6;13436:17;13462:940;13478:6;13473:3;13470:15;13462:940;;;13556:4;13550:3;13545;13541:13;13537:24;13534:44;;;13574:1;13571;13564:12;13534:44;13604:22;;:::i;:::-;13667:3;13654:17;13684:41;13717:7;13684:41;:::i;:::-;13738:22;;13835:4;13826:14;;;13813:28;13861:16;;;13854:33;13962:2;13953:12;;;13940:26;13986:14;;;13979:31;14046:30;14072:2;14063:12;;14046:30;:::i;:::-;14041:2;14030:14;;14023:54;14152:3;14143:13;;;14130:27;14177:15;;;14170:32;14277:3;14268:13;;;14255:27;14302:15;;;14295:32;14340:18;;14387:4;14378:14;;;;13504:4;13495:14;13462:940;;;-1:-1:-1;14420:7:1;12942:1491;-1:-1:-1;;;;;12942:1491:1:o;14438:1727::-;14697:6;14705;14713;14721;14729;14737;14745;14753;14761;14769;14777:7;14831:3;14819:9;14810:7;14806:23;14802:33;14799:53;;;14848:1;14845;14838:12;14799:53;14871:29;14890:9;14871:29;:::i;:::-;14861:39;;14951:2;14940:9;14936:18;14923:32;14978:18;14970:6;14967:30;14964:50;;;15010:1;15007;15000:12;14964:50;15049:89;15130:7;15121:6;15110:9;15106:22;15049:89;:::i;:::-;15157:8;;-1:-1:-1;15023:115:1;-1:-1:-1;;15245:2:1;15230:18;;15217:32;15274:18;15261:32;;15258:52;;;15306:1;15303;15296:12;15258:52;15345:60;15397:7;15386:8;15375:9;15371:24;15345:60;:::i;:::-;15424:8;;-1:-1:-1;15319:86:1;-1:-1:-1;;15528:2:1;15513:18;;15500:32;;-1:-1:-1;15575:39:1;15609:3;15594:19;;15575:39;:::i;:::-;15565:49;;15667:3;15656:9;15652:19;15639:33;15697:18;15687:8;15684:32;15681:52;;;15729:1;15726;15719:12;15681:52;15768:60;15820:7;15809:8;15798:9;15794:24;15768:60;:::i;:::-;15847:8;;-1:-1:-1;15742:86:1;-1:-1:-1;;15935:3:1;15920:19;;15907:33;15965:18;15952:32;;15949:52;;;15997:1;15994;15987:12;15949:52;16020:80;16092:7;16081:8;16070:9;16066:24;16020:80;:::i;:::-;16010:90;;;16120:39;16154:3;16143:9;16139:19;16120:39;:::i;:::-;16109:50;;14438:1727;;;;;;;;;;;;;;:::o;16352:808::-;16454:6;16462;16470;16478;16486;16494;16547:3;16535:9;16526:7;16522:23;16518:33;16515:53;;;16564:1;16561;16554:12;16515:53;16603:9;16590:23;16622:39;16655:5;16622:39;:::i;:::-;16680:5;-1:-1:-1;16758:2:1;16743:18;;16730:32;;-1:-1:-1;16861:2:1;16846:18;;16833:32;;-1:-1:-1;16910:36:1;16942:2;16927:18;;16910:36;:::i;:::-;16352:808;;;;-1:-1:-1;16352:808:1;;17019:3;17004:19;;16991:33;;17123:3;17108:19;;;17095:33;;-1:-1:-1;16352:808:1;-1:-1:-1;;16352:808:1:o;17165:706::-;17294:6;17302;17310;17318;17371:3;17359:9;17350:7;17346:23;17342:33;17339:53;;;17388:1;17385;17378:12;17339:53;17427:9;17414:23;17446:39;17479:5;17446:39;:::i;:::-;17504:5;-1:-1:-1;17561:2:1;17546:18;;17533:32;17574:41;17533:32;17574:41;:::i;:::-;17634:7;-1:-1:-1;17693:2:1;17678:18;;17665:32;17706:41;17665:32;17706:41;:::i;:::-;17766:7;-1:-1:-1;17792:73:1;17857:7;17852:2;17837:18;;17792:73;:::i;:::-;17782:83;;17165:706;;;;;;;:::o;18241:404::-;18309:6;18317;18370:2;18358:9;18349:7;18345:23;18341:32;18338:52;;;18386:1;18383;18376:12;18338:52;18425:9;18412:23;18444:39;18477:5;18444:39;:::i;:::-;18502:5;-1:-1:-1;18559:2:1;18544:18;;18531:32;18572:41;18531:32;18572:41;:::i;:::-;18632:7;18622:17;;;18241:404;;;;;:::o;18842:993::-;19038:6;19046;19054;19062;19070;19123:3;19111:9;19102:7;19098:23;19094:33;19091:53;;;19140:1;19137;19130:12;19091:53;19179:9;19166:23;19198:39;19231:5;19198:39;:::i;:::-;19256:5;-1:-1:-1;19313:2:1;19298:18;;19285:32;19326:41;19285:32;19326:41;:::i;:::-;19386:7;-1:-1:-1;19445:2:1;19430:18;;19417:32;19458:41;19417:32;19458:41;:::i;:::-;19518:7;-1:-1:-1;19544:73:1;19609:7;19604:2;19589:18;;19544:73;:::i;:::-;19534:83;;19668:3;19657:9;19653:19;19640:33;19696:18;19688:6;19685:30;19682:50;;;19728:1;19725;19718:12;19682:50;19751:78;19821:7;19812:6;19801:9;19797:22;19751:78;:::i;:::-;19741:88;;;18842:993;;;;;;;;:::o;19840:1069::-;19962:6;19970;19978;19986;19994;20002;20055:3;20043:9;20034:7;20030:23;20026:33;20023:53;;;20072:1;20069;20062:12;20023:53;20111:9;20098:23;20130:39;20163:5;20130:39;:::i;:::-;20188:5;-1:-1:-1;20266:2:1;20251:18;;20238:32;;-1:-1:-1;20347:2:1;20332:18;;20319:32;20374:18;20363:30;;20360:50;;;20406:1;20403;20396:12;20360:50;20429:49;20470:7;20461:6;20450:9;20446:22;20429:49;:::i;:::-;20419:59;-1:-1:-1;;20551:2:1;20536:18;;20523:32;;-1:-1:-1;20633:3:1;20618:19;;20605:33;20647:41;20605:33;20647:41;:::i;:::-;20707:7;-1:-1:-1;20767:3:1;20752:19;;20739:33;20797:18;20784:32;;20781:52;;;20829:1;20826;20819:12;20781:52;20852:51;20895:7;20884:8;20873:9;20869:24;20852:51;:::i;:::-;20842:61;;;19840:1069;;;;;;;;:::o;20914:674::-;21000:6;21008;21016;21024;21077:3;21065:9;21056:7;21052:23;21048:33;21045:53;;;21094:1;21091;21084:12;21045:53;21133:9;21120:23;21152:39;21185:5;21152:39;:::i;:::-;21210:5;-1:-1:-1;21267:2:1;21252:18;;21239:32;21280:41;21239:32;21280:41;:::i;:::-;21340:7;-1:-1:-1;21420:2:1;21405:18;;21392:32;;-1:-1:-1;21502:2:1;21487:18;;21474:32;21515:41;21474:32;21515:41;:::i;:::-;20914:674;;;;-1:-1:-1;20914:674:1;;-1:-1:-1;;20914:674:1:o;21593:793::-;21690:6;21698;21706;21714;21722;21775:3;21763:9;21754:7;21750:23;21746:33;21743:53;;;21792:1;21789;21782:12;21743:53;21831:9;21818:23;21850:39;21883:5;21850:39;:::i;:::-;21908:5;-1:-1:-1;21986:2:1;21971:18;;21958:32;;-1:-1:-1;22089:2:1;22074:18;;22061:32;;-1:-1:-1;22170:2:1;22155:18;;22142:32;22197:18;22186:30;;22183:50;;;22229:1;22226;22219:12;22183:50;22268:58;22318:7;22309:6;22298:9;22294:22;22268:58;:::i;:::-;21593:793;;;;-1:-1:-1;21593:793:1;;-1:-1:-1;22345:8:1;;22242:84;21593:793;-1:-1:-1;;;21593:793:1:o;22391:165::-;22461:5;22506:2;22497:6;22492:3;22488:16;22484:25;22481:45;;;22522:1;22519;22512:12;22561:1263;22727:6;22735;22743;22751;22759;22767;22775;22828:3;22816:9;22807:7;22803:23;22799:33;22796:53;;;22845:1;22842;22835:12;22796:53;22884:9;22871:23;22903:39;22936:5;22903:39;:::i;:::-;22961:5;-1:-1:-1;23039:2:1;23024:18;;23011:32;;-1:-1:-1;23120:2:1;23105:18;;23092:32;23147:18;23136:30;;23133:50;;;23179:1;23176;23169:12;23133:50;23202:49;23243:7;23234:6;23223:9;23219:22;23202:49;:::i;:::-;23192:59;-1:-1:-1;;23324:2:1;23309:18;;23296:32;;-1:-1:-1;23373:39:1;23407:3;23392:19;;23373:39;:::i;:::-;23363:49;;23465:3;23454:9;23450:19;23437:33;23495:18;23485:8;23482:32;23479:52;;;23527:1;23524;23517:12;23479:52;23550:51;23593:7;23582:8;23571:9;23567:24;23550:51;:::i;:::-;23540:61;;;23654:3;23643:9;23639:19;23626:33;23684:18;23674:8;23671:32;23668:52;;;23716:1;23713;23706:12;23668:52;23739:79;23810:7;23799:8;23788:9;23784:24;23739:79;:::i;:::-;23729:89;;;22561:1263;;;;;;;;;;:::o;23829:764::-;23964:6;23972;23980;23988;24041:3;24029:9;24020:7;24016:23;24012:33;24009:53;;;24058:1;24055;24048:12;24009:53;24098:9;24085:23;24131:18;24123:6;24120:30;24117:50;;;24163:1;24160;24153:12;24117:50;24186:69;24247:7;24238:6;24227:9;24223:22;24186:69;:::i;:::-;24176:79;-1:-1:-1;;24324:2:1;24309:18;;24296:32;;-1:-1:-1;24425:2:1;24410:18;;24397:32;;-1:-1:-1;24507:2:1;24492:18;;24479:32;24520:41;24479:32;24520:41;:::i;24598:159::-;24661:5;24706:3;24697:6;24692:3;24688:16;24684:26;24681:46;;;24723:1;24720;24713:12;24762:537;24869:6;24877;24885;24938:3;24926:9;24917:7;24913:23;24909:33;24906:53;;;24955:1;24952;24945:12;24906:53;24994:9;24981:23;25013:39;25046:5;25013:39;:::i;:::-;25071:5;-1:-1:-1;25128:2:1;25113:18;;25100:32;25141:41;25100:32;25141:41;:::i;:::-;25201:7;-1:-1:-1;25227:66:1;25285:7;25280:2;25265:18;;25227:66;:::i;:::-;25217:76;;24762:537;;;;;:::o;25741:552::-;25820:6;25828;25836;25889:2;25877:9;25868:7;25864:23;25860:32;25857:52;;;25905:1;25902;25895:12;25857:52;25944:9;25931:23;25963:39;25996:5;25963:39;:::i;:::-;26021:5;-1:-1:-1;26077:2:1;26062:18;;26049:32;26104:18;26093:30;;26090:50;;;26136:1;26133;26126:12;26090:50;26175:58;26225:7;26216:6;26205:9;26201:22;26175:58;:::i;:::-;25741:552;;26252:8;;-1:-1:-1;26149:84:1;;-1:-1:-1;;;;25741:552:1:o;26298:448::-;26395:6;26403;26456:2;26444:9;26435:7;26431:23;26427:32;26424:52;;;26472:1;26469;26462:12;26424:52;26512:9;26499:23;26545:18;26537:6;26534:30;26531:50;;;26577:1;26574;26567:12;26531:50;26616:70;26678:7;26669:6;26658:9;26654:22;26616:70;:::i;:::-;26705:8;;26590:96;;-1:-1:-1;26298:448:1;-1:-1:-1;;;;26298:448:1:o;26751:250::-;26836:1;26846:113;26860:6;26857:1;26854:13;26846:113;;;26936:11;;;26930:18;26917:11;;;26910:39;26882:2;26875:10;26846:113;;;-1:-1:-1;;26993:1:1;26975:16;;26968:27;26751:250::o;27006:329::-;27047:3;27085:5;27079:12;27112:6;27107:3;27100:19;27128:76;27197:6;27190:4;27185:3;27181:14;27174:4;27167:5;27163:16;27128:76;:::i;:::-;27249:2;27237:15;27254:66;27233:88;27224:98;;;;27324:4;27220:109;;27006:329;-1:-1:-1;;27006:329:1:o;27340:838::-;27500:4;27548:2;27537:9;27533:18;27578:2;27567:9;27560:21;27601:6;27636;27630:13;27667:6;27659;27652:22;27705:2;27694:9;27690:18;27683:25;;27767:2;27757:6;27754:1;27750:14;27739:9;27735:30;27731:39;27717:53;;27805:2;27797:6;27793:15;27826:1;27836:313;27850:6;27847:1;27844:13;27836:313;;;27939:66;27927:9;27919:6;27915:22;27911:95;27906:3;27899:108;28030:39;28062:6;28053;28047:13;28030:39;:::i;:::-;28020:49;-1:-1:-1;28104:2:1;28127:12;;;;28092:15;;;;;27872:1;27865:9;27836:313;;;-1:-1:-1;28166:6:1;;27340:838;-1:-1:-1;;;;;;27340:838:1:o;28183:1458::-;28336:6;28344;28352;28360;28368;28376;28384;28392;28400;28453:3;28441:9;28432:7;28428:23;28424:33;28421:53;;;28470:1;28467;28460:12;28421:53;28509:9;28496:23;28528:39;28561:5;28528:39;:::i;:::-;28586:5;-1:-1:-1;28664:2:1;28649:18;;28636:32;;-1:-1:-1;28745:2:1;28730:18;;28717:32;28772:18;28761:30;;28758:50;;;28804:1;28801;28794:12;28758:50;28843:58;28893:7;28884:6;28873:9;28869:22;28843:58;:::i;:::-;28920:8;;-1:-1:-1;28817:84:1;-1:-1:-1;;29008:2:1;28993:18;;28980:32;29037:18;29024:32;;29021:52;;;29069:1;29066;29059:12;29021:52;29108:72;29172:7;29161:8;29150:9;29146:24;29108:72;:::i;:::-;29199:8;;-1:-1:-1;29082:98:1;-1:-1:-1;;29286:3:1;29271:19;;29258:33;29300:41;29258:33;29300:41;:::i;:::-;29360:7;-1:-1:-1;29420:3:1;29405:19;;29392:33;29450:18;29437:32;;29434:52;;;29482:1;29479;29472:12;29434:52;29521:60;29573:7;29562:8;29551:9;29547:24;29521:60;:::i;:::-;29495:86;;29600:8;29590:18;;;29627:8;29617:18;;;28183:1458;;;;;;;;;;;:::o;29646:524::-;29723:6;29731;29739;29792:2;29780:9;29771:7;29767:23;29763:32;29760:52;;;29808:1;29805;29798:12;29760:52;29847:9;29834:23;29866:39;29899:5;29866:39;:::i;:::-;29924:5;-1:-1:-1;29981:2:1;29966:18;;29953:32;29994:41;29953:32;29994:41;:::i;:::-;29646:524;;30054:7;;-1:-1:-1;;;30134:2:1;30119:18;;;;30106:32;;29646:524::o;30175:824::-;30349:6;30357;30365;30373;30426:3;30414:9;30405:7;30401:23;30397:33;30394:53;;;30443:1;30440;30433:12;30394:53;30482:9;30469:23;30501:39;30534:5;30501:39;:::i;:::-;30559:5;-1:-1:-1;30616:2:1;30601:18;;30588:32;30629:41;30588:32;30629:41;:::i;:::-;30689:7;-1:-1:-1;30715:66:1;30773:7;30768:2;30753:18;;30715:66;:::i;:::-;30705:76;;30832:3;30821:9;30817:19;30804:33;30860:18;30852:6;30849:30;30846:50;;;30892:1;30889;30882:12;30846:50;30915:78;30985:7;30976:6;30965:9;30961:22;30915:78;:::i;:::-;30905:88;;;30175:824;;;;;;;:::o;31004:255::-;31063:6;31116:2;31104:9;31095:7;31091:23;31087:32;31084:52;;;31132:1;31129;31122:12;31084:52;31171:9;31158:23;31190:39;31223:5;31190:39;:::i;:::-;31248:5;31004:255;-1:-1:-1;;;31004:255:1:o;31264:1507::-;31456:6;31464;31472;31480;31488;31496;31504;31512;31520;31528;31581:3;31569:9;31560:7;31556:23;31552:33;31549:53;;;31598:1;31595;31588:12;31549:53;31637:9;31624:23;31656:39;31689:5;31656:39;:::i;:::-;31714:5;-1:-1:-1;31770:2:1;31755:18;;31742:32;31797:18;31786:30;;31783:50;;;31829:1;31826;31819:12;31783:50;31868:89;31949:7;31940:6;31929:9;31925:22;31868:89;:::i;:::-;31976:8;;-1:-1:-1;31842:115:1;-1:-1:-1;;32064:2:1;32049:18;;32036:32;32093:18;32080:32;;32077:52;;;32125:1;32122;32115:12;32077:52;32164:60;32216:7;32205:8;32194:9;32190:24;32164:60;:::i;:::-;32243:8;;-1:-1:-1;32138:86:1;-1:-1:-1;;32351:2:1;32336:18;;32323:32;;-1:-1:-1;32400:39:1;32434:3;32419:19;;32400:39;:::i;:::-;32390:49;;32492:3;32481:9;32477:19;32464:33;32522:18;32512:8;32509:32;32506:52;;;32554:1;32551;32544:12;32506:52;32593:60;32645:7;32634:8;32623:9;32619:24;32593:60;:::i;:::-;32672:8;;-1:-1:-1;32567:86:1;-1:-1:-1;32726:39:1;;-1:-1:-1;32760:3:1;32745:19;;32726:39;:::i;:::-;32716:49;;31264:1507;;;;;;;;;;;;;:::o;32776:641::-;32862:6;32870;32878;32886;32939:2;32927:9;32918:7;32914:23;32910:32;32907:52;;;32955:1;32952;32945:12;32907:52;33000:23;;;-1:-1:-1;33120:2:1;33105:18;;33092:32;;-1:-1:-1;33201:2:1;33186:18;;33173:32;33228:18;33217:30;;33214:50;;;33260:1;33257;33250:12;33214:50;33299:58;33349:7;33340:6;33329:9;33325:22;33299:58;:::i;:::-;32776:641;;;;-1:-1:-1;33376:8:1;-1:-1:-1;;;;32776:641:1:o;33422:182::-;33479:6;33532:2;33520:9;33511:7;33507:23;33503:32;33500:52;;;33548:1;33545;33538:12;33500:52;33571:27;33588:9;33571:27;:::i;34326:602::-;34597:42;34589:6;34585:55;34574:9;34567:74;34689:42;34681:6;34677:55;34672:2;34661:9;34657:18;34650:83;34769:6;34764:2;34753:9;34749:18;34742:34;34812:6;34807:2;34796:9;34792:18;34785:34;34856:3;34850;34839:9;34835:19;34828:32;34548:4;34877:45;34917:3;34906:9;34902:19;34894:6;34877:45;:::i;34933:184::-;34985:77;34982:1;34975:88;35082:4;35079:1;35072:15;35106:4;35103:1;35096:15;37428:192;37507:13;;37560:34;37549:46;;37539:57;;37529:85;;37610:1;37607;37600:12;37625:428;37713:6;37721;37729;37782:2;37770:9;37761:7;37757:23;37753:32;37750:52;;;37798:1;37795;37788:12;37750:52;37821:40;37851:9;37821:40;:::i;:::-;37923:2;37908:18;;37902:25;38017:2;38002:18;;;37996:25;37811:50;;37902:25;;-1:-1:-1;37996:25:1;37625:428;-1:-1:-1;;;37625:428:1:o;38409:230::-;38479:6;38532:2;38520:9;38511:7;38507:23;38503:32;38500:52;;;38548:1;38545;38538:12;38500:52;-1:-1:-1;38593:16:1;;38409:230;-1:-1:-1;38409:230:1:o;38644:325::-;38732:6;38727:3;38720:19;38784:6;38777:5;38770:4;38765:3;38761:14;38748:43;;38836:1;38829:4;38820:6;38815:3;38811:16;38807:27;38800:38;38702:3;38958:4;38888:66;38883:2;38875:6;38871:15;38867:88;38862:3;38858:98;38854:109;38847:116;;38644:325;;;;:::o;38974:629::-;39255:42;39247:6;39243:55;39232:9;39225:74;39347:42;39339:6;39335:55;39330:2;39319:9;39315:18;39308:83;39427:6;39422:2;39411:9;39407:18;39400:34;39470:6;39465:2;39454:9;39450:18;39443:34;39514:3;39508;39497:9;39493:19;39486:32;39206:4;39535:62;39592:3;39581:9;39577:19;39569:6;39561;39535:62;:::i;39608:580::-;39685:4;39691:6;39751:11;39738:25;39841:66;39830:8;39814:14;39810:29;39806:102;39786:18;39782:127;39772:155;;39923:1;39920;39913:12;39772:155;39950:33;;40002:20;;;-1:-1:-1;40045:18:1;40034:30;;40031:50;;;40077:1;40074;40067:12;40031:50;40110:4;40098:17;;-1:-1:-1;40141:14:1;40137:27;;;40127:38;;40124:58;;;40178:1;40175;40168:12;40193:160;40259:20;;40319:1;40308:20;;;40298:31;;40288:59;;40343:1;40340;40333:12;40454:1670;40646:3;40631:19;;40659:57;40635:9;40678:26;40697:6;40678:26;:::i;:::-;7667:42;7656:54;7644:67;;7590:127;40659:57;40745:37;40776:4;40768:6;40764:17;40745:37;:::i;:::-;7667:42;7656:54;40839:4;40824:20;;7644:67;40876:35;40905:4;40893:17;;40876:35;:::i;:::-;40920:54;40968:4;40957:9;40953:20;40937:14;40433:1;40422:20;40410:33;;40358:91;40920:54;;41005:35;41034:4;41026:6;41022:17;41005:35;:::i;:::-;41049:54;41097:4;41086:9;41082:20;41066:14;40433:1;40422:20;40410:33;;40358:91;41049:54;;41134:35;41163:4;41155:6;41151:17;41134:35;:::i;:::-;41178:54;41226:4;41215:9;41211:20;41195:14;40433:1;40422:20;40410:33;;40358:91;41178:54;-1:-1:-1;41298:4:1;41286:17;;;41273:31;41320:20;;;41313:35;41418:4;41406:17;;;41393:31;41440:20;;;41433:37;41540:4;41528:17;;;41515:31;41562:20;;;41555:37;41662:6;41650:19;;;41637:33;41686:22;;;41679:39;41749;41780:6;41768:19;;41749:39;:::i;:::-;7667:42;7656:54;41847:6;41832:22;;7644:67;41925:6;41913:19;;;41900:33;41949:22;;;41942:39;42012;42043:6;42031:19;;42012:39;:::i;:::-;7667:42;7656:54;;42110:6;42095:22;;7644:67;42060:58;7590:127;42129:542;42226:6;42234;42242;42250;42303:3;42291:9;42282:7;42278:23;42274:33;42271:53;;;42320:1;42317;42310:12;42271:53;42365:16;;;-1:-1:-1;42424:49:1;42469:2;42454:18;;42424:49;:::i;:::-;42539:2;42524:18;;42518:25;42635:2;42620:18;;;42614:25;42129:542;;42414:59;;-1:-1:-1;42129:542:1;-1:-1:-1;;;42129:542:1:o;42676:244::-;42833:2;42822:9;42815:21;42796:4;42853:61;42910:2;42899:9;42895:18;42887:6;42879;42853:61;:::i;42925:259::-;42995:6;43048:2;43036:9;43027:7;43023:23;43019:32;43016:52;;;43064:1;43061;43054:12;43016:52;43096:9;43090:16;43115:39;43148:5;43115:39;:::i;43189:271::-;43372:6;43364;43359:3;43346:33;43328:3;43398:16;;43423:13;;;43398:16;43189:271;-1:-1:-1;43189:271:1:o;43465:668::-;43545:6;43598:2;43586:9;43577:7;43573:23;43569:32;43566:52;;;43614:1;43611;43604:12;43566:52;43647:9;43641:16;43680:18;43672:6;43669:30;43666:50;;;43712:1;43709;43702:12;43666:50;43735:22;;43788:4;43780:13;;43776:27;-1:-1:-1;43766:55:1;;43817:1;43814;43807:12;43766:55;43850:2;43844:9;43875:52;43891:35;43919:6;43891:35;:::i;43875:52::-;43950:6;43943:5;43936:21;43998:7;43993:2;43984:6;43980:2;43976:15;43972:24;43969:37;43966:57;;;44019:1;44016;44009:12;43966:57;44032:71;44096:6;44091:2;44084:5;44080:14;44075:2;44071;44067:11;44032:71;:::i;:::-;44122:5;43465:668;-1:-1:-1;;;;;43465:668:1:o;44138:219::-;44287:2;44276:9;44269:21;44250:4;44307:44;44347:2;44336:9;44332:18;44324:6;44307:44;:::i;46445:184::-;46497:77;46494:1;46487:88;46594:4;46591:1;46584:15;46618:4;46615:1;46608:15;46634:128;46701:9;;;46722:11;;;46719:37;;;46736:18;;:::i;46767:619::-;47016:3;47005:9;46998:22;46979:4;47043:45;47083:3;47072:9;47068:19;47060:6;47043:45;:::i;:::-;47136:42;47128:6;47124:55;47119:2;47108:9;47104:18;47097:83;47228:42;47220:6;47216:55;47211:2;47200:9;47196:18;47189:83;47320:9;47312:6;47308:22;47303:2;47292:9;47288:18;47281:50;47348:32;47373:6;47365;47348:32;:::i;47391:630::-;47460:5;47508:4;47496:9;47491:3;47487:19;47483:30;47480:50;;;47526:1;47523;47516:12;47480:50;47579:4;47573:11;;;47611:17;;47658:18;47643:34;;47679:22;;;47640:62;47637:88;;;47705:18;;:::i;:::-;47747:10;47741:4;47734:24;;47776:6;47767:15;;47812:9;47806:16;47831:41;47864:7;47831:41;:::i;:::-;47881:23;;47970:2;47955:18;;;47949:25;47990:15;;47983:32;;;;47391:630;;-1:-1:-1;47391:630:1:o;48026:257::-;48125:6;48178:2;48166:9;48157:7;48153:23;48149:32;48146:52;;;48194:1;48191;48184:12;48146:52;48217:60;48269:7;48258:9;48217:60;:::i;48590:1013::-;48955:42;48947:6;48943:55;48932:9;48925:74;49049:6;49042:14;49035:22;49030:2;49019:9;49015:18;49008:50;49094:6;49089:2;49078:9;49074:18;49067:34;49149:42;49141:6;49137:55;49132:2;49121:9;49117:18;49110:83;49230:3;49224;49213:9;49209:19;49202:32;48906:4;49257:45;49297:3;49286:9;49282:19;49274:6;49257:45;:::i;:::-;49351:42;49343:6;49339:55;49333:3;49322:9;49318:19;49311:84;49444:42;49436:6;49432:55;49426:3;49415:9;49411:19;49404:84;49537:9;49529:6;49525:22;49519:3;49508:9;49504:19;49497:51;49565:32;49590:6;49582;49565:32;:::i;49608:341::-;49685:6;49693;49746:2;49734:9;49725:7;49721:23;49717:32;49714:52;;;49762:1;49759;49752:12;49714:52;-1:-1:-1;;49807:16:1;;49913:2;49898:18;;;49892:25;49807:16;;49892:25;;-1:-1:-1;49608:341:1:o;49954:191::-;49989:3;50020:66;50013:5;50010:77;50007:103;;50090:18;;:::i;:::-;-1:-1:-1;50130:1:1;50126:13;;49954:191::o;50150:125::-;50215:9;;;50236:10;;;50233:36;;;50249:18;;:::i;50702:245::-;50769:6;50822:2;50810:9;50801:7;50797:23;50793:32;50790:52;;;50838:1;50835;50828:12;50790:52;50870:9;50864:16;50889:28;50911:5;50889:28;:::i;50952:646::-;51211:3;51200:9;51193:22;51174:4;51238:45;51278:3;51267:9;51263:19;51255:6;51238:45;:::i;:::-;51331:42;51323:6;51319:55;51314:2;51303:9;51299:18;51292:83;51423:42;51415:6;51411:55;51406:2;51395:9;51391:18;51384:83;51515:9;51507:6;51503:22;51498:2;51487:9;51483:18;51476:50;51543:49;51585:6;51577;51569;51543:49;:::i;51603:959::-;51727:6;51780:2;51768:9;51759:7;51755:23;51751:32;51748:52;;;51796:1;51793;51786:12;51748:52;51829:9;51823:16;51862:18;51854:6;51851:30;51848:50;;;51894:1;51891;51884:12;51848:50;51917:22;;51970:4;51962:13;;51958:27;-1:-1:-1;51948:55:1;;51999:1;51996;51989:12;51948:55;52032:2;52026:9;52055:72;52071:55;52119:6;52071:55;:::i;52055:72::-;52149:3;52173:6;52168:3;52161:19;52205:2;52200:3;52196:12;52189:19;;52260:2;52250:6;52247:1;52243:14;52239:2;52235:23;52231:32;52217:46;;52286:7;52278:6;52275:19;52272:39;;;52307:1;52304;52297:12;52272:39;52339:2;52335;52331:11;52320:22;;52351:181;52367:6;52362:3;52359:15;52351:181;;;52435:54;52481:7;52476:3;52435:54;:::i;:::-;52430:3;52423:67;52519:2;52514:3;52510:12;52503:19;;52393:4;52388:3;52384:14;52377:21;;52351:181;;52567:651;52654:6;52714:2;52702:9;52693:7;52689:23;52685:32;52729:2;52726:22;;;52744:1;52741;52734:12;52726:22;-1:-1:-1;52786:22:1;;:::i;:::-;52845:9;52832:23;52864:41;52897:7;52864:41;:::i;:::-;52914:22;;53009:2;52994:18;;;52981:32;53029:14;;;53022:31;53105:2;53090:18;;53077:32;53118:30;53077:32;53118:30;:::i;:::-;53175:2;53164:14;;53157:31;53168:5;52567:651;-1:-1:-1;;;52567:651:1:o;53223:673::-;53492:3;53481:9;53474:22;53455:4;53519:62;53576:3;53565:9;53561:19;53553:6;53545;53519:62;:::i;:::-;53629:42;53621:6;53617:55;53612:2;53601:9;53597:18;53590:83;53721:42;53713:6;53709:55;53704:2;53693:9;53689:18;53682:83;53813:9;53805:6;53801:22;53796:2;53785:9;53781:18;53774:50;53841:49;53883:6;53875;53867;53841:49;:::i;:::-;53833:57;53223:673;-1:-1:-1;;;;;;;;;53223:673:1:o;53901:287::-;54030:3;54068:6;54062:13;54084:66;54143:6;54138:3;54131:4;54123:6;54119:17;54084:66;:::i;:::-;54166:16;;;;;53901:287;-1:-1:-1;;53901:287:1:o

Swarm Source

ipfs://0ba9d751058e78741e949b91cc9ca6682bd0d70ca75bbaaa56d9d49f4bbcb922

Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.