ETH Price: $3,076.61 (-0.87%)

Contract

0x9eCF0e6E96CcF8dE78FBC10fF475983810662327
 

Overview

ETH Balance

2.057802122593097226 ETH

Eth Value

$6,331.05 (@ $3,076.61/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve191624352024-02-05 13:41:47286 days ago1707140507IN
0x9eCF0e6E...810662327
0 ETH0.0005514322.76487316
Transfer172098642023-05-07 16:30:59560 days ago1683477059IN
0x9eCF0e6E...810662327
0 ETH0.00474372134.57000062
Transfer172098582023-05-07 16:29:47560 days ago1683476987IN
0x9eCF0e6E...810662327
0 ETH0.00484259137.3746914
Transfer172098522023-05-07 16:28:35560 days ago1683476915IN
0x9eCF0e6E...810662327
0 ETH0.0093997126.56467157
Approve171986262023-05-06 2:35:23562 days ago1683340523IN
0x9eCF0e6E...810662327
0 ETH0.00483304104.67715159
Approve164350142023-01-18 16:54:11669 days ago1674060851IN
0x9eCF0e6E...810662327
0 ETH0.0045497797.8298732
Transfer164350002023-01-18 16:51:23669 days ago1674060683IN
0x9eCF0e6E...810662327
0 ETH0.0061762102.14851129
Set Is Max Exemp...164349952023-01-18 16:50:23669 days ago1674060623IN
0x9eCF0e6E...810662327
0 ETH0.00514803110.90127062
Set Is Fee Exemp...164349942023-01-18 16:50:11669 days ago1674060611IN
0x9eCF0e6E...810662327
0 ETH0.00515086110.9073485
Transfer164349842023-01-18 16:48:11669 days ago1674060491IN
0x9eCF0e6E...810662327
0 ETH0.003192990.08574925
Approve164349822023-01-18 16:47:47669 days ago1674060467IN
0x9eCF0e6E...810662327
0 ETH0.0033466471.96002421
Approve159655142022-11-14 3:13:35735 days ago1668395615IN
0x9eCF0e6E...810662327
0 ETH0.0005957912.81096335
Approve159360362022-11-10 0:27:23739 days ago1668040043IN
0x9eCF0e6E...810662327
0 ETH0.0023749251.065987
Approve157311152022-10-12 9:24:11768 days ago1665566651IN
0x9eCF0e6E...810662327
0 ETH0.0006839214.70591734
Approve157012192022-10-08 5:16:23772 days ago1665206183IN
0x9eCF0e6E...810662327
0 ETH0.000261515.6231437
Approve157004192022-10-08 2:35:23772 days ago1665196523IN
0x9eCF0e6E...810662327
0 ETH0.00031916.86136221
Approve157000412022-10-08 1:19:11772 days ago1665191951IN
0x9eCF0e6E...810662327
0 ETH0.000315826.79083586
Transfer156999912022-10-08 1:09:11772 days ago1665191351IN
0x9eCF0e6E...810662327
0 ETH0.000427235.73773318
Approve156968202022-10-07 14:28:23772 days ago1665152903IN
0x9eCF0e6E...810662327
0 ETH0.0006337613.62727134
Approve156917052022-10-06 21:20:23773 days ago1665091223IN
0x9eCF0e6E...810662327
0 ETH0.0005036310.82916645
Approve156749082022-10-04 12:55:59776 days ago1664888159IN
0x9eCF0e6E...810662327
0 ETH0.0004953910.65490328
Approve156741552022-10-04 10:23:59776 days ago1664879039IN
0x9eCF0e6E...810662327
0 ETH0.000340997.33216082
Approve156686672022-10-03 15:57:47776 days ago1664812667IN
0x9eCF0e6E...810662327
0 ETH0.0012131626.08562009
Approve156570672022-10-02 1:07:23778 days ago1664672843IN
0x9eCF0e6E...810662327
0 ETH0.000173013.72027885
Approve156516662022-10-01 6:57:59779 days ago1664607479IN
0x9eCF0e6E...810662327
0 ETH0.000326487.02020016
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.0000406 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00000893 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00001766 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00001766 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00001766 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00003552 ETH
164350362023-01-18 16:58:35669 days ago1674061115
0x9eCF0e6E...810662327
0.00203007 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00006867 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.0000151 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00002987 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00002987 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00002987 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00006008 ETH
161639892022-12-11 20:55:35707 days ago1670792135
0x9eCF0e6E...810662327
0.00343356 ETH
161211882022-12-05 21:11:59713 days ago1670274719
0x9eCF0e6E...810662327
0.00023164 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MERGEPOOL

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-23
*/

/*

Website: https://mergepool.io
Telegram: https://t.me/MERGEPOOL
Medium: https://medium.com/@mergepool/intro-to-mergepool-73184a2c6414

Twitter: https://twitter.com/mergepool_eth

*/


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface INetwork {
    function increaseShare(address _shareholder, uint256 _unlocks) external;
    function decreaseShare(address _shareholder) external;

    function deposit() external payable;

    function distributeDividend(address _shareholder) external;
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

library Types {
    struct FeeRecipients {
        address operations;
        address validatorAcquisition;
        address PCR;
        address yield;
        address xChainValidatorAcquisition;
        address indexFundPools;
        address sBANKRewardsPool;
        address OTCSwap;
        address rescueFund;
        address protocolImprovement;
        address developers;
    }

    struct Fees {
        uint16 operations;
        uint16 validatorAcquisition;
        uint16 PCR;
        uint16 yield;
        uint16 xChainValidatorAcquisition;
        uint16 indexFundPools;
        uint16 sBANKRewardsPool;
        uint16 OTCSwap;
        uint16 rescueFund;
        uint16 protocolImprovement;
        uint16 developers;
    }

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
        uint256 started;
        uint256 unlocks;
    }

    enum MergedProduct {
        None,
        OneYear,
        ThreeYears,
        FiveYears
    }

    struct MergeNode {
        MergedProduct mergedProduct;
        address minter;
        uint256 created;
        uint256 expires;
        uint256 numClaims;
        uint256 lastClaimed;
        uint256 merged;
        uint256 unlocks;
        uint256 lastMergedClaimed;
    }

    struct MergePoolFeeRecipients {
        address operations;
        address validatorAcquisition;
        address developers;
    }
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0, address indexed token1, address pair, uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        returns (uint256 amountETH);

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

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

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

interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

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

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

    /**
     * @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() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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);
    }
}


interface IMergePool is IERC20 {
    function burnForMergeNode(address _burnee, uint256 _amount) external returns (bool);
}

contract MergedPool is INetwork, Ownable {
    address immutable token;
    uint256 immutable duration;

    address[] shareholders;
    mapping(address => uint256) shareholderIndexes;
    mapping(address => uint256) shareholderClaims;
    mapping(address => uint256) public totalRewardsToUser;
    mapping(address => Types.Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10**36;

    modifier onlyToken() {
        require(msg.sender == token);
        _;
    }

    constructor(address _owner, uint256 _duration) {
        _transferOwnership(_owner);

        token = msg.sender;
        duration = _duration;
    }

    function increaseShare(address _shareholder, uint256 _unlocks) external override onlyToken {
        if (shares[_shareholder].amount == 0) {
            addShareholder(_shareholder);
        }

        totalShares++;
        shares[_shareholder].amount++;
        shares[_shareholder].unlocks = _unlocks;
        shares[_shareholder].started = block.timestamp;
        shares[_shareholder].totalExcluded = getCumulativeDividends(
            shares[_shareholder].amount,
            shares[_shareholder].started,
            shares[_shareholder].unlocks
        );
        assert(shares[_shareholder].totalExcluded == 0);
    }

    function decreaseShare(address _shareholder) external override onlyToken {
        if (shares[_shareholder].amount == 1) {
            removeShareholder(_shareholder);
        }

        totalShares--;
        shares[_shareholder].totalExcluded = getCumulativeDividends(
            shares[_shareholder].amount,
            shares[_shareholder].started,
            shares[_shareholder].started
        );
        shares[_shareholder].amount--;
        shares[_shareholder].started = 0;
        shares[_shareholder].unlocks = 0;
    }

    function deposit() external payable override onlyOwner {
        uint256 amount = msg.value;
        totalDividends += amount;
        dividendsPerShare += (dividendsPerShareAccuracyFactor * amount) / totalShares;
    }

    function distributeDividend(address _shareholder) external onlyToken {
        uint256 amount = getPendingDividend(_shareholder);

        if (amount > 0) {
            shares[_shareholder].totalExcluded = getCumulativeDividends(
                shares[_shareholder].amount,
                shares[_shareholder].started,
                shares[_shareholder].unlocks
            );
            shares[_shareholder].totalRealised += amount;
            totalDistributed += amount;

            (bool success, ) = _shareholder.call{value: amount}("");
            require(success, "Could not send ETH");

            totalRewardsToUser[_shareholder] = totalRewardsToUser[_shareholder] + amount;
        }
    }

    function getPendingDividend(address _shareholder) public view returns (uint256) {
        if (shares[_shareholder].amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeDividends(
            shares[_shareholder].amount,
            shares[_shareholder].started,
            shares[_shareholder].unlocks
        );
        uint256 shareholderTotalExcluded = shares[_shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) {
            return 0;
        }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

    function getCumulativeDividends(
        uint256 share,
        uint256 started,
        uint256 unlocks
    ) internal view returns (uint256) {
        if (unlocks > block.timestamp) {
            unlocks = block.timestamp;
        }

        uint256 total = (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;

        uint256 end = started + duration;
        uint256 endAbs = end - started;
        uint256 nowAbs = unlocks - started;

        return (total * nowAbs) / endAbs;
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function withdrawETH(address _recipient) external onlyOwner {
        (bool success, ) = _recipient.call{value: address(this).balance}("");
        require(success, "Could not send ETH");
    }

    function withdrawToken(IERC20 _token, address _recipient) external onlyOwner {
        _token.transfer(_recipient, _token.balanceOf(address(this)));
    }
}

contract MergePoolNode is Ownable, ReentrancyGuard {
    uint16 public maxMonths = 6;
    uint16 public maxNodesPerMinter = 96;
    uint256 public gracePeriod = 30 days;
    uint256 public gammaPeriod = 72 days;
    uint256 public mergedWaitPeriod = 90 days;

    uint256 public totalMergeNodes = 0;
    mapping(uint256 => Types.MergeNode) public mergenodes;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(uint256 => uint256)) public ownedMergeNodes;
    mapping(uint256 => uint256) public ownedMergeNodesIndex;

    mapping(Types.MergedProduct => uint256) public mergedLockDurations;
    mapping(Types.MergedProduct => MergedPool) public mergedPools;
    mapping(Types.MergedProduct => uint256) public boosts;

    uint256 public creationFee = 0;
    uint256 public renewalFee = 0.006 ether;
    uint256 public mergedFee = 0.007 ether;
    uint256 public mintPrice = 80e18;

    uint256[20] public rates = [
        700000000000,
        595000000000,
        505750000000,
        429887500000,
        365404375000,
        310593718750,
        264004660937,
        224403961797,
        190743367527,
        162131862398,
        137812083039,
        117140270583,
        99569229995,
        84633845496,
        71938768672,
        61147953371,
        51975760365,
        44179396311,
        37552486864,
        31919613834
    ];

    IMergePool public immutable mergepool;
    IUniswapV2Router02 public immutable router;
    IERC20 public immutable USDC;

    Types.MergePoolFeeRecipients public feeRecipients;

    uint16 public claimFee = 600;
    // Basis for above fee values
    uint16 public constant bps = 10_000;

    constructor(
        IMergePool _mergepool,
        IUniswapV2Router02 _router,
        IERC20 _usdc,
        address _owner
    ) {
        transferOwnership(_owner);
        mergepool = _mergepool;
        router = _router;
        USDC = _usdc;

        feeRecipients = Types.MergePoolFeeRecipients(
            0x0BC88F44498e4ae2F921C08b51b37ED0796c3d35,
            0x86fe4d39B585bE32CDd892754234d95e18f3E3C0,
            0xEE355B7D88907aAbb60599ACcf04934EbC998457
        );

        mergedLockDurations[Types.MergedProduct.OneYear] = 365 days;
        mergedLockDurations[Types.MergedProduct.ThreeYears] = 365 days * 3;
        mergedLockDurations[Types.MergedProduct.FiveYears] = 365 days * 5;

        mergedPools[Types.MergedProduct.OneYear] = new MergedPool(_owner, 365 days);
        mergedPools[Types.MergedProduct.ThreeYears] = new MergedPool(_owner, 365 days * 3);
        mergedPools[Types.MergedProduct.FiveYears] = new MergedPool(_owner, 365 days * 5);

        boosts[Types.MergedProduct.OneYear] = 8e18;
        boosts[Types.MergedProduct.ThreeYears] = 50e18;
        boosts[Types.MergedProduct.FiveYears] = 150e18;
    }

    function createNode(uint256 _months) external payable nonReentrant returns (uint256) {
        require(msg.value == getRenewalFeeForMonths(_months) + creationFee, "Invalid Ether value provided");
        return _createNode(_months);
    }

    function createNodeBatch(uint256 _amount, uint256 _months)
        external
        payable
        nonReentrant
        returns (uint256[] memory ids)
    {
        require(msg.value == (getRenewalFeeForMonths(_months) + creationFee) * _amount, "Invalid Ether value provided");
        ids = new uint256[](_amount);
        for (uint256 i = 0; i < _amount; ) {
            ids[i] = _createNode(_months);
            unchecked {
                ++i;
            }
        }
        return ids;
    }

    function _createNode(uint256 _months) internal returns (uint256) {
        require(balanceOf[msg.sender] < maxNodesPerMinter, "Too many mergenodes");
        require(_months > 0 && _months <= maxMonths, "Must be 1-6 months");

        require(mergepool.burnForMergeNode(msg.sender, mintPrice), "Not able to burn");

        (bool success, ) = feeRecipients.validatorAcquisition.call{
            value: getRenewalFeeForMonths(_months) + creationFee
        }("");
        require(success, "Could not send ETH");

        uint256 id;
        uint256 length;
        unchecked {
            id = totalMergeNodes++;
            length = balanceOf[msg.sender]++;
        }

        mergenodes[id] = Types.MergeNode(
            Types.MergedProduct.None,
            msg.sender,
            block.timestamp,
            block.timestamp + 30 days * _months,
            0,
            0,
            0,
            0,
            0
        );
        ownedMergeNodes[msg.sender][length] = id;
        ownedMergeNodesIndex[id] = length;

        return id;
    }

    function renewNode(uint256 _id, uint256 _months) external payable nonReentrant {
        require(msg.value == getRenewalFeeForMonths(_months), "Invalid Ether value provided");
        _renewNode(_id, _months);
    }

    function renewNodeBatch(uint256[] calldata _ids, uint256 _months) external payable nonReentrant {
        uint256 length = _ids.length;
        require(msg.value == (getRenewalFeeForMonths(_months)) * length, "Invalid Ether value provided");
        for (uint256 i = 0; i < length; ) {
            _renewNode(_ids[i], _months);
            unchecked {
                ++i;
            }
        }
    }

    function _renewNode(uint256 _id, uint256 _months) internal {
        Types.MergeNode storage mergenode = mergenodes[_id];

        require(mergenode.minter == msg.sender, "Invalid ownership");
        require(mergenode.expires + gracePeriod >= block.timestamp, "Grace period expired");

        uint256 monthsLeft = 0;
        if (block.timestamp > mergenode.expires) {
            monthsLeft = (block.timestamp - mergenode.created) / 30 days;
        }
        require(_months + monthsLeft <= maxMonths, "Too many months");

        (bool success, ) = feeRecipients.validatorAcquisition.call{value: getRenewalFeeForMonths(_months)}("");
        require(success, "Could not send ETH");

        mergenode.expires += 30 days * _months;
    }

    function mergedNode(uint256 _id, Types.MergedProduct mergedProduct) external payable nonReentrant {
        Types.MergeNode storage mergenode = mergenodes[_id];

        require(mergenode.minter == msg.sender, "Invalid ownership");
        require(mergenode.mergedProduct == Types.MergedProduct.None, "Already merged");
        require(mergenode.expires > block.timestamp, "Node expired");

        require(msg.value == mergedFee, "Invalid Ether value provided");

        (bool success, ) = feeRecipients.validatorAcquisition.call{value: msg.value}("");
        require(success, "Could not send ETH");

        INetwork network = mergedPools[mergedProduct];
        network.increaseShare(msg.sender, block.timestamp + mergedLockDurations[mergedProduct]);

        mergenode.mergedProduct = mergedProduct;
        mergenode.merged = block.timestamp;
        mergenode.unlocks = block.timestamp + mergedLockDurations[mergedProduct];
    }

    function claimMERGE(uint256 _id) external nonReentrant {
        _claimMERGE(_id);
    }

    function claimMERGEBatch(uint256[] calldata _ids) external nonReentrant {
        uint256 length = _ids.length;
        for (uint256 i = 0; i < length; ) {
            _claimMERGE(_ids[i]);
            unchecked {
                ++i;
            }
        }
    }

    function _claimMERGE(uint256 _id) internal {
        Types.MergeNode storage mergenode = mergenodes[_id];
        require(mergenode.minter == msg.sender, "Invalid ownership");
        require(mergenode.mergedProduct == Types.MergedProduct.None, "Must be unmerged");
        require(mergenode.expires > block.timestamp, "Node expired");

        uint256 amount = getPendingMERGE(_id);
        amount = takeClaimFee(amount);
        mergepool.transfer(msg.sender, amount);

        mergenode.numClaims++;
        mergenode.lastClaimed = block.timestamp;
    }

    function claimETH(uint256 _id) external nonReentrant {
        _claimETH(_id);
    }

    function claimETHBatch(uint256[] calldata _ids) external nonReentrant {
        uint256 length = _ids.length;
        for (uint256 i = 0; i < length; ) {
            _claimETH(_ids[i]);
            unchecked {
                ++i;
            }
        }
    }

    function _claimETH(uint256 _id) internal {
        Types.MergeNode storage mergenode = mergenodes[_id];
        require(mergenode.minter == msg.sender, "Invalid ownership");
        require(mergenode.mergedProduct != Types.MergedProduct.None, "Must be merged");
        require(mergenode.expires > block.timestamp, "Node expired");
        require(block.timestamp - mergenode.merged > mergedWaitPeriod, "Cannot claim ETH yet");

        mergedPools[mergenode.mergedProduct].distributeDividend(msg.sender);

        if (mergenode.unlocks <= block.timestamp) {
            require(mergepool.transfer(msg.sender, boosts[mergenode.mergedProduct]));

            mergedPools[mergenode.mergedProduct].decreaseShare(mergenode.minter);
            mergenode.mergedProduct = Types.MergedProduct.None;
            mergenode.merged = 0;
            mergenode.unlocks = 0;
        }
    }

    function getPendingMERGE(uint256 _id) public view returns (uint256) {
        Types.MergeNode memory mergenode = mergenodes[_id];

        uint256 rate = mergenode.numClaims >= rates.length ? rates[rates.length - 1] : rates[mergenode.numClaims];
        uint256 amount = (block.timestamp - (mergenode.numClaims > 0 ? mergenode.lastClaimed : mergenode.created)) *
            (rate);
        if (mergenode.created < block.timestamp + gammaPeriod) {
            uint256 _seconds = (block.timestamp + gammaPeriod) - mergenode.created;
            uint256 _percent = 100;
            if (_seconds >= 4838400) {
                _percent = 900;
            } else if (_seconds >= 4233600) {
                _percent = 800;
            } else if (_seconds >= 3628800) {
                _percent = 700;
            } else if (_seconds >= 3024000) {
                _percent = 600;
            } else if (_seconds >= 2419200) {
                _percent = 500;
            } else if (_seconds >= 1814400) {
                _percent = 400;
            } else if (_seconds >= 1209600) {
                _percent = 300;
            } else if (_seconds >= 604800) {
                _percent = 200;
            }
            uint256 _divisor = amount * _percent;
            (, uint256 result) = tryDiv(_divisor, 10000);
            amount -= result;
        }

        return amount;
    }

    function takeClaimFee(uint256 amount) internal returns (uint256) {
        uint256 fee = (amount * claimFee) / bps;

        address[] memory path = new address[](2);
        path[0] = address(mergepool);
        path[1] = address(USDC);
        router.swapExactTokensForTokensSupportingFeeOnTransferTokens(fee, 0, path, address(this), block.timestamp);

        uint256 usdcToSend = USDC.balanceOf(address(this)) / 2;

        USDC.transfer(feeRecipients.operations, usdcToSend);
        USDC.transfer(feeRecipients.developers, usdcToSend);

        return amount - fee;
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) {
                return (false, 0);
            }
            return (true, a / b);
        }
    }

    function getRenewalFeeForMonths(uint256 _months) public view returns (uint256) {
        return renewalFee * _months;
    }

    function airdropmergenodes(
        address[] calldata _users,
        uint256[] calldata _months,
        Types.MergedProduct[] calldata _mergedProducts
    ) external onlyOwner returns (uint256[] memory ids) {
        require(_users.length == _months.length && _months.length == _mergedProducts.length, "Lengths not aligned");

        uint256 length = _users.length;
        ids = new uint256[](length);
        for (uint256 i = 0; i < length; ) {
            ids[i] = _airdropNode(_users[i], _months[i], _mergedProducts[i]);
            unchecked {
                ++i;
            }
        }

        return ids;
    }

    function _airdropNode(
        address _user,
        uint256 _months,
        Types.MergedProduct _mergedProduct
    ) internal returns (uint256) {
        require(_months <= maxMonths, "Too many months");

        uint256 id;
        uint256 length;
        unchecked {
            id = totalMergeNodes++;
            length = balanceOf[_user]++;
        }

        uint256 merged;
        uint256 unlocks;

        if (_mergedProduct != Types.MergedProduct.None) {
            merged = block.timestamp;
            unlocks = block.timestamp + mergedLockDurations[_mergedProduct];
        }

        mergenodes[id] = Types.MergeNode(
            _mergedProduct,
            _user,
            block.timestamp,
            block.timestamp + 30 days * _months,
            0,
            0,
            merged,
            unlocks,
            0
        );
        ownedMergeNodes[_user][length] = id;
        ownedMergeNodesIndex[id] = length;

        return id;
    }

    function removeNode(uint256 _id) external onlyOwner {
        uint256 lastNodeIndex = balanceOf[mergenodes[_id].minter];
        uint256 mergenodeIndex = ownedMergeNodesIndex[_id];

        if (mergenodeIndex != lastNodeIndex) {
            uint256 lastNodeId = ownedMergeNodes[mergenodes[_id].minter][lastNodeIndex];

            ownedMergeNodes[mergenodes[_id].minter][mergenodeIndex] = lastNodeId; // Move the last mergenode to the slot of the to-delete token
            ownedMergeNodesIndex[lastNodeId] = mergenodeIndex; // Update the moved mergenode's index
        }

        // This also deletes the contents at the last position of the array
        delete ownedMergeNodesIndex[_id];
        delete ownedMergeNodes[mergenodes[_id].minter][lastNodeIndex];

        balanceOf[mergenodes[_id].minter]--;
        totalMergeNodes--;

        delete mergenodes[_id];
    }

    function setRates(uint256[] calldata _rates) external onlyOwner {
        require(_rates.length == rates.length, "Invalid length");

        uint256 length = _rates.length;
        for (uint256 i = 0; i < length; ) {
            rates[i] = _rates[i];
            unchecked {
                ++i;
            }
        }
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMaxMonths(uint16 _maxMonths) external onlyOwner {
        maxMonths = _maxMonths;
    }

    function setFees(
        uint256 _creationFee,
        uint256 _renewalFee,
        uint256 _mergedFee,
        uint16 _claimFee
    ) external onlyOwner {
        creationFee = _creationFee;
        renewalFee = _renewalFee;
        mergedFee = _mergedFee;
        claimFee = _claimFee;
    }

    function setMergedLockDurations(Types.MergedProduct _mergedProduct, uint256 _duration) external onlyOwner {
        mergedLockDurations[_mergedProduct] = _duration;
    }

    function setMergedPool(Types.MergedProduct _mergedProduct, MergedPool _mergedPool) external onlyOwner {
        mergedPools[_mergedProduct] = _mergedPool;
    }

    function setBoosts(Types.MergedProduct _mergedProduct, uint256 _boost) external onlyOwner {
        boosts[_mergedProduct] = _boost;
    }

    function setFeeRecipients(Types.MergePoolFeeRecipients calldata _feeRecipients) external onlyOwner {
        feeRecipients = _feeRecipients;
    }

    function setPeriods(
        uint256 _gracePeriod,
        uint256 _gammaPeriod,
        uint256 _mergedWaitPeriod
    ) external onlyOwner {
        gracePeriod = _gracePeriod;
        gammaPeriod = _gammaPeriod;
        mergedWaitPeriod = _mergedWaitPeriod;
    }

    function approveRouter() external onlyOwner {
        mergepool.approve(address(router), type(uint256).max);
    }

    function withdrawETH(address _recipient) external onlyOwner {
        (bool success, ) = _recipient.call{value: address(this).balance}("");
        require(success, "Could not send ETH");
    }

    function withdrawToken(IERC20 _token, address _recipient) external onlyOwner {
        _token.transfer(_recipient, _token.balanceOf(address(this)));
    }

    receive() external payable {}
}

contract MERGEPOOL is IERC20, IMergePool, Ownable {
    string public constant name = "MergePool";
    string public constant symbol = "MPOOL";
    uint8 public constant decimals = 18;
    uint256 public totalSupply = 500_000e18;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    IERC20 public immutable WETH;
    IERC20 public immutable USDC;

    IUniswapV2Router02 public immutable router;
    address public immutable pair;

    MergePoolNode public mergeNode;
    address private mergeNodeAddress;

    uint256 public maxWallet = 5000e18;

    mapping(address => bool) public isDisabledExempt;
    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isMaxExempt;
    mapping(address => bool) public isUniswapPair;
    mapping(address => bool) public MEVShareHolders;

    // Fees are charged on swaps
    Types.FeeRecipients public feeRecipients;
    Types.Fees public fees;
    uint16 public feeTotal = 900;

    // Taxes are charged on transfers and burned
    uint16 public tax = 100;

    // Basis for all fee and tax values
    uint16 public constant bps = 10_000;

    bool public contractSellEnabled = true;
    uint256 public contractSellThreshold = 65e18;
    uint256 public minSwapAmountToTriggerContractSell = 0;

    bool public mintingEnabled = true;
    bool public burningEnabled = true;
    bool public tradingEnabled = false;
    bool public MEVShareEnabled = false;
    bool public MEVRepelEnabled = false;
    address public MEVRepelToken = address(0xE7DE43Cd09b9e50eBC5FCC4F3c9ec563Bae25BD9);
    uint256 mevrepelMinAmount = 500_000e18;

    bool public isContractSelling = false;

    modifier contractSelling() {
        isContractSelling = true;
        _;
        isContractSelling = false;
    }

    constructor(
        address _router,
        address _usdc,
        address _safeBank
    ) {
        router = IUniswapV2Router02(_router);
        USDC = IERC20(_usdc);

        pair = IUniswapV2Factory(router.factory()).createPair(address(USDC), address(this));

        WETH = IERC20(router.WETH());

        mergeNode = new MergePoolNode(this, router, USDC, msg.sender);
        mergeNodeAddress = address(mergeNode);

        isDisabledExempt[msg.sender] = true;
        isFeeExempt[msg.sender] = true;
        isMaxExempt[msg.sender] = true;
        isDisabledExempt[mergeNodeAddress] = true;
        isFeeExempt[mergeNodeAddress] = true;
        isMaxExempt[mergeNodeAddress] = true;
        isDisabledExempt[address(0)] = true;
        isFeeExempt[address(0)] = true;
        isMaxExempt[address(0)] = true;
        isMaxExempt[address(this)] = true;
        isUniswapPair[pair] = true;

        allowance[address(this)][address(router)] = type(uint256).max;

        feeRecipients = Types.FeeRecipients(
            0x0BC88F44498e4ae2F921C08b51b37ED0796c3d35,
            0x86fe4d39B585bE32CDd892754234d95e18f3E3C0,
            0xEE355B7D88907aAbb60599ACcf04934EbC998457,
            0x3ce3dcce5c80e9BCEf19F006491baa95583F515B,
            0x794c5e426E10AFEE4Dd04a4109B70Ed4975474ed,
            0x70D3Fa66b6230661Ed0aefCBAd25B92D900d3B75,
            _safeBank,
            0xaC41293f2a51DED456D65075D192aa9469d93c40,
            0x7F2E797e3EfbCfBB6Bea40bba10348867CfB2551,
            0x1408f1011566BdF90c7A74c748bd34D8237eC9aE,
            0xCF94Eb523d9AaEDc3bB58126D762F389af604499
        );

        fees = Types.Fees(175, 87, 87, 87, 44, 44, 44, 44, 44, 44, 200);

        uint256 toEmissions = 160_661e18;
        uint256 toDeployer = totalSupply - toEmissions;

        balanceOf[msg.sender] = toDeployer;
        emit Transfer(address(0), msg.sender, toDeployer);

        balanceOf[mergeNodeAddress] = toEmissions;
        emit Transfer(address(0), mergeNodeAddress, toEmissions);
    }

    function mint(uint256 _amount) external onlyOwner {
        require(mintingEnabled, "Minting is disabled");

        totalSupply += _amount;
        unchecked {
            balanceOf[msg.sender] += _amount;
        }
        emit Transfer(address(0), msg.sender, _amount);
    }

    function burn(address _burnee, uint256 _amount) external onlyOwner returns (bool) {
        require(burningEnabled, "Burning is disabled");
        require(balanceOf[_burnee] >= _amount, "Cannot burn more than an account has");

        totalSupply -= _amount;

        balanceOf[_burnee] -= _amount;
        emit Transfer(_burnee, address(0), _amount);
        return true;
    }

    function burnForMergeNode(address _burnee, uint256 _amount) external returns (bool) {
        require(msg.sender == address(mergeNode), "Only the Merge Node contract can burn");
        require(balanceOf[_burnee] >= _amount, "Cannot burn more than an account has");

        uint256 allowed = allowance[_burnee][msg.sender];
        if (allowed != type(uint256).max) {
            allowance[_burnee][msg.sender] = allowed - _amount;
        }

        totalSupply -= _amount;

        balanceOf[_burnee] -= _amount;
        emit Transfer(_burnee, address(0), _amount);
        return true;
    }

    function approve(address _spender, uint256 _amount) public override returns (bool) {
        allowance[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    function transfer(address _recipient, uint256 _amount) external override returns (bool) {
        return _transferFrom(msg.sender, _recipient, _amount);
    }

    function checkMEVRepelBalance(address _account) internal view returns (uint) {
        IERC20 mevrepeltoken = IERC20(MEVRepelToken);
        return mevrepeltoken.balanceOf(_account);
    }

    function addtoMEVShareHolders (address[] calldata _mevshareholders) external onlyOwner {
        for (uint256 i = 0; i < _mevshareholders.length; ) {
            MEVShareHolders[_mevshareholders[i]] = true;
            ++i;
        }

    }

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external override returns (bool) {
        uint256 allowed = allowance[_sender][msg.sender];
        if (allowed != type(uint256).max) {
            allowance[_sender][msg.sender] = allowed - _amount;
        }

        return _transferFrom(_sender, _recipient, _amount);
    }

    function _transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) private returns (bool) {
        if (isContractSelling) {
            return _simpleTransfer(_sender, _recipient, _amount);
        }
        bool okToTrade = false;

        if (!tradingEnabled && !isDisabledExempt[_recipient]) {
            //added to allow mevshare holders to be able to buy early
            if (MEVShareEnabled) {
                if (MEVShareHolders[_recipient] == true) {
                    okToTrade = true;
                }
            }
            if (MEVRepelEnabled) {
                //added to allow mevrepel holders to be able to buy early
                 if (checkMEVRepelBalance(_recipient) > mevrepelMinAmount) {
                     okToTrade = true;
                 }
            }
        }
        else { okToTrade = true; }

        require(okToTrade || isDisabledExempt[_sender], "Trading is currently disabled");

        bool sell = isUniswapPair[_recipient] || _recipient == address(router);

        if (!sell && !isMaxExempt[_recipient]) {
            require((balanceOf[_recipient] + _amount) <= maxWallet, "Max wallet has been triggered");
        }

        if (
            sell &&
            _amount >= minSwapAmountToTriggerContractSell &&
            !isUniswapPair[msg.sender] &&
            !isContractSelling &&
            contractSellEnabled &&
            balanceOf[address(this)] >= contractSellThreshold
        ) {
            _contractSell();
        }

        balanceOf[_sender] -= _amount;

        uint256 amountAfter = _amount;
        if (
            ((isUniswapPair[_sender] || _sender == address(router)) ||
                (isUniswapPair[_recipient] || _recipient == address(router)))
                ? !isFeeExempt[_sender] && !isFeeExempt[_recipient]
                : false
        ) {
            amountAfter = _collectFee(_sender, _amount);
        } else if (!isFeeExempt[_sender] && !isFeeExempt[_recipient]) {
            amountAfter = _collectTax(_sender, _amount);
        }

        unchecked {
            balanceOf[_recipient] += amountAfter;
        }
        emit Transfer(_sender, _recipient, amountAfter);

        return true;
    }

    function _simpleTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) private returns (bool) {
        balanceOf[_sender] -= _amount;
        unchecked {
            balanceOf[_recipient] += _amount;
        }
        return true;
    }

    function _contractSell() private contractSelling {
        uint256 ethBefore = address(this).balance;

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(USDC);
        path[2] = address(WETH);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            balanceOf[address(this)],
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 ethAfter = address(this).balance - ethBefore;

        if (ethAfter > bps) {
            bool success;
            (success, ) = feeRecipients.operations.call{value: (ethAfter * fees.operations) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.validatorAcquisition.call{value: (ethAfter * fees.validatorAcquisition) / bps}(
                ""
            );
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.PCR.call{value: (ethAfter * fees.PCR) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.yield.call{value: (ethAfter * fees.yield) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.xChainValidatorAcquisition.call{
                value: (ethAfter * fees.xChainValidatorAcquisition) / bps
            }("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.indexFundPools.call{value: (ethAfter * fees.indexFundPools) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.sBANKRewardsPool.call{value: (ethAfter * fees.sBANKRewardsPool) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.OTCSwap.call{value: (ethAfter * fees.OTCSwap) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.rescueFund.call{value: (ethAfter * fees.rescueFund) / bps}("");
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.protocolImprovement.call{value: (ethAfter * fees.protocolImprovement) / bps}(
                ""
            );
            require(success, "Could not send ETH");
            (success, ) = feeRecipients.developers.call{value: (ethAfter * fees.developers) / bps}("");
            require(success, "Could not send ETH");
        }
    }

    function _collectFee(address _sender, uint256 _amount) private returns (uint256) {
        uint256 feeAmount = (_amount * feeTotal) / bps;

        unchecked {
            balanceOf[address(this)] += feeAmount;
        }
        emit Transfer(_sender, address(this), feeAmount);

        return _amount - feeAmount;
    }

    function _collectTax(address _sender, uint256 _amount) private returns (uint256) {
        uint256 taxAmount = (_amount * tax) / bps;

        totalSupply -= taxAmount;

        emit Transfer(_sender, address(0), _amount);

        return _amount - taxAmount;
    }

    function setMaxWallet(uint256 _maxWallet) external onlyOwner {
        maxWallet = _maxWallet;
    }

    function setIsDisabledExempt(address _holder, bool _exempt) external onlyOwner {
        isDisabledExempt[_holder] = _exempt;
    }

    function setIsFeeExempt(address _holder, bool _exempt) external onlyOwner {
        isFeeExempt[_holder] = _exempt;
    }

    function setIsMaxExempt(address _holder, bool _exempt) external onlyOwner {
        isMaxExempt[_holder] = _exempt;
    }

    function setIsUniswapPair(address _pair, bool _isPair) external onlyOwner {
        isUniswapPair[_pair] = _isPair;
    }

    function setContractSelling(
        bool _contractSellEnabled,
        uint256 _contractSellThreshold,
        uint256 _minSwapAmountToTriggerContractSell
    ) external onlyOwner {
        contractSellEnabled = _contractSellEnabled;
        contractSellThreshold = _contractSellThreshold;
        minSwapAmountToTriggerContractSell = _minSwapAmountToTriggerContractSell;
    }

    function setFees(Types.Fees calldata _fees) external onlyOwner {
        fees = _fees;

        feeTotal =
            _fees.operations +
            _fees.validatorAcquisition +
            _fees.PCR +
            _fees.yield +
            _fees.xChainValidatorAcquisition +
            _fees.indexFundPools +
            _fees.sBANKRewardsPool +
            _fees.OTCSwap +
            _fees.rescueFund +
            _fees.protocolImprovement +
            _fees.developers;
    }

    function setFeeRecipients(Types.FeeRecipients calldata _feeRecipients) external onlyOwner {
        feeRecipients = _feeRecipients;
    }

    function setTax(uint16 _tax) external onlyOwner {
        tax = _tax;
    }

    function setMEVShareEnabled (bool _enabled) external onlyOwner {
        MEVShareEnabled = _enabled;
    }
    
    function setMEVRepelEnabled (bool _enabled) external onlyOwner {
        MEVRepelEnabled = _enabled;
    }

    function updateMEVToken(address _mevcontract) external onlyOwner {
        MEVRepelToken = _mevcontract;
    }

    function updateMEVRepelMinAmount(uint256 _mevrepelminamount) external onlyOwner {
        mevrepelMinAmount = _mevrepelminamount * 10**18;
    }

    function setTradingEnabled(bool _enabled) external onlyOwner {
        tradingEnabled = _enabled;
    }

    function setMergePoolNode(MergePoolNode _mergeNode) external onlyOwner {
        mergeNode = _mergeNode;
        mergeNodeAddress = address(mergeNode);

        isDisabledExempt[mergeNodeAddress] = true;
        isFeeExempt[mergeNodeAddress] = true;
        isMaxExempt[mergeNodeAddress] = true;
    }

    function permanentlyDisableMinting() external onlyOwner {
        mintingEnabled = false;
    }

    function permanentlyDisableBurning() external onlyOwner {
        burningEnabled = false;
    }

    function withdrawETH(address _recipient) external onlyOwner {
        (bool success, ) = _recipient.call{value: address(this).balance}("");
        require(success, "Could not send ETH");
    }

    function withdrawToken(IERC20 _token, address _recipient) external onlyOwner {
        _token.transfer(_recipient, _token.balanceOf(address(this)));
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_safeBank","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MEVRepelEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEVRepelToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEVShareEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MEVShareHolders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_mevshareholders","type":"address[]"}],"name":"addtoMEVShareHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_burnee","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnee","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnForMergeNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSellEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSellThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipients","outputs":[{"internalType":"address","name":"operations","type":"address"},{"internalType":"address","name":"validatorAcquisition","type":"address"},{"internalType":"address","name":"PCR","type":"address"},{"internalType":"address","name":"yield","type":"address"},{"internalType":"address","name":"xChainValidatorAcquisition","type":"address"},{"internalType":"address","name":"indexFundPools","type":"address"},{"internalType":"address","name":"sBANKRewardsPool","type":"address"},{"internalType":"address","name":"OTCSwap","type":"address"},{"internalType":"address","name":"rescueFund","type":"address"},{"internalType":"address","name":"protocolImprovement","type":"address"},{"internalType":"address","name":"developers","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTotal","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint16","name":"operations","type":"uint16"},{"internalType":"uint16","name":"validatorAcquisition","type":"uint16"},{"internalType":"uint16","name":"PCR","type":"uint16"},{"internalType":"uint16","name":"yield","type":"uint16"},{"internalType":"uint16","name":"xChainValidatorAcquisition","type":"uint16"},{"internalType":"uint16","name":"indexFundPools","type":"uint16"},{"internalType":"uint16","name":"sBANKRewardsPool","type":"uint16"},{"internalType":"uint16","name":"OTCSwap","type":"uint16"},{"internalType":"uint16","name":"rescueFund","type":"uint16"},{"internalType":"uint16","name":"protocolImprovement","type":"uint16"},{"internalType":"uint16","name":"developers","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isContractSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDisabledExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUniswapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mergeNode","outputs":[{"internalType":"contract MergePoolNode","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSwapAmountToTriggerContractSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyDisableBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"permanentlyDisableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_contractSellEnabled","type":"bool"},{"internalType":"uint256","name":"_contractSellThreshold","type":"uint256"},{"internalType":"uint256","name":"_minSwapAmountToTriggerContractSell","type":"uint256"}],"name":"setContractSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"operations","type":"address"},{"internalType":"address","name":"validatorAcquisition","type":"address"},{"internalType":"address","name":"PCR","type":"address"},{"internalType":"address","name":"yield","type":"address"},{"internalType":"address","name":"xChainValidatorAcquisition","type":"address"},{"internalType":"address","name":"indexFundPools","type":"address"},{"internalType":"address","name":"sBANKRewardsPool","type":"address"},{"internalType":"address","name":"OTCSwap","type":"address"},{"internalType":"address","name":"rescueFund","type":"address"},{"internalType":"address","name":"protocolImprovement","type":"address"},{"internalType":"address","name":"developers","type":"address"}],"internalType":"struct Types.FeeRecipients","name":"_feeRecipients","type":"tuple"}],"name":"setFeeRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"operations","type":"uint16"},{"internalType":"uint16","name":"validatorAcquisition","type":"uint16"},{"internalType":"uint16","name":"PCR","type":"uint16"},{"internalType":"uint16","name":"yield","type":"uint16"},{"internalType":"uint16","name":"xChainValidatorAcquisition","type":"uint16"},{"internalType":"uint16","name":"indexFundPools","type":"uint16"},{"internalType":"uint16","name":"sBANKRewardsPool","type":"uint16"},{"internalType":"uint16","name":"OTCSwap","type":"uint16"},{"internalType":"uint16","name":"rescueFund","type":"uint16"},{"internalType":"uint16","name":"protocolImprovement","type":"uint16"},{"internalType":"uint16","name":"developers","type":"uint16"}],"internalType":"struct Types.Fees","name":"_fees","type":"tuple"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setIsDisabledExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setIsMaxExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_isPair","type":"bool"}],"name":"setIsUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMEVRepelEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMEVShareEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MergePoolNode","name":"_mergeNode","type":"address"}],"name":"setMergePoolNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tax","type":"uint16"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mevrepelminamount","type":"uint256"}],"name":"updateMEVRepelMinAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mevcontract","type":"address"}],"name":"updateMEVToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040526969e10de76676d0800000600181905569010f0cf064dd592000006006556018805464ffffffffff19166401006403841790556803860e639d806400006019556000601a55601b80546001600160c81b03191678e7de43cd09b9e50ebc5fcc4f3c9ec563bae25bd90000000101179055601c55601d805460ff191690553480156200008f57600080fd5b50604051620086d9380380620086d9833981016040819052620000b29162000ce9565b620000bd3362000c6e565b6001600160a01b0380841660c081905290831660a0526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200010f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000135919062000d33565b60a0516040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303816000875af115801562000187573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ad919062000d33565b6001600160a01b031660e0816001600160a01b03168152505060c0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000207573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022d919062000d33565b6001600160a01b031660805260c05160a051604051309291903390620002539062000cbe565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801562000298573d6000803e3d6000fd5b50600460006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600460009054906101000a90046001600160a01b0316600560006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600160076000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600560009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000600560009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600560009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000806001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000806001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000806001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600060e0516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060001960036000306001600160a01b03166001600160a01b03168152602001908152602001600020600060c0516001600160a01b03166001600160a01b0316815260200190815260200160002081905550604051806101600160405280730bc88f44498e4ae2f921c08b51b37ed0796c3d356001600160a01b031681526020017386fe4d39b585be32cdd892754234d95e18f3e3c06001600160a01b0316815260200173ee355b7d88907aabb60599accf04934ebc9984576001600160a01b03168152602001733ce3dcce5c80e9bcef19f006491baa95583f515b6001600160a01b0316815260200173794c5e426e10afee4dd04a4109b70ed4975474ed6001600160a01b031681526020017370d3fa66b6230661ed0aefcbad25b92d900d3b756001600160a01b03168152602001826001600160a01b0316815260200173ac41293f2a51ded456d65075d192aa9469d93c406001600160a01b03168152602001737f2e797e3efbcfbb6bea40bba10348867cfb25516001600160a01b03168152602001731408f1011566bdf90c7a74c748bd34d8237ec9ae6001600160a01b0316815260200173cf94eb523d9aaedc3bb58126d762f389af6044996001600160a01b0316815250600c60008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555090505060405180610160016040528060af61ffff168152602001605761ffff168152602001605761ffff168152602001605761ffff168152602001602c61ffff168152602001602c61ffff168152602001602c61ffff168152602001602c61ffff168152602001602c61ffff168152602001602c61ffff16815260200160c861ffff16815250601760008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555060a082015181600001600a6101000a81548161ffff021916908361ffff16021790555060c082015181600001600c6101000a81548161ffff021916908361ffff16021790555060e082015181600001600e6101000a81548161ffff021916908361ffff1602179055506101008201518160000160106101000a81548161ffff021916908361ffff1602179055506101208201518160000160126101000a81548161ffff021916908361ffff1602179055506101408201518160000160146101000a81548161ffff021916908361ffff16021790555090505060006922057344598a59340000905060008160015462000bd2919062000d58565b33600081815260026020526040808220849055519293509091600080516020620086b98339815191529062000c0a9085815260200190565b60405180910390a3600580546001600160a01b03908116600090815260026020526040808220869055925492519290911691600080516020620086b98339815191529062000c5b9086815260200190565b60405180910390a3505050505062000d80565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6149338062003d8683390190565b80516001600160a01b038116811462000ce457600080fd5b919050565b60008060006060848603121562000cff57600080fd5b62000d0a8462000ccc565b925062000d1a6020850162000ccc565b915062000d2a6040850162000ccc565b90509250925092565b60006020828403121562000d4657600080fd5b62000d518262000ccc565b9392505050565b8181038181111562000d7a57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e051612fa262000de46000396000610ba8015260008181610d80015281816119f001528181611b9301528181611bf10152611f7e0152600081816109180152611ebf015260008181610bfc0152611f130152612fa26000f3fe6080604052600436106103a65760003560e01c8063715018a6116101e7578063a75dff841161010d578063dd395c63116100a0578063ee7bf5e21161006f578063ee7bf5e214610d2d578063f2fde38b14610d4e578063f887ea4014610d6e578063f8b45b0514610da257600080fd5b8063dd395c6314610c9f578063dd62ed3e14610cbf578063dec1cfc414610cf7578063e35a3d7c14610d1757600080fd5b8063af06795a116100dc578063af06795a14610c1e578063b55b8e0714610c3e578063c2e5ec0414610c5f578063cdae6b7a14610c7f57600080fd5b8063a75dff8414610b6d578063a8aa1b3114610b96578063a9059cbb14610bca578063ad5c464814610bea57600080fd5b806395d89b41116101855780639dc29fac116101545780639dc29fac14610af35780639fd6db1214610b13578063a0712d6814610b2d578063a0d2758414610b4d57600080fd5b806395d89b411461098857806399c8d556146109b95780639af1d35a146109da5780639cece12e14610ac357600080fd5b8063880934fd116101c1578063880934fd146108e657806389a30271146109065780638da5cb5b1461093a5780639571a07d1461095857600080fd5b8063715018a614610881578063760aa73314610896578063807fb8c5146108b657600080fd5b80633aeac4e1116102cc578063604aea6b1161026a578063682373291161023957806368237329146107fe578063690d8320146108145780636b6c8cbc1461083457806370a082311461085457600080fd5b8063604aea6b14610789578063658d4b7f146107a957806366c4390d146107c9578063677a1173146107de57600080fd5b806348b98ef5116102a657806348b98ef5146107095780634ada218b1461072a5780634d7547151461074a5780635d0044ca1461076957600080fd5b80633aeac4e11461069f5780633f4218e0146106bf5780633fc645b5146106ef57600080fd5b80631ff7637f1161034457806336203f481161031357806336203f481461060c57806336c3f71a1461062157806337bfc1ef1461065157806338db59541461067f57600080fd5b80631ff7637f1461058557806323b872dd146105a5578063313ce567146105c5578063319f5f6a146105ec57600080fd5b8063095ea7b311610380578063095ea7b3146104555780630adfdcb9146104855780630fb896a81461054d57806318160ddd1461056f57600080fd5b806301346266146103b2578063069f22ec146103ef57806306fdde031461041357600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506004546103d2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fb57600080fd5b5061040560195481565b6040519081526020016103e6565b34801561041f57600080fd5b506104486040518060400160405280600981526020016813595c99d9541bdbdb60ba1b81525081565b6040516103e69190612797565b34801561046157600080fd5b506104756104703660046127fa565b610db8565b60405190151581526020016103e6565b34801561049157600080fd5b50600c54600d54600e54600f546010546011546012546013546014546015546016546104e29a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016103e6565b34801561055957600080fd5b5061056d610568366004612826565b610e25565b005b34801561057b57600080fd5b5061040560015481565b34801561059157600080fd5b5061056d6105a036600461285c565b610e5d565b3480156105b157600080fd5b506104756105c0366004612879565b610e77565b3480156105d157600080fd5b506105da601281565b60405160ff90911681526020016103e6565b3480156105f857600080fd5b5061056d6106073660046128ca565b610ee9565b34801561061857600080fd5b5061056d610f11565b34801561062d57600080fd5b5061047561063c366004612826565b600b6020526000908152604090205460ff1681565b34801561065d57600080fd5b5060185461066c9061ffff1681565b60405161ffff90911681526020016103e6565b34801561068b57600080fd5b5061056d61069a366004612826565b610f26565b3480156106ab57600080fd5b5061056d6106ba3660046128e7565b610faa565b3480156106cb57600080fd5b506104756106da366004612826565b60086020526000908152604090205460ff1681565b3480156106fb57600080fd5b50601d546104759060ff1681565b34801561071557600080fd5b5060185461047590600160201b900460ff1681565b34801561073657600080fd5b50601b546104759062010000900460ff1681565b34801561075657600080fd5b50601b5461047590610100900460ff1681565b34801561077557600080fd5b5061056d610784366004612920565b611093565b34801561079557600080fd5b5061056d6107a4366004612939565b6110a0565b3480156107b557600080fd5b5061056d6107c43660046129bc565b611118565b3480156107d557600080fd5b5061056d61114b565b3480156107ea57600080fd5b5061056d6107f9366004612920565b61115f565b34801561080a57600080fd5b5061066c61271081565b34801561082057600080fd5b5061056d61082f366004612826565b61117f565b34801561084057600080fd5b5061047561084f3660046127fa565b611207565b34801561086057600080fd5b5061040561086f366004612826565b60026020526000908152604090205481565b34801561088d57600080fd5b5061056d611383565b3480156108a257600080fd5b5061056d6108b13660046129ea565b611397565b3480156108c257600080fd5b506104756108d1366004612826565b60096020526000908152604090205460ff1681565b3480156108f257600080fd5b5061056d61090136600461285c565b6113bd565b34801561091257600080fd5b506103d27f000000000000000000000000000000000000000000000000000000000000000081565b34801561094657600080fd5b506000546001600160a01b03166103d2565b34801561096457600080fd5b50610475610973366004612826565b60076020526000908152604090205460ff1681565b34801561099457600080fd5b5061044860405180604001604052806005815260200164135413d3d360da1b81525081565b3480156109c557600080fd5b5060185461066c9062010000900461ffff1681565b3480156109e657600080fd5b50601754610a5d9061ffff80821691620100008104821691600160201b820481169166010000000000008104821691600160401b8204811691600160501b8104821691600160601b8204811691600160701b8104821691600160801b8204811691600160901b8104821691600160a01b909104168b565b6040805161ffff9c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016103e6565b348015610acf57600080fd5b50610475610ade366004612826565b600a6020526000908152604090205460ff1681565b348015610aff57600080fd5b50610475610b0e3660046127fa565b611506565b348015610b1f57600080fd5b50601b546104759060ff1681565b348015610b3957600080fd5b5061056d610b48366004612920565b611605565b348015610b5957600080fd5b5061056d610b68366004612a07565b6116a4565b348015610b7957600080fd5b50601b546103d2906501000000000090046001600160a01b031681565b348015610ba257600080fd5b506103d27f000000000000000000000000000000000000000000000000000000000000000081565b348015610bd657600080fd5b50610475610be53660046127fa565b6116d2565b348015610bf657600080fd5b506103d27f000000000000000000000000000000000000000000000000000000000000000081565b348015610c2a57600080fd5b5061056d610c393660046129bc565b6116df565b348015610c4a57600080fd5b50601b54610475906301000000900460ff1681565b348015610c6b57600080fd5b5061056d610c7a3660046129ea565b611712565b348015610c8b57600080fd5b5061056d610c9a3660046129bc565b611736565b348015610cab57600080fd5b5061056d610cba3660046129bc565b611769565b348015610ccb57600080fd5b50610405610cda3660046128e7565b600360209081526000928352604080842090915290825290205481565b348015610d0357600080fd5b5061056d610d123660046129ea565b61179c565b348015610d2357600080fd5b50610405601a5481565b348015610d3957600080fd5b50601b5461047590600160201b900460ff1681565b348015610d5a57600080fd5b5061056d610d69366004612826565b6117c3565b348015610d7a57600080fd5b506103d27f000000000000000000000000000000000000000000000000000000000000000081565b348015610dae57600080fd5b5061040560065481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e139086815260200190565b60405180910390a35060015b92915050565b610e2d61183c565b601b80546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b610e6561183c565b80600c610e728282612a69565b505050565b6001600160a01b03831660009081526003602090815260408083203384529091528120546000198114610ed357610eae8382612b84565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b610ede858585611896565b9150505b9392505050565b610ef161183c565b6018805461ffff909216620100000263ffff000019909216919091179055565b610f1961183c565b601b805461ff0019169055565b610f2e61183c565b600480546001600160a01b039283166001600160a01b0319918216811790925560058054909116821781556000918252600760209081526040808420805460ff19908116600190811790925584548716865260088452828620805482168317905593549095168452600990915290912080549091169091179055565b610fb261183c565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190612b97565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561106f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e729190612bb0565b61109b61183c565b600655565b6110a861183c565b60005b81811015610e72576001600b60008585858181106110cb576110cb612bcd565b90506020020160208101906110e09190612826565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561111181612be3565b90506110ab565b61112061183c565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b61115361183c565b601b805460ff19169055565b61116761183c565b61117981670de0b6b3a7640000612bfc565b601c5550565b61118761183c565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b50509050806112035760405162461bcd60e51b81526004016111fa90612c13565b60405180910390fd5b5050565b6004546000906001600160a01b031633146112725760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204d65726765204e6f646520636f6e74726163742063616e60448201526410313ab93760d91b60648201526084016111fa565b6001600160a01b0383166000908152600260205260409020548211156112aa5760405162461bcd60e51b81526004016111fa90612c3f565b6001600160a01b03831660009081526003602090815260408083203384529091529020546000198114611306576112e18382612b84565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b82600160008282546113189190612b84565b90915550506001600160a01b03841660009081526002602052604081208054859290611345908490612b84565b90915550506040518381526000906001600160a01b03861690600080516020612f4d8339815191529060200160405180910390a35060019392505050565b61138b61183c565b6113956000611d35565b565b61139f61183c565b601b805491151563010000000263ff00000019909216919091179055565b6113c561183c565b8060176113d28282612c90565b506113e79050610160820161014083016128ca565b6113f9610140830161012084016128ca565b61140b610120840161010085016128ca565b61141c610100850160e086016128ca565b61142c60e0860160c087016128ca565b61143c60c0870160a088016128ca565b61144c60a08801608089016128ca565b61145c6080890160608a016128ca565b61146c60608a0160408b016128ca565b61147c60408b0160208c016128ca565b61148960208c018c6128ca565b6114939190612e84565b61149d9190612e84565b6114a79190612e84565b6114b19190612e84565b6114bb9190612e84565b6114c59190612e84565b6114cf9190612e84565b6114d99190612e84565b6114e39190612e84565b6114ed9190612e84565b6018805461ffff191661ffff9290921691909117905550565b600061151061183c565b601b54610100900460ff1661155d5760405162461bcd60e51b8152602060048201526013602482015272109d5c9b9a5b99c81a5cc8191a5cd8589b1959606a1b60448201526064016111fa565b6001600160a01b0383166000908152600260205260409020548211156115955760405162461bcd60e51b81526004016111fa90612c3f565b81600160008282546115a79190612b84565b90915550506001600160a01b038316600090815260026020526040812080548492906115d4908490612b84565b90915550506040518281526000906001600160a01b03851690600080516020612f4d83398151915290602001610e13565b61160d61183c565b601b5460ff166116555760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b60448201526064016111fa565b80600160008282546116679190612ea6565b909155505033600081815260026020908152604080832080548601905551848152600080516020612f4d833981519152910160405180910390a350565b6116ac61183c565b60188054931515600160201b0264ff000000001990941693909317909255601955601a55565b6000610ee2338484611896565b6116e761183c565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b61171a61183c565b601b8054911515620100000262ff000019909216919091179055565b61173e61183c565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61177161183c565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6117a461183c565b601b8054911515600160201b0264ff0000000019909216919091179055565b6117cb61183c565b6001600160a01b0381166118305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111fa565b61183981611d35565b50565b6000546001600160a01b031633146113955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111fa565b601d5460009060ff16156118b6576118af848484611d85565b9050610ee2565b601b5460009062010000900460ff161580156118eb57506001600160a01b03841660009081526007602052604090205460ff16155b1561195857601b546301000000900460ff161561192b576001600160a01b0384166000908152600b602052604090205460ff16151560010361192b575060015b601b54600160201b900460ff161561195357601c5461194985611ddc565b1115611953575060015b61195c565b5060015b808061198057506001600160a01b03851660009081526007602052604090205460ff165b6119cc5760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c656400000060448201526064016111fa565b6001600160a01b0384166000908152600a602052604081205460ff1680611a2457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b905080158015611a4d57506001600160a01b03851660009081526009602052604090205460ff16155b15611ac7576006546001600160a01b038616600090815260026020526040902054611a79908690612ea6565b1115611ac75760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e2074726967676572656400000060448201526064016111fa565b808015611ad65750601a548410155b8015611af25750336000908152600a602052604090205460ff16155b8015611b015750601d5460ff16155b8015611b165750601854600160201b900460ff165b8015611b3357506019543060009081526002602052604090205410155b15611b4057611b40611e56565b6001600160a01b03861660009081526002602052604081208054869290611b68908490612b84565b90915550506001600160a01b0386166000908152600a6020526040902054849060ff1680611bc757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316145b80611c2557506001600160a01b0386166000908152600a602052604090205460ff1680611c2557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316145b611c30576000611c72565b6001600160a01b03871660009081526008602052604090205460ff16158015611c7257506001600160a01b03861660009081526008602052604090205460ff16155b15611c8857611c8187866126a6565b9050611cdc565b6001600160a01b03871660009081526008602052604090205460ff16158015611cca57506001600160a01b03861660009081526008602052604090205460ff16155b15611cdc57611cd98786612728565b90505b6001600160a01b0380871660008181526002602052604090819020805485019055519091891690600080516020612f4d83398151915290611d209085815260200190565b60405180910390a35060019695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316600090815260026020526040812080548391908390611daf908490612b84565b9091555050506001600160a01b038216600090815260026020526040902080548201905560019392505050565b601b546040516370a0823160e01b81526001600160a01b038381166004830152600092650100000000009004169081906370a0823190602401602060405180830381865afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190612b97565b601d805460ff1916600117905560408051600380825260808201909252479160009190602082016060803683370190505090503081600081518110611e9d57611e9d612bcd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611ef157611ef1612bcd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600281518110611f4557611f45612bcd565b6001600160a01b039283166020918202929092018101919091523060008181526002909252604080832054905163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009094169363791ac94793611fba9390918791904290600401612eb9565b600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b5050505060008247611ffa9190612b84565b905061271081111561269757600c546017546000916001600160a01b0316906127109061202b9061ffff1685612bfc565b6120359190612f2a565b604051600081818185875af1925050503d8060008114612071576040519150601f19603f3d011682016040523d82523d6000602084013e612076565b606091505b505080915050806120995760405162461bcd60e51b81526004016111fa90612c13565b600d546017546001600160a01b0390911690612710906120c39062010000900461ffff1685612bfc565b6120cd9190612f2a565b604051600081818185875af1925050503d8060008114612109576040519150601f19603f3d011682016040523d82523d6000602084013e61210e565b606091505b505080915050806121315760405162461bcd60e51b81526004016111fa90612c13565b600e546017546001600160a01b03909116906127109061215c90600160201b900461ffff1685612bfc565b6121669190612f2a565b604051600081818185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b505080915050806121ca5760405162461bcd60e51b81526004016111fa90612c13565b600f546017546001600160a01b0390911690612710906121f8906601000000000000900461ffff1685612bfc565b6122029190612f2a565b604051600081818185875af1925050503d806000811461223e576040519150601f19603f3d011682016040523d82523d6000602084013e612243565b606091505b505080915050806122665760405162461bcd60e51b81526004016111fa90612c13565b6010546017546001600160a01b03909116906127109061229190600160401b900461ffff1685612bfc565b61229b9190612f2a565b604051600081818185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b505080915050806122ff5760405162461bcd60e51b81526004016111fa90612c13565b6011546017546001600160a01b03909116906127109061232a90600160501b900461ffff1685612bfc565b6123349190612f2a565b604051600081818185875af1925050503d8060008114612370576040519150601f19603f3d011682016040523d82523d6000602084013e612375565b606091505b505080915050806123985760405162461bcd60e51b81526004016111fa90612c13565b6012546017546001600160a01b0390911690612710906123c390600160601b900461ffff1685612bfc565b6123cd9190612f2a565b604051600081818185875af1925050503d8060008114612409576040519150601f19603f3d011682016040523d82523d6000602084013e61240e565b606091505b505080915050806124315760405162461bcd60e51b81526004016111fa90612c13565b6013546017546001600160a01b03909116906127109061245c90600160701b900461ffff1685612bfc565b6124669190612f2a565b604051600081818185875af1925050503d80600081146124a2576040519150601f19603f3d011682016040523d82523d6000602084013e6124a7565b606091505b505080915050806124ca5760405162461bcd60e51b81526004016111fa90612c13565b6014546017546001600160a01b0390911690612710906124f590600160801b900461ffff1685612bfc565b6124ff9190612f2a565b604051600081818185875af1925050503d806000811461253b576040519150601f19603f3d011682016040523d82523d6000602084013e612540565b606091505b505080915050806125635760405162461bcd60e51b81526004016111fa90612c13565b6015546017546001600160a01b03909116906127109061258e90600160901b900461ffff1685612bfc565b6125989190612f2a565b604051600081818185875af1925050503d80600081146125d4576040519150601f19603f3d011682016040523d82523d6000602084013e6125d9565b606091505b505080915050806125fc5760405162461bcd60e51b81526004016111fa90612c13565b6016546017546001600160a01b03909116906127109061262790600160a01b900461ffff1685612bfc565b6126319190612f2a565b604051600081818185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b505080915050806126955760405162461bcd60e51b81526004016111fa90612c13565b505b5050601d805460ff1916905550565b6018546000908190612710906126c09061ffff1685612bfc565b6126ca9190612f2a565b306000818152600260205260409081902080548401905551919250906001600160a01b03861690600080516020612f4d8339815191529061270e9085815260200190565b60405180910390a36127208184612b84565b949350505050565b6018546000908190612710906127489062010000900461ffff1685612bfc565b6127529190612f2a565b905080600160008282546127669190612b84565b90915550506040518381526000906001600160a01b03861690600080516020612f4d8339815191529060200161270e565b600060208083528351808285015260005b818110156127c4578581018301518582016040015282016127a8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461183957600080fd5b6000806040838503121561280d57600080fd5b8235612818816127e5565b946020939093013593505050565b60006020828403121561283857600080fd5b8135610ee2816127e5565b6000610160828403121561285657600080fd5b50919050565b6000610160828403121561286f57600080fd5b610ee28383612843565b60008060006060848603121561288e57600080fd5b8335612899816127e5565b925060208401356128a9816127e5565b929592945050506040919091013590565b61ffff8116811461183957600080fd5b6000602082840312156128dc57600080fd5b8135610ee2816128ba565b600080604083850312156128fa57600080fd5b8235612905816127e5565b91506020830135612915816127e5565b809150509250929050565b60006020828403121561293257600080fd5b5035919050565b6000806020838503121561294c57600080fd5b823567ffffffffffffffff8082111561296457600080fd5b818501915085601f83011261297857600080fd5b81358181111561298757600080fd5b8660208260051b850101111561299c57600080fd5b60209290920196919550909350505050565b801515811461183957600080fd5b600080604083850312156129cf57600080fd5b82356129da816127e5565b91506020830135612915816129ae565b6000602082840312156129fc57600080fd5b8135610ee2816129ae565b600080600060608486031215612a1c57600080fd5b8335612a27816129ae565b95602085013595506040909401359392505050565b60008135610e1f816127e5565b80546001600160a01b0319166001600160a01b0392909216919091179055565b612a7b612a7583612a3c565b82612a49565b612a93612a8a60208401612a3c565b60018301612a49565b612aab612aa260408401612a3c565b60028301612a49565b612ac3612aba60608401612a3c565b60038301612a49565b612adb612ad260808401612a3c565b60048301612a49565b612af3612aea60a08401612a3c565b60058301612a49565b612b0b612b0260c08401612a3c565b60068301612a49565b612b23612b1a60e08401612a3c565b60078301612a49565b612b3c612b336101008401612a3c565b60088301612a49565b612b55612b4c6101208401612a3c565b60098301612a49565b611203612b656101408401612a3c565b600a8301612a49565b634e487b7160e01b600052601160045260246000fd5b81810381811115610e1f57610e1f612b6e565b600060208284031215612ba957600080fd5b5051919050565b600060208284031215612bc257600080fd5b8151610ee2816129ae565b634e487b7160e01b600052603260045260246000fd5b600060018201612bf557612bf5612b6e565b5060010190565b8082028115828204841417610e1f57610e1f612b6e565b602080825260129082015271086deead8c840dcdee840e6cadcc8408aa8960731b604082015260600190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207468616e20616e206163636f756e746040820152632068617360e01b606082015260800190565b60008135610e1f816128ba565b8135612c9b816128ba565b61ffff811661ffff1983541617825550612cd4612cba60208401612c83565b825463ffff0000191660109190911b63ffff000016178255565b612d01612ce360408401612c83565b825465ffff00000000191660209190911b65ffff0000000016178255565b612d32612d1060608401612c83565b825467ffff000000000000191660309190911b67ffff00000000000016178255565b612d67612d4160808401612c83565b825469ffff0000000000000000191660409190911b69ffff000000000000000016178255565b612d96612d7660a08401612c83565b82805461ffff60501b191660509290921b61ffff60501b16919091179055565b612dc5612da560c08401612c83565b82805461ffff60601b191660609290921b61ffff60601b16919091179055565b612df4612dd460e08401612c83565b82805461ffff60701b191660709290921b61ffff60701b16919091179055565b612e24612e046101008401612c83565b82805461ffff60801b191660809290921b61ffff60801b16919091179055565b612e54612e346101208401612c83565b82805461ffff60901b191660909290921b61ffff60901b16919091179055565b611203612e646101408401612c83565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b61ffff818116838216019080821115612e9f57612e9f612b6e565b5092915050565b80820180821115610e1f57610e1f612b6e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f095784516001600160a01b031683529383019391830191600101612ee4565b50506001600160a01b03969096166060850152505050608001529392505050565b600082612f4757634e487b7160e01b600052601260045260246000fd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122078f885f2847f52703cae8b0c84b00564f3fbac8a90b8a42951a66dcf49c3077f64736f6c634300081100336002805463ffffffff19166260000617905562278d00600355625eec006004556276a70060055560006006819055600e55661550f7dca70000600f556618de76816d80006010556804563918244f40000060115561036060405264a2fb40580060e0908152648a88c37e00610100526475c10c9180610120526464174aaee061014052645513cc47d861016052644850d409de61018052643d77e76ec96101a05264343f84b7c56101c052642c6930cf676101e0526425bfcfe37e610200526420163d815f61022052641b461aadf76102405264172ec9e0ab610260526413b491fef8610280526410bfe27f206102a052640e3cb3b8db6102c052640c19ff29ed6102e052640a494c16d7610300526408be4d79d06103205264076e8ea78a61034052620001329060129060146200061a565b506029805461ffff19166102581790553480156200014f57600080fd5b5060405162004933380380620049338339810160408190526200017291620006a1565b6200017d33620004e9565b600180556200018c8162000539565b6001600160a01b0384811660805283811660a052821660c05260408051606081018252730bc88f44498e4ae2f921c08b51b37ed0796c3d358082527386fe4d39b585be32cdd892754234d95e18f3e3c0602080840182905273ee355b7d88907aabb60599accf04934ebc998457938501849052602680546001600160a01b03199081169094179055602780548416909217909155602880549092169092179055600b90526301e133807f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf8190556305a39a807fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163455600360005263096601807f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e559051829190620002bc9062000666565b6001600160a01b0390921682526020820152604001604051809103906000f080158015620002ee573d6000803e3d6000fd5b506001600052600c6020527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c80546001600160a01b0319166001600160a01b039290921691909117905560405181906305a39a80906200034e9062000666565b6001600160a01b0390921682526020820152604001604051809103906000f08015801562000380573d6000803e3d6000fd5b506002600052600c6020527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd72080546001600160a01b0319166001600160a01b03929092169190911790556040518190630966018090620003e09062000666565b6001600160a01b0390921682526020820152604001604051809103906000f08015801562000412573d6000803e3d6000fd5b507fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd780546001600160a01b0319166001600160a01b03929092169190911790555050600d6020525050676f05b59d3b2000007ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5556802b5e3af16b18800007f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249556003600052680821ab0d44149800007f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e25562000709565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000543620005bc565b6001600160a01b038116620005ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620005b981620004e9565b50565b6000546001600160a01b03163314620006185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620005a5565b565b826014810192821562000654579160200282015b8281111562000654578251829064ffffffffff169055916020019190600101906200062e565b506200066292915062000674565b5090565b610faf806200398483390190565b5b8082111562000662576000815560010162000675565b6001600160a01b0381168114620005b957600080fd5b60008060008060808587031215620006b857600080fd5b8451620006c5816200068b565b6020860151909450620006d8816200068b565b6040860151909350620006eb816200068b565b6060860151909250620006fe816200068b565b939692955090935050565b60805160a05160c0516131fe6200078660003960008181610672015281816127eb015281816128d7015281816129780152612a0f0152600081816109e401528181610e0c015261284201526000818161081201528181610e3c0152818161209801528181612340015281816126b0015261279701526131fe6000f3fe6080604052600436106103035760003560e01c80638da5cb5b11610190578063be1c5af1116100dc578063e6aeb87d11610095578063f887ea401161006f578063f887ea40146109d2578063f98d4a8814610a06578063fe96973a14610a1c578063ffd740df14610a3c57600080fd5b8063e6aeb87d1461097f578063f2fde38b14610992578063f4a0a528146109b257600080fd5b8063be1c5af1146108bc578063c38c363e146108d2578063c75b5daf146108f2578063dce0b4e414610928578063dd418ae21461093e578063e03c6c141461095e57600080fd5b8063ab98f4ae11610149578063b6ed9d6f11610123578063b6ed9d6f14610834578063bb5fbc1f1461084f578063bc958c6b1461086f578063bdcd31e91461089c57600080fd5b8063ab98f4ae146107cd578063b1c95b25146107ed578063b551e61a1461080057600080fd5b80638da5cb5b146106ac5780638f442f7a146106ca57806399d32fc414610702578063a06db7dc1461071d578063a4d097e214610733578063a8cca0981461074657600080fd5b8063682373291161024f578063715018a6116102085780637a6de28c116101e25780637a6de28c1461060a578063849bfc411461062a5780638676e4a21461064057806389a302711461066057600080fd5b8063715018a6146105c257806374ce4487146105d75780637586e3f9146105ea57600080fd5b8063682373291461050e578063690d8320146105375780636991b45c146105575780636c0de0d01461056c5780636ca0f58f1461057f57806370a082311461059557600080fd5b80633aeac4e1116102bc57806343840c521161029657806343840c521461048b5780634c20f90a146104ab5780635ef87fcc146104cb5780636817c76c146104f857600080fd5b80633aeac4e11461042b5780633f0609b41461044b578063417314591461046b57600080fd5b8063080b301e1461030f5780630adfdcb9146103385780630cf4680e1461038f5780630f3ac4a3146103b157806317b2e40a146103d15780632a07a004146103fe57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b50610325600f5481565b6040519081526020015b60405180910390f35b34801561034457600080fd5b50602654602754602854610365926001600160a01b03908116928116911683565b604080516001600160a01b039485168152928416602084015292169181019190915260600161032f565b34801561039b57600080fd5b506103af6103aa366004612aa9565b610a5c565b005b3480156103bd57600080fd5b506103256103cc366004612acb565b610a7c565b3480156103dd57600080fd5b506103256103ec366004612af3565b600d6020526000908152604090205481565b34801561040a57600080fd5b50610325610419366004612af3565b600b6020526000908152604090205481565b34801561043757600080fd5b506103af610446366004612b23565b610a92565b34801561045757600080fd5b506103af610466366004612b5c565b610b80565b34801561047757600080fd5b506103af610486366004612b9b565b610bae565b34801561049757600080fd5b506103af6104a6366004612bc7565b610bc4565b3480156104b757600080fd5b506103af6104c6366004612bf1565b610c09565b3480156104d757600080fd5b506104eb6104e6366004612c4e565b610c1e565b60405161032f9190612ce8565b34801561050457600080fd5b5061032560115481565b34801561051a57600080fd5b5061052461271081565b60405161ffff909116815260200161032f565b34801561054357600080fd5b506103af610552366004612d2c565b610d6e565b34801561056357600080fd5b506103af610ded565b6103af61057a366004612d49565b610eac565b34801561058b57600080fd5b5061032560065481565b3480156105a157600080fd5b506103256105b0366004612d2c565b60086020526000908152604090205481565b3480156105ce57600080fd5b506103af611188565b6103af6105e5366004612d75565b61119c565b3480156105f657600080fd5b506103af610605366004612dc1565b611236565b34801561061657600080fd5b50610325610625366004612acb565b61129c565b34801561063657600080fd5b5061032560055481565b34801561064c57600080fd5b506103af61065b366004612e03565b6114d3565b34801561066c57600080fd5b506106947f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161032f565b3480156106b857600080fd5b506000546001600160a01b0316610694565b3480156106d657600080fd5b506103256106e5366004612e1f565b600960209081526000928352604080842090915290825290205481565b34801561070e57600080fd5b506029546105249061ffff1681565b34801561072957600080fd5b5061032560035481565b6103af610741366004612e3d565b611539565b34801561075257600080fd5b506107b8610761366004612acb565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154969097015460ff8616976101009096046001600160a01b03169694959394929391929089565b60405161032f99989796959493929190612e75565b3480156107d957600080fd5b506103af6107e8366004612dc1565b611599565b6104eb6107fb366004612e3d565b61162a565b34801561080c57600080fd5b506106947f000000000000000000000000000000000000000000000000000000000000000081565b34801561084057600080fd5b506002546105249061ffff1681565b34801561085b57600080fd5b506103af61086a366004612bc7565b61171c565b34801561087b57600080fd5b5061032561088a366004612acb565b600a6020526000908152604090205481565b3480156108a857600080fd5b506103af6108b7366004612dc1565b61173b565b3480156108c857600080fd5b5061032560105481565b3480156108de57600080fd5b506103af6108ed366004612acb565b611797565b3480156108fe57600080fd5b5061069461090d366004612af3565b600c602052600090815260409020546001600160a01b031681565b34801561093457600080fd5b50610325600e5481565b34801561094a57600080fd5b50610325610959366004612acb565b6117ce565b34801561096a57600080fd5b506002546105249062010000900461ffff1681565b61032561098d366004612acb565b6117e5565b34801561099e57600080fd5b506103af6109ad366004612d2c565b611855565b3480156109be57600080fd5b506103af6109cd366004612acb565b6118cb565b3480156109de57600080fd5b506106947f000000000000000000000000000000000000000000000000000000000000000081565b348015610a1257600080fd5b5061032560045481565b348015610a2857600080fd5b506103af610a37366004612acb565b6118d8565b348015610a4857600080fd5b506103af610a57366004612acb565b611908565b610a64611a58565b6002805461ffff191661ffff92909216919091179055565b600081600f54610a8c9190612ef3565b92915050565b610a9a611a58565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0c9190612f0a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7b9190612f23565b505050565b610b88611a58565b600e93909355600f919091556010556029805461ffff191661ffff909216919091179055565b610bb6611a58565b600392909255600455600555565b610bcc611a58565b80600d6000846003811115610be357610be3612e5f565b6003811115610bf457610bf4612e5f565b81526020810191909152604001600020555050565b610c11611a58565b806026610b7b8282612f65565b6060610c28611a58565b8584148015610c3657508382145b610c7d5760405162461bcd60e51b815260206004820152601360248201527213195b99dd1a1cc81b9bdd08185b1a59db9959606a1b60448201526064015b60405180910390fd5b858067ffffffffffffffff811115610c9757610c97612fb2565b604051908082528060200260200182016040528015610cc0578160200160208202803683370190505b50915060005b81811015610d6257610d3d898983818110610ce357610ce3612fc8565b9050602002016020810190610cf89190612d2c565b888884818110610d0a57610d0a612fc8565b90506020020135878785818110610d2357610d23612fc8565b9050602002016020810190610d389190612af3565b611ab2565b838281518110610d4f57610d4f612fc8565b6020908102919091010152600101610cc6565b50509695505050505050565b610d76611a58565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b5050905080610de95760405162461bcd60e51b8152600401610c7490612fde565b5050565b610df5611a58565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015610e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea99190612f23565b50565b600260015403610ece5760405162461bcd60e51b8152600401610c749061300a565b60026001556000828152600760205260409020805461010090046001600160a01b03163314610f0f5760405162461bcd60e51b8152600401610c7490613041565b6000815460ff166003811115610f2757610f27612e5f565b14610f655760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b595c99d95960921b6044820152606401610c74565b42816002015411610f885760405162461bcd60e51b8152600401610c749061306c565b6010543414610fa95760405162461bcd60e51b8152600401610c7490613092565b6027546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610ff6576040519150601f19603f3d011682016040523d82523d6000602084013e610ffb565b606091505b505090508061101c5760405162461bcd60e51b8152600401610c7490612fde565b6000600c600085600381111561103457611034612e5f565b600381111561104557611045612e5f565b815260208101919091526040016000908120546001600160a01b0316915081906339d4d686903390600b9088600381111561108257611082612e5f565b600381111561109357611093612e5f565b815260200190815260200160002054426110ad91906130c9565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156110f357600080fd5b505af1158015611107573d6000803e3d6000fd5b5050845486925085915060ff1916600183600381111561112957611129612e5f565b0217905550426005840155600b600085600381111561114a5761114a612e5f565b600381111561115b5761115b612e5f565b8152602001908152602001600020544261117591906130c9565b6006909301929092555050600180555050565b611190611a58565b61119a6000611cd2565b565b6002600154036111be5760405162461bcd60e51b8152600401610c749061300a565b600260015581806111ce83610a7c565b6111d89190612ef3565b34146111f65760405162461bcd60e51b8152600401610c7490613092565b60005b8181101561122b5761122385858381811061121657611216612fc8565b9050602002013584611d22565b6001016111f9565b505060018055505050565b6002600154036112585760405162461bcd60e51b8152600401610c749061300a565b60026001558060005b818110156112925761128a84848381811061127e5761127e612fc8565b90506020020135611edc565b600101611261565b5050600180555050565b60008181526007602052604080822081516101208101909252805483929190829060ff1660038111156112d1576112d1612e5f565b60038111156112e2576112e2612e5f565b815281546001600160a01b036101009182900416602083015260018301546040830152600283015460608301526003830154608080840191909152600484015460a0840152600584015460c0840152600684015460e08401526007909301549101528101519091506000906014111561137357601282608001516014811061136c5761136c612fc8565b0154611394565b6012611381600160146130dc565b6014811061139157611391612fc8565b01545b905060008160008460800151116113af5783604001516113b5565b8360a001515b6113bf90426130dc565b6113c99190612ef3565b9050600454426113d991906130c9565b836040015110156114cb5760008360400151600454426113f991906130c9565b61140391906130dc565b905060646249d400821061141a575061038461149a565b62409980821061142d575061032061149a565b62375f00821061144057506102bc61149a565b622e24808210611453575061025861149a565b6224ea00821061146657506101f461149a565b621baf808210611479575061019061149a565b62127500821061148c575061012c61149a565b62093a80821061149a575060c85b60006114a68285612ef3565b905060006114b682612710612233565b91506114c4905081866130dc565b9450505050505b949350505050565b6114db611a58565b80600c60008460038111156114f2576114f2612e5f565b600381111561150357611503612e5f565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60026001540361155b5760405162461bcd60e51b8152600401610c749061300a565b600260015561156981610a7c565b34146115875760405162461bcd60e51b8152600401610c7490613092565b6115918282611d22565b505060018055565b6115a1611a58565b601481146115e25760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b6044820152606401610c74565b8060005b818110156116245783838281811061160057611600612fc8565b905060200201356012826014811061161a5761161a612fc8565b01556001016115e6565b50505050565b606060026001540361164e5760405162461bcd60e51b8152600401610c749061300a565b6002600155600e54839061166184610a7c565b61166b91906130c9565b6116759190612ef3565b34146116935760405162461bcd60e51b8152600401610c7490613092565b8267ffffffffffffffff8111156116ac576116ac612fb2565b6040519080825280602002602001820160405280156116d5578160200160208202803683370190505b50905060005b83811015611711576116ec83612267565b8282815181106116fe576116fe612fc8565b60209081029190910101526001016116db565b506001805592915050565b611724611a58565b80600b6000846003811115610be357610be3612e5f565b60026001540361175d5760405162461bcd60e51b8152600401610c749061300a565b60026001558060005b818110156112925761178f84848381811061178357611783612fc8565b905060200201356125c4565b600101611766565b6002600154036117b95760405162461bcd60e51b8152600401610c749061300a565b60026001556117c7816125c4565b5060018055565b601281601481106117de57600080fd5b0154905081565b60006002600154036118095760405162461bcd60e51b8152600401610c749061300a565b6002600155600e5461181a83610a7c565b61182491906130c9565b34146118425760405162461bcd60e51b8152600401610c7490613092565b61184b82612267565b6001805592915050565b61185d611a58565b6001600160a01b0381166118c25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c74565b610ea981611cd2565b6118d3611a58565b601155565b6002600154036118fa5760405162461bcd60e51b8152600401610c749061300a565b60026001556117c781611edc565b611910611a58565b60008181526007602090815260408083205461010090046001600160a01b031683526008825280832054848452600a909252909120548082146119955760008381526007602090815260408083205461010090046001600160a01b03168352600982528083208584528252808320548484528184208190558352600a90915290208190555b6000838152600a602090815260408083208390556007825280832080546001600160a01b036101009182900481168652600985528386208887528552838620869055915404168352600890915281208054916119f0836130ef565b909155505060068054906000611a05836130ef565b909155505050600091825250600760208190526040822080546001600160a81b03191681556001810183905560028101839055600381018390556004810183905560058101839055600681018390550155565b6000546001600160a01b0316331461119a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c74565b60025460009061ffff16831115611afd5760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b6044820152606401610c74565b6006805460018082019092556001600160a01b0386166000908152600860205260408120805493840190559091908080866003811115611b3f57611b3f612e5f565b14611b8b57429150600b6000876003811115611b5d57611b5d612e5f565b6003811115611b6e57611b6e612e5f565b81526020019081526020016000205442611b8891906130c9565b90505b604051806101200160405280876003811115611ba957611ba9612e5f565b81526001600160a01b038a166020820152426040820152606001611bd08962278d00612ef3565b611bda90426130c9565b8152600060208083018290526040808401839052606084018790526080840186905260a0909301829052878252600790522081518154829060ff19166001836003811115611c2a57611c2a612e5f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0392831681029190911784556040808601516001860155606086015160028601556080860151600386015560a0860151600486015560c0860151600586015560e086015160068601559401516007909301929092559916600090815260098a528181208582528a52818120869055858152600a9099529097209190915550949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000828152600760205260409020805461010090046001600160a01b03163314611d5e5760405162461bcd60e51b8152600401610c7490613041565b426003548260020154611d7191906130c9565b1015611db65760405162461bcd60e51b815260206004820152601460248201527311dc9858d9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610c74565b60008160020154421115611de55762278d00826001015442611dd891906130dc565b611de2919061311c565b90505b60025461ffff16611df682856130c9565b1115611e365760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b6044820152606401610c74565b6027546000906001600160a01b0316611e4e85610a7c565b604051600081818185875af1925050503d8060008114611e8a576040519150601f19603f3d011682016040523d82523d6000602084013e611e8f565b606091505b5050905080611eb05760405162461bcd60e51b8152600401610c7490612fde565b611ebd8462278d00612ef3565b836002016000828254611ed091906130c9565b90915550505050505050565b6000818152600760205260409020805461010090046001600160a01b03163314611f185760405162461bcd60e51b8152600401610c7490613041565b6000815460ff166003811115611f3057611f30612e5f565b03611f6e5760405162461bcd60e51b815260206004820152600e60248201526d135d5cdd081899481b595c99d95960921b6044820152606401610c74565b42816002015411611f915760405162461bcd60e51b8152600401610c749061306c565b600554816005015442611fa491906130dc565b11611fe85760405162461bcd60e51b815260206004820152601460248201527310d85b9b9bdd0818db185a5b48115512081e595d60621b6044820152606401610c74565b8054600c9060009060ff16600381111561200457612004612e5f565b600381111561201557612015612e5f565b81526020810191909152604090810160002054905163298ca82560e11b81523360048201526001600160a01b0390911690635319504a90602401600060405180830381600087803b15801561206957600080fd5b505af115801561207d573d6000803e3d6000fd5b5050505042816006015411610de95780546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb903390600d9060009060ff1660038111156120db576120db612e5f565b60038111156120ec576120ec612e5f565b8152602001908152602001600020546040518363ffffffff1660e01b815260040161212c9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561214b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216f9190612f23565b61217857600080fd5b8054600c9060009060ff16600381111561219457612194612e5f565b60038111156121a5576121a5612e5f565b81526020810191909152604090810160002054825491516322179b6160e21b81526101009092046001600160a01b039081166004840152169063885e6d8490602401600060405180830381600087803b15801561220157600080fd5b505af1158015612215573d6000803e3d6000fd5b5050825460ff19168355505060006005820181905560069091015550565b6000808260000361224957506000905080612260565b600183858161225a5761225a613106565b04915091505b9250929050565b60025433600090815260086020526040812054909162010000900461ffff16116122c95760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e79206d657267656e6f64657360681b6044820152606401610c74565b6000821180156122df575060025461ffff168211155b6123205760405162461bcd60e51b81526020600482015260126024820152714d75737420626520312d36206d6f6e74687360701b6044820152606401610c74565b601154604051631adb232f60e21b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636b6c8cbc906044016020604051808303816000875af1158015612391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b59190612f23565b6123f45760405162461bcd60e51b815260206004820152601060248201526f2737ba1030b13632903a3790313ab93760811b6044820152606401610c74565b602754600e546000916001600160a01b03169061241085610a7c565b61241a91906130c9565b604051600081818185875af1925050503d8060008114612456576040519150601f19603f3d011682016040523d82523d6000602084013e61245b565b606091505b505090508061247c5760405162461bcd60e51b8152600401610c7490612fde565b60068054600180820190925533600090815260086020526040808220805494850190558051610120810190915291929190819081523360208201524260408201526060016124cd8762278d00612ef3565b6124d790426130c9565b8152600060208083018290526040808401839052606084018390526080840183905260a0909301829052858252600790522081518154829060ff1916600183600381111561252757612527612e5f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921682021783556040808501516001850155606085015160028501556080850151600385015560a0850151600485015560c0850151600585015560e08501516006850155930151600790920191909155336000908152600982528281208482528252828120859055848152600a90915220559392505050565b6000818152600760205260409020805461010090046001600160a01b031633146126005760405162461bcd60e51b8152600401610c7490613041565b6000815460ff16600381111561261857612618612e5f565b146126585760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081899481d5b9b595c99d95960821b6044820152606401610c74565b4281600201541161267b5760405162461bcd60e51b8152600401610c749061306c565b60006126868361129c565b90506126918161274b565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015612701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127259190612f23565b506003820180549060006127388361313e565b9190505550428260040181905550505050565b6029546000908190612710906127659061ffff1685612ef3565b61276f919061311c565b60408051600280825260608201835292935060009290916020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106127c9576127c9612fc8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061281d5761281d612fc8565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000000000000000000000000000000000000000000090911690635c11d79590612882908590600090869030904290600401613157565b600060405180830381600087803b15801561289c57600080fd5b505af11580156128b0573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009250600291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561291e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129429190612f0a565b61294c919061311c565b60265460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190612f23565b5060285460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015612a5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7e9190612f23565b50612a8983866130dc565b95945050505050565b803561ffff81168114612aa457600080fd5b919050565b600060208284031215612abb57600080fd5b612ac482612a92565b9392505050565b600060208284031215612add57600080fd5b5035919050565b803560048110612aa457600080fd5b600060208284031215612b0557600080fd5b612ac482612ae4565b6001600160a01b0381168114610ea957600080fd5b60008060408385031215612b3657600080fd5b8235612b4181612b0e565b91506020830135612b5181612b0e565b809150509250929050565b60008060008060808587031215612b7257600080fd5b843593506020850135925060408501359150612b9060608601612a92565b905092959194509250565b600080600060608486031215612bb057600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612bda57600080fd5b612be383612ae4565b946020939093013593505050565b600060608284031215612c0357600080fd5b50919050565b60008083601f840112612c1b57600080fd5b50813567ffffffffffffffff811115612c3357600080fd5b6020830191508360208260051b850101111561226057600080fd5b60008060008060008060608789031215612c6757600080fd5b863567ffffffffffffffff80821115612c7f57600080fd5b612c8b8a838b01612c09565b90985096506020890135915080821115612ca457600080fd5b612cb08a838b01612c09565b90965094506040890135915080821115612cc957600080fd5b50612cd689828a01612c09565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b81811015612d2057835183529284019291840191600101612d04565b50909695505050505050565b600060208284031215612d3e57600080fd5b8135612ac481612b0e565b60008060408385031215612d5c57600080fd5b82359150612d6c60208401612ae4565b90509250929050565b600080600060408486031215612d8a57600080fd5b833567ffffffffffffffff811115612da157600080fd5b612dad86828701612c09565b909790965060209590950135949350505050565b60008060208385031215612dd457600080fd5b823567ffffffffffffffff811115612deb57600080fd5b612df785828601612c09565b90969095509350505050565b60008060408385031215612e1657600080fd5b612b4183612ae4565b60008060408385031215612e3257600080fd5b8235612be381612b0e565b60008060408385031215612e5057600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b610120810160048b10612e9857634e487b7160e01b600052602160045260246000fd5b9981526001600160a01b0398909816602089015260408801969096526060870194909452608086019290925260a085015260c084015260e08301526101009091015290565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a8c57610a8c612edd565b600060208284031215612f1c57600080fd5b5051919050565b600060208284031215612f3557600080fd5b81518015158114612ac457600080fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135612f7081612b0e565b612f7a8183612f45565b506020820135612f8981612b0e565b612f968160018401612f45565b506040820135612fa581612b0e565b610b7b8160028401612f45565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b602080825260129082015271086deead8c840dcdee840e6cadcc8408aa8960731b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601190820152700496e76616c6964206f776e65727368697607c1b604082015260600190565b6020808252600c908201526b139bd91948195e1c1a5c995960a21b604082015260600190565b6020808252601c908201527f496e76616c69642045746865722076616c75652070726f766964656400000000604082015260600190565b80820180821115610a8c57610a8c612edd565b81810381811115610a8c57610a8c612edd565b6000816130fe576130fe612edd565b506000190190565b634e487b7160e01b600052601260045260246000fd5b60008261313957634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161315057613150612edd565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131a75784516001600160a01b031683529383019391830191600101613182565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212207b57277194e0475d022c085c669c7c62ee57b0520fa06526469cfe851de1e90364736f6c6343000811003360c06040526ec097ce7bc90715b34b9f1000000000600a5534801561002357600080fd5b50604051610faf380380610faf833981016040819052610042916100b1565b61004b33610061565b61005482610061565b3360805260a052506100eb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100c457600080fd5b82516001600160a01b03811681146100db57600080fd5b6020939093015192949293505050565b60805160a051610e9161011e6000396000610a740152600081816103550152818161059301526107ee0152610e916000f3fe6080604052600436106100fe5760003560e01c8063885e6d8411610095578063ce7c2ac211610064578063ce7c2ac214610284578063d0e30db0146102f6578063e2d2e219146102fe578063efca2eed14610314578063f2fde38b1461032a57600080fd5b8063885e6d84146102065780638da5cb5b14610226578063997664d71461024e578063a5978c661461026457600080fd5b80635319504a116100d15780635319504a14610184578063690d8320146101a4578063715018a6146101c457806377dd2037146101d957600080fd5b806311ce023d1461010357806339d4d6861461012c5780633a98ef391461014e5780633aeac4e114610164575b600080fd5b34801561010f57600080fd5b50610119600a5481565b6040519081526020015b60405180910390f35b34801561013857600080fd5b5061014c610147366004610caa565b61034a565b005b34801561015a57600080fd5b5061011960065481565b34801561017057600080fd5b5061014c61017f366004610cd6565b61049a565b34801561019057600080fd5b5061014c61019f366004610d0f565b610588565b3480156101b057600080fd5b5061014c6101bf366004610d0f565b61072f565b3480156101d057600080fd5b5061014c6107cf565b3480156101e557600080fd5b506101196101f4366004610d0f565b60046020526000908152604090205481565b34801561021257600080fd5b5061014c610221366004610d0f565b6107e3565b34801561023257600080fd5b506000546040516001600160a01b039091168152602001610123565b34801561025a57600080fd5b5061011960075481565b34801561027057600080fd5b5061011961027f366004610d0f565b6108d7565b34801561029057600080fd5b506102ce61029f366004610d0f565b600560205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610123565b61014c61096f565b34801561030a57600080fd5b5061011960095481565b34801561032057600080fd5b5061011960085481565b34801561033657600080fd5b5061014c610345366004610d0f565b6109c7565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461037f57600080fd5b6001600160a01b03821660009081526005602052604081205490036103fa57600180546001600160a01b03841660008181526002602052604081208390558284018455929092527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191690911790555b6006805490600061040a83610d49565b90915550506001600160a01b038216600090815260056020526040812080549161043383610d49565b90915550506001600160a01b0382166000908152600560205260409020600481018290554260038201819055905461046b9183610a40565b6001600160a01b03831660009081526005602052604090206001018190551561049657610496610d62565b5050565b6104a2610ad8565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190610d78565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561055f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105839190610d91565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105bd57600080fd5b60006105c8826108d7565b90508015610496576001600160a01b0382166000908152600560205260409020805460038201546004909201546105ff9290610a40565b6001600160a01b0383166000908152600560205260408120600181019290925560029091018054839290610634908490610db3565b92505081905550806008600082825461064d9190610db3565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d806000811461069d576040519150601f19603f3d011682016040523d82523d6000602084013e6106a2565b606091505b50509050806106ed5760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260046020526040902054610711908390610db3565b6001600160a01b038416600090815260046020526040902055505050565b610737610ad8565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610784576040519150601f19603f3d011682016040523d82523d6000602084013e610789565b606091505b50509050806104965760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064016106e4565b6107d7610ad8565b6107e16000610b32565b565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461081857600080fd5b6001600160a01b0381166000908152600560205260409020546001036108415761084181610b82565b6006805490600061085183610dcc565b90915550506001600160a01b03811660009081526005602052604090208054600390910154610881919080610a40565b6001600160a01b03821660009081526005602052604081206001810192909255815491906108ae83610dcc565b90915550506001600160a01b031660009081526005602052604081206003810182905560040155565b6001600160a01b03811660009081526005602052604081205481036108fe57506000919050565b6001600160a01b03821660009081526005602052604081208054600382015460049092015461092d9290610a40565b6001600160a01b03841660009081526005602052604090206001015490915080821161095d575060009392505050565b6109678183610de3565b949350505050565b610977610ad8565b6000349050806007600082825461098e9190610db3565b9091555050600654600a546109a4908390610df6565b6109ae9190610e0d565b600960008282546109bf9190610db3565b909155505050565b6109cf610ad8565b6001600160a01b038116610a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e4565b610a3d81610b32565b50565b600042821115610a4e574291505b6000600a5460095486610a619190610df6565b610a6b9190610e0d565b90506000610a997f000000000000000000000000000000000000000000000000000000000000000086610db3565b90506000610aa78683610de3565b90506000610ab58787610de3565b905081610ac28286610df6565b610acc9190610e0d565b98975050505050505050565b6000546001600160a01b031633146107e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60018054610b91908290610de3565b81548110610ba157610ba1610e2f565b60009182526020808320909101546001600160a01b0384811684526002909252604090922054600180549290931692918110610bdf57610bdf610e2f565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260029182905260408120546001805491939291610c2a908290610de3565b81548110610c3a57610c3a610e2f565b60009182526020808320909101546001600160a01b031683528201929092526040019020556001805480610c7057610c70610e45565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6001600160a01b0381168114610a3d57600080fd5b60008060408385031215610cbd57600080fd5b8235610cc881610c95565b946020939093013593505050565b60008060408385031215610ce957600080fd5b8235610cf481610c95565b91506020830135610d0481610c95565b809150509250929050565b600060208284031215610d2157600080fd5b8135610d2c81610c95565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600060018201610d5b57610d5b610d33565b5060010190565b634e487b7160e01b600052600160045260246000fd5b600060208284031215610d8a57600080fd5b5051919050565b600060208284031215610da357600080fd5b81518015158114610d2c57600080fd5b80820180821115610dc657610dc6610d33565b92915050565b600081610ddb57610ddb610d33565b506000190190565b81810381811115610dc657610dc6610d33565b8082028115828204841417610dc657610dc6610d33565b600082610e2a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212207018f3a0bbcffcf829fb036b147dca2d74efe088f1432183d74194b5e208d32e64736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c40b44792710d89cdae0b2c21c5aec9257cd2cd9

Deployed Bytecode

0x6080604052600436106103a65760003560e01c8063715018a6116101e7578063a75dff841161010d578063dd395c63116100a0578063ee7bf5e21161006f578063ee7bf5e214610d2d578063f2fde38b14610d4e578063f887ea4014610d6e578063f8b45b0514610da257600080fd5b8063dd395c6314610c9f578063dd62ed3e14610cbf578063dec1cfc414610cf7578063e35a3d7c14610d1757600080fd5b8063af06795a116100dc578063af06795a14610c1e578063b55b8e0714610c3e578063c2e5ec0414610c5f578063cdae6b7a14610c7f57600080fd5b8063a75dff8414610b6d578063a8aa1b3114610b96578063a9059cbb14610bca578063ad5c464814610bea57600080fd5b806395d89b41116101855780639dc29fac116101545780639dc29fac14610af35780639fd6db1214610b13578063a0712d6814610b2d578063a0d2758414610b4d57600080fd5b806395d89b411461098857806399c8d556146109b95780639af1d35a146109da5780639cece12e14610ac357600080fd5b8063880934fd116101c1578063880934fd146108e657806389a30271146109065780638da5cb5b1461093a5780639571a07d1461095857600080fd5b8063715018a614610881578063760aa73314610896578063807fb8c5146108b657600080fd5b80633aeac4e1116102cc578063604aea6b1161026a578063682373291161023957806368237329146107fe578063690d8320146108145780636b6c8cbc1461083457806370a082311461085457600080fd5b8063604aea6b14610789578063658d4b7f146107a957806366c4390d146107c9578063677a1173146107de57600080fd5b806348b98ef5116102a657806348b98ef5146107095780634ada218b1461072a5780634d7547151461074a5780635d0044ca1461076957600080fd5b80633aeac4e11461069f5780633f4218e0146106bf5780633fc645b5146106ef57600080fd5b80631ff7637f1161034457806336203f481161031357806336203f481461060c57806336c3f71a1461062157806337bfc1ef1461065157806338db59541461067f57600080fd5b80631ff7637f1461058557806323b872dd146105a5578063313ce567146105c5578063319f5f6a146105ec57600080fd5b8063095ea7b311610380578063095ea7b3146104555780630adfdcb9146104855780630fb896a81461054d57806318160ddd1461056f57600080fd5b806301346266146103b2578063069f22ec146103ef57806306fdde031461041357600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506004546103d2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fb57600080fd5b5061040560195481565b6040519081526020016103e6565b34801561041f57600080fd5b506104486040518060400160405280600981526020016813595c99d9541bdbdb60ba1b81525081565b6040516103e69190612797565b34801561046157600080fd5b506104756104703660046127fa565b610db8565b60405190151581526020016103e6565b34801561049157600080fd5b50600c54600d54600e54600f546010546011546012546013546014546015546016546104e29a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016103e6565b34801561055957600080fd5b5061056d610568366004612826565b610e25565b005b34801561057b57600080fd5b5061040560015481565b34801561059157600080fd5b5061056d6105a036600461285c565b610e5d565b3480156105b157600080fd5b506104756105c0366004612879565b610e77565b3480156105d157600080fd5b506105da601281565b60405160ff90911681526020016103e6565b3480156105f857600080fd5b5061056d6106073660046128ca565b610ee9565b34801561061857600080fd5b5061056d610f11565b34801561062d57600080fd5b5061047561063c366004612826565b600b6020526000908152604090205460ff1681565b34801561065d57600080fd5b5060185461066c9061ffff1681565b60405161ffff90911681526020016103e6565b34801561068b57600080fd5b5061056d61069a366004612826565b610f26565b3480156106ab57600080fd5b5061056d6106ba3660046128e7565b610faa565b3480156106cb57600080fd5b506104756106da366004612826565b60086020526000908152604090205460ff1681565b3480156106fb57600080fd5b50601d546104759060ff1681565b34801561071557600080fd5b5060185461047590600160201b900460ff1681565b34801561073657600080fd5b50601b546104759062010000900460ff1681565b34801561075657600080fd5b50601b5461047590610100900460ff1681565b34801561077557600080fd5b5061056d610784366004612920565b611093565b34801561079557600080fd5b5061056d6107a4366004612939565b6110a0565b3480156107b557600080fd5b5061056d6107c43660046129bc565b611118565b3480156107d557600080fd5b5061056d61114b565b3480156107ea57600080fd5b5061056d6107f9366004612920565b61115f565b34801561080a57600080fd5b5061066c61271081565b34801561082057600080fd5b5061056d61082f366004612826565b61117f565b34801561084057600080fd5b5061047561084f3660046127fa565b611207565b34801561086057600080fd5b5061040561086f366004612826565b60026020526000908152604090205481565b34801561088d57600080fd5b5061056d611383565b3480156108a257600080fd5b5061056d6108b13660046129ea565b611397565b3480156108c257600080fd5b506104756108d1366004612826565b60096020526000908152604090205460ff1681565b3480156108f257600080fd5b5061056d61090136600461285c565b6113bd565b34801561091257600080fd5b506103d27f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b34801561094657600080fd5b506000546001600160a01b03166103d2565b34801561096457600080fd5b50610475610973366004612826565b60076020526000908152604090205460ff1681565b34801561099457600080fd5b5061044860405180604001604052806005815260200164135413d3d360da1b81525081565b3480156109c557600080fd5b5060185461066c9062010000900461ffff1681565b3480156109e657600080fd5b50601754610a5d9061ffff80821691620100008104821691600160201b820481169166010000000000008104821691600160401b8204811691600160501b8104821691600160601b8204811691600160701b8104821691600160801b8204811691600160901b8104821691600160a01b909104168b565b6040805161ffff9c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016103e6565b348015610acf57600080fd5b50610475610ade366004612826565b600a6020526000908152604090205460ff1681565b348015610aff57600080fd5b50610475610b0e3660046127fa565b611506565b348015610b1f57600080fd5b50601b546104759060ff1681565b348015610b3957600080fd5b5061056d610b48366004612920565b611605565b348015610b5957600080fd5b5061056d610b68366004612a07565b6116a4565b348015610b7957600080fd5b50601b546103d2906501000000000090046001600160a01b031681565b348015610ba257600080fd5b506103d27f000000000000000000000000c628144075b311a37671eee9d59b1e5021ceacd581565b348015610bd657600080fd5b50610475610be53660046127fa565b6116d2565b348015610bf657600080fd5b506103d27f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610c2a57600080fd5b5061056d610c393660046129bc565b6116df565b348015610c4a57600080fd5b50601b54610475906301000000900460ff1681565b348015610c6b57600080fd5b5061056d610c7a3660046129ea565b611712565b348015610c8b57600080fd5b5061056d610c9a3660046129bc565b611736565b348015610cab57600080fd5b5061056d610cba3660046129bc565b611769565b348015610ccb57600080fd5b50610405610cda3660046128e7565b600360209081526000928352604080842090915290825290205481565b348015610d0357600080fd5b5061056d610d123660046129ea565b61179c565b348015610d2357600080fd5b50610405601a5481565b348015610d3957600080fd5b50601b5461047590600160201b900460ff1681565b348015610d5a57600080fd5b5061056d610d69366004612826565b6117c3565b348015610d7a57600080fd5b506103d27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610dae57600080fd5b5061040560065481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e139086815260200190565b60405180910390a35060015b92915050565b610e2d61183c565b601b80546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b610e6561183c565b80600c610e728282612a69565b505050565b6001600160a01b03831660009081526003602090815260408083203384529091528120546000198114610ed357610eae8382612b84565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b610ede858585611896565b9150505b9392505050565b610ef161183c565b6018805461ffff909216620100000263ffff000019909216919091179055565b610f1961183c565b601b805461ff0019169055565b610f2e61183c565b600480546001600160a01b039283166001600160a01b0319918216811790925560058054909116821781556000918252600760209081526040808420805460ff19908116600190811790925584548716865260088452828620805482168317905593549095168452600990915290912080549091169091179055565b610fb261183c565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190612b97565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561106f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e729190612bb0565b61109b61183c565b600655565b6110a861183c565b60005b81811015610e72576001600b60008585858181106110cb576110cb612bcd565b90506020020160208101906110e09190612826565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561111181612be3565b90506110ab565b61112061183c565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b61115361183c565b601b805460ff19169055565b61116761183c565b61117981670de0b6b3a7640000612bfc565b601c5550565b61118761183c565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b50509050806112035760405162461bcd60e51b81526004016111fa90612c13565b60405180910390fd5b5050565b6004546000906001600160a01b031633146112725760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204d65726765204e6f646520636f6e74726163742063616e60448201526410313ab93760d91b60648201526084016111fa565b6001600160a01b0383166000908152600260205260409020548211156112aa5760405162461bcd60e51b81526004016111fa90612c3f565b6001600160a01b03831660009081526003602090815260408083203384529091529020546000198114611306576112e18382612b84565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b82600160008282546113189190612b84565b90915550506001600160a01b03841660009081526002602052604081208054859290611345908490612b84565b90915550506040518381526000906001600160a01b03861690600080516020612f4d8339815191529060200160405180910390a35060019392505050565b61138b61183c565b6113956000611d35565b565b61139f61183c565b601b805491151563010000000263ff00000019909216919091179055565b6113c561183c565b8060176113d28282612c90565b506113e79050610160820161014083016128ca565b6113f9610140830161012084016128ca565b61140b610120840161010085016128ca565b61141c610100850160e086016128ca565b61142c60e0860160c087016128ca565b61143c60c0870160a088016128ca565b61144c60a08801608089016128ca565b61145c6080890160608a016128ca565b61146c60608a0160408b016128ca565b61147c60408b0160208c016128ca565b61148960208c018c6128ca565b6114939190612e84565b61149d9190612e84565b6114a79190612e84565b6114b19190612e84565b6114bb9190612e84565b6114c59190612e84565b6114cf9190612e84565b6114d99190612e84565b6114e39190612e84565b6114ed9190612e84565b6018805461ffff191661ffff9290921691909117905550565b600061151061183c565b601b54610100900460ff1661155d5760405162461bcd60e51b8152602060048201526013602482015272109d5c9b9a5b99c81a5cc8191a5cd8589b1959606a1b60448201526064016111fa565b6001600160a01b0383166000908152600260205260409020548211156115955760405162461bcd60e51b81526004016111fa90612c3f565b81600160008282546115a79190612b84565b90915550506001600160a01b038316600090815260026020526040812080548492906115d4908490612b84565b90915550506040518281526000906001600160a01b03851690600080516020612f4d83398151915290602001610e13565b61160d61183c565b601b5460ff166116555760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b60448201526064016111fa565b80600160008282546116679190612ea6565b909155505033600081815260026020908152604080832080548601905551848152600080516020612f4d833981519152910160405180910390a350565b6116ac61183c565b60188054931515600160201b0264ff000000001990941693909317909255601955601a55565b6000610ee2338484611896565b6116e761183c565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b61171a61183c565b601b8054911515620100000262ff000019909216919091179055565b61173e61183c565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61177161183c565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6117a461183c565b601b8054911515600160201b0264ff0000000019909216919091179055565b6117cb61183c565b6001600160a01b0381166118305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111fa565b61183981611d35565b50565b6000546001600160a01b031633146113955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111fa565b601d5460009060ff16156118b6576118af848484611d85565b9050610ee2565b601b5460009062010000900460ff161580156118eb57506001600160a01b03841660009081526007602052604090205460ff16155b1561195857601b546301000000900460ff161561192b576001600160a01b0384166000908152600b602052604090205460ff16151560010361192b575060015b601b54600160201b900460ff161561195357601c5461194985611ddc565b1115611953575060015b61195c565b5060015b808061198057506001600160a01b03851660009081526007602052604090205460ff165b6119cc5760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c656400000060448201526064016111fa565b6001600160a01b0384166000908152600a602052604081205460ff1680611a2457507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b0316145b905080158015611a4d57506001600160a01b03851660009081526009602052604090205460ff16155b15611ac7576006546001600160a01b038616600090815260026020526040902054611a79908690612ea6565b1115611ac75760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e2074726967676572656400000060448201526064016111fa565b808015611ad65750601a548410155b8015611af25750336000908152600a602052604090205460ff16155b8015611b015750601d5460ff16155b8015611b165750601854600160201b900460ff165b8015611b3357506019543060009081526002602052604090205410155b15611b4057611b40611e56565b6001600160a01b03861660009081526002602052604081208054869290611b68908490612b84565b90915550506001600160a01b0386166000908152600a6020526040902054849060ff1680611bc757507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316876001600160a01b0316145b80611c2557506001600160a01b0386166000908152600a602052604090205460ff1680611c2557507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316866001600160a01b0316145b611c30576000611c72565b6001600160a01b03871660009081526008602052604090205460ff16158015611c7257506001600160a01b03861660009081526008602052604090205460ff16155b15611c8857611c8187866126a6565b9050611cdc565b6001600160a01b03871660009081526008602052604090205460ff16158015611cca57506001600160a01b03861660009081526008602052604090205460ff16155b15611cdc57611cd98786612728565b90505b6001600160a01b0380871660008181526002602052604090819020805485019055519091891690600080516020612f4d83398151915290611d209085815260200190565b60405180910390a35060019695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316600090815260026020526040812080548391908390611daf908490612b84565b9091555050506001600160a01b038216600090815260026020526040902080548201905560019392505050565b601b546040516370a0823160e01b81526001600160a01b038381166004830152600092650100000000009004169081906370a0823190602401602060405180830381865afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190612b97565b601d805460ff1916600117905560408051600380825260808201909252479160009190602082016060803683370190505090503081600081518110611e9d57611e9d612bcd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600181518110611ef157611ef1612bcd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600281518110611f4557611f45612bcd565b6001600160a01b039283166020918202929092018101919091523060008181526002909252604080832054905163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9094169363791ac94793611fba9390918791904290600401612eb9565b600060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b5050505060008247611ffa9190612b84565b905061271081111561269757600c546017546000916001600160a01b0316906127109061202b9061ffff1685612bfc565b6120359190612f2a565b604051600081818185875af1925050503d8060008114612071576040519150601f19603f3d011682016040523d82523d6000602084013e612076565b606091505b505080915050806120995760405162461bcd60e51b81526004016111fa90612c13565b600d546017546001600160a01b0390911690612710906120c39062010000900461ffff1685612bfc565b6120cd9190612f2a565b604051600081818185875af1925050503d8060008114612109576040519150601f19603f3d011682016040523d82523d6000602084013e61210e565b606091505b505080915050806121315760405162461bcd60e51b81526004016111fa90612c13565b600e546017546001600160a01b03909116906127109061215c90600160201b900461ffff1685612bfc565b6121669190612f2a565b604051600081818185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b505080915050806121ca5760405162461bcd60e51b81526004016111fa90612c13565b600f546017546001600160a01b0390911690612710906121f8906601000000000000900461ffff1685612bfc565b6122029190612f2a565b604051600081818185875af1925050503d806000811461223e576040519150601f19603f3d011682016040523d82523d6000602084013e612243565b606091505b505080915050806122665760405162461bcd60e51b81526004016111fa90612c13565b6010546017546001600160a01b03909116906127109061229190600160401b900461ffff1685612bfc565b61229b9190612f2a565b604051600081818185875af1925050503d80600081146122d7576040519150601f19603f3d011682016040523d82523d6000602084013e6122dc565b606091505b505080915050806122ff5760405162461bcd60e51b81526004016111fa90612c13565b6011546017546001600160a01b03909116906127109061232a90600160501b900461ffff1685612bfc565b6123349190612f2a565b604051600081818185875af1925050503d8060008114612370576040519150601f19603f3d011682016040523d82523d6000602084013e612375565b606091505b505080915050806123985760405162461bcd60e51b81526004016111fa90612c13565b6012546017546001600160a01b0390911690612710906123c390600160601b900461ffff1685612bfc565b6123cd9190612f2a565b604051600081818185875af1925050503d8060008114612409576040519150601f19603f3d011682016040523d82523d6000602084013e61240e565b606091505b505080915050806124315760405162461bcd60e51b81526004016111fa90612c13565b6013546017546001600160a01b03909116906127109061245c90600160701b900461ffff1685612bfc565b6124669190612f2a565b604051600081818185875af1925050503d80600081146124a2576040519150601f19603f3d011682016040523d82523d6000602084013e6124a7565b606091505b505080915050806124ca5760405162461bcd60e51b81526004016111fa90612c13565b6014546017546001600160a01b0390911690612710906124f590600160801b900461ffff1685612bfc565b6124ff9190612f2a565b604051600081818185875af1925050503d806000811461253b576040519150601f19603f3d011682016040523d82523d6000602084013e612540565b606091505b505080915050806125635760405162461bcd60e51b81526004016111fa90612c13565b6015546017546001600160a01b03909116906127109061258e90600160901b900461ffff1685612bfc565b6125989190612f2a565b604051600081818185875af1925050503d80600081146125d4576040519150601f19603f3d011682016040523d82523d6000602084013e6125d9565b606091505b505080915050806125fc5760405162461bcd60e51b81526004016111fa90612c13565b6016546017546001600160a01b03909116906127109061262790600160a01b900461ffff1685612bfc565b6126319190612f2a565b604051600081818185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b505080915050806126955760405162461bcd60e51b81526004016111fa90612c13565b505b5050601d805460ff1916905550565b6018546000908190612710906126c09061ffff1685612bfc565b6126ca9190612f2a565b306000818152600260205260409081902080548401905551919250906001600160a01b03861690600080516020612f4d8339815191529061270e9085815260200190565b60405180910390a36127208184612b84565b949350505050565b6018546000908190612710906127489062010000900461ffff1685612bfc565b6127529190612f2a565b905080600160008282546127669190612b84565b90915550506040518381526000906001600160a01b03861690600080516020612f4d8339815191529060200161270e565b600060208083528351808285015260005b818110156127c4578581018301518582016040015282016127a8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461183957600080fd5b6000806040838503121561280d57600080fd5b8235612818816127e5565b946020939093013593505050565b60006020828403121561283857600080fd5b8135610ee2816127e5565b6000610160828403121561285657600080fd5b50919050565b6000610160828403121561286f57600080fd5b610ee28383612843565b60008060006060848603121561288e57600080fd5b8335612899816127e5565b925060208401356128a9816127e5565b929592945050506040919091013590565b61ffff8116811461183957600080fd5b6000602082840312156128dc57600080fd5b8135610ee2816128ba565b600080604083850312156128fa57600080fd5b8235612905816127e5565b91506020830135612915816127e5565b809150509250929050565b60006020828403121561293257600080fd5b5035919050565b6000806020838503121561294c57600080fd5b823567ffffffffffffffff8082111561296457600080fd5b818501915085601f83011261297857600080fd5b81358181111561298757600080fd5b8660208260051b850101111561299c57600080fd5b60209290920196919550909350505050565b801515811461183957600080fd5b600080604083850312156129cf57600080fd5b82356129da816127e5565b91506020830135612915816129ae565b6000602082840312156129fc57600080fd5b8135610ee2816129ae565b600080600060608486031215612a1c57600080fd5b8335612a27816129ae565b95602085013595506040909401359392505050565b60008135610e1f816127e5565b80546001600160a01b0319166001600160a01b0392909216919091179055565b612a7b612a7583612a3c565b82612a49565b612a93612a8a60208401612a3c565b60018301612a49565b612aab612aa260408401612a3c565b60028301612a49565b612ac3612aba60608401612a3c565b60038301612a49565b612adb612ad260808401612a3c565b60048301612a49565b612af3612aea60a08401612a3c565b60058301612a49565b612b0b612b0260c08401612a3c565b60068301612a49565b612b23612b1a60e08401612a3c565b60078301612a49565b612b3c612b336101008401612a3c565b60088301612a49565b612b55612b4c6101208401612a3c565b60098301612a49565b611203612b656101408401612a3c565b600a8301612a49565b634e487b7160e01b600052601160045260246000fd5b81810381811115610e1f57610e1f612b6e565b600060208284031215612ba957600080fd5b5051919050565b600060208284031215612bc257600080fd5b8151610ee2816129ae565b634e487b7160e01b600052603260045260246000fd5b600060018201612bf557612bf5612b6e565b5060010190565b8082028115828204841417610e1f57610e1f612b6e565b602080825260129082015271086deead8c840dcdee840e6cadcc8408aa8960731b604082015260600190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207468616e20616e206163636f756e746040820152632068617360e01b606082015260800190565b60008135610e1f816128ba565b8135612c9b816128ba565b61ffff811661ffff1983541617825550612cd4612cba60208401612c83565b825463ffff0000191660109190911b63ffff000016178255565b612d01612ce360408401612c83565b825465ffff00000000191660209190911b65ffff0000000016178255565b612d32612d1060608401612c83565b825467ffff000000000000191660309190911b67ffff00000000000016178255565b612d67612d4160808401612c83565b825469ffff0000000000000000191660409190911b69ffff000000000000000016178255565b612d96612d7660a08401612c83565b82805461ffff60501b191660509290921b61ffff60501b16919091179055565b612dc5612da560c08401612c83565b82805461ffff60601b191660609290921b61ffff60601b16919091179055565b612df4612dd460e08401612c83565b82805461ffff60701b191660709290921b61ffff60701b16919091179055565b612e24612e046101008401612c83565b82805461ffff60801b191660809290921b61ffff60801b16919091179055565b612e54612e346101208401612c83565b82805461ffff60901b191660909290921b61ffff60901b16919091179055565b611203612e646101408401612c83565b82805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b61ffff818116838216019080821115612e9f57612e9f612b6e565b5092915050565b80820180821115610e1f57610e1f612b6e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f095784516001600160a01b031683529383019391830191600101612ee4565b50506001600160a01b03969096166060850152505050608001529392505050565b600082612f4757634e487b7160e01b600052601260045260246000fd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122078f885f2847f52703cae8b0c84b00564f3fbac8a90b8a42951a66dcf49c3077f64736f6c63430008110033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c40b44792710d89cdae0b2c21c5aec9257cd2cd9

-----Decoded View---------------
Arg [0] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _usdc (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : _safeBank (address): 0xC40B44792710d89CDaE0b2C21C5aEc9257cd2cD9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 000000000000000000000000c40b44792710d89cdae0b2c21c5aec9257cd2cd9


Deployed Bytecode Sourcemap

38045:15577:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38569:30;;;;;;;;;;-1:-1:-1;38569:30:0;;;;-1:-1:-1;;;;;38569:30:0;;;;;;-1:-1:-1;;;;;208:32:1;;;190:51;;178:2;163:18;38569:30:0;;;;;;;;39312:44;;;;;;;;;;;;;;;;;;;398:25:1;;;386:2;371:18;39312:44:0;252:177:1;38102:41:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38102:41:0;;;;;;;;;;;;:::i;43314:220::-;;;;;;;;;;-1:-1:-1;43314:220:0;;;;;:::i;:::-;;:::i;:::-;;;1608:14:1;;1601:22;1583:41;;1571:2;1556:18;43314:220:0;1443:187:1;38987:40:0;;;;;;;;;;-1:-1:-1;38987:40:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38987:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2119:15:1;;;2101:34;;2171:15;;;2166:2;2151:18;;2144:43;2223:15;;;2203:18;;;2196:43;;;;2275:15;;;2270:2;2255:18;;2248:43;2328:15;;;2322:3;2307:19;;2300:44;2381:15;;;2081:3;2360:19;;2353:44;2434:15;;2428:3;2413:19;;2406:44;2487:15;;2481:3;2466:19;;2459:44;2540:15;;2534:3;2519:19;;2512:44;2593:15;;2587:3;2572:19;;2565:44;2646:16;;;2640:3;2625:19;;2618:45;2050:3;2035:19;38987:40:0;1635:1034:1;52309:112:0;;;;;;;;;;-1:-1:-1;52309:112:0;;;;;:::i;:::-;;:::i;:::-;;38238:39;;;;;;;;;;;;;;;;51841:139;;;;;;;;;;-1:-1:-1;51841:139:0;;;;;:::i;:::-;;:::i;44163:394::-;;;;;;;;;;-1:-1:-1;44163:394:0;;;;;:::i;:::-;;:::i;38196:35::-;;;;;;;;;;;;38229:2;38196:35;;;;;3981:4:1;3969:17;;;3951:36;;3939:2;3924:18;38196:35:0;3809:184:1;51988:77:0;;;;;;;;;;-1:-1:-1;51988:77:0;;;;;:::i;:::-;;:::i;53117:97::-;;;;;;;;;;;;;:::i;38897:47::-;;;;;;;;;;-1:-1:-1;38897:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39063:28;;;;;;;;;;-1:-1:-1;39063:28:0;;;;;;;;;;;4544:6:1;4532:19;;;4514:38;;4502:2;4487:18;39063:28:0;4370:188:1;52696:308:0;;;;;;;;;;-1:-1:-1;52696:308:0;;;;;:::i;:::-;;:::i;53426:156::-;;;;;;;;;;-1:-1:-1;53426:156:0;;;;;:::i;:::-;;:::i;38745:43::-;;;;;;;;;;-1:-1:-1;38745:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39766:37;;;;;;;;;;-1:-1:-1;39766:37:0;;;;;;;;39267:38;;;;;;;;;;-1:-1:-1;39267:38:0;;;;-1:-1:-1;;;39267:38:0;;;;;;39505:34;;;;;;;;;;-1:-1:-1;39505:34:0;;;;;;;;;;;39465:33;;;;;;;;;;-1:-1:-1;39465:33:0;;;;;;;;;;;50298:102;;;;;;;;;;-1:-1:-1;50298:102:0;;;;;:::i;:::-;;:::i;43909:246::-;;;;;;;;;;-1:-1:-1;43909:246:0;;;;;:::i;:::-;;:::i;50549:123::-;;;;;;;;;;-1:-1:-1;50549:123:0;;;;;:::i;:::-;;:::i;53012:97::-;;;;;;;;;;;;;:::i;52429:146::-;;;;;;;;;;-1:-1:-1;52429:146:0;;;;;:::i;:::-;;:::i;39223:35::-;;;;;;;;;;;;39252:6;39223:35;;53222:196;;;;;;;;;;-1:-1:-1;53222:196:0;;;;;:::i;:::-;;:::i;42697:609::-;;;;;;;;;;-1:-1:-1;42697:609:0;;;;;:::i;:::-;;:::i;38286:44::-;;;;;;;;;;-1:-1:-1;38286:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;15438:103;;;;;;;;;;;;;:::i;52073:108::-;;;;;;;;;;-1:-1:-1;52073:108:0;;;;;:::i;:::-;;:::i;38795:43::-;;;;;;;;;;-1:-1:-1;38795:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51336:497;;;;;;;;;;-1:-1:-1;51336:497:0;;;;;:::i;:::-;;:::i;38445:28::-;;;;;;;;;;;;;;;14790:87;;;;;;;;;;-1:-1:-1;14836:7:0;14863:6;-1:-1:-1;;;;;14863:6:0;14790:87;;38690:48;;;;;;;;;;-1:-1:-1;38690:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38150:39;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38150:39:0;;;;;39150:23;;;;;;;;;;-1:-1:-1;39150:23:0;;;;;;;;;;;39034:22;;;;;;;;;;-1:-1:-1;39034:22:0;;;;;;;;;;;;;;;-1:-1:-1;;;39034:22:0;;;;;;;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;-1:-1:-1;;;39034:22:0;;;;;;;;;;7897:6:1;7930:15;;;7912:34;;7982:15;;;7977:2;7962:18;;7955:43;8034:15;;;8014:18;;;8007:43;;;;8086:15;;;8081:2;8066:18;;8059:43;8139:15;;;8133:3;8118:19;;8111:44;8192:15;;;8186:3;8171:19;;8164:44;8245:15;;8239:3;8224:19;;8217:44;8298:15;;8292:3;8277:19;;8270:44;8351:15;;8345:3;8330:19;;8323:44;8404:15;;8398:3;8383:19;;8376:44;8457:16;;;8451:3;8436:19;;8429:45;7874:3;7859:19;39034:22:0;7481:999:1;38845:45:0;;;;;;;;;;-1:-1:-1;38845:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42300:389;;;;;;;;;;-1:-1:-1;42300:389:0;;;;;:::i;:::-;;:::i;39425:33::-;;;;;;;;;;-1:-1:-1;39425:33:0;;;;;;;;42006:286;;;;;;;;;;-1:-1:-1;42006:286:0;;;;;:::i;:::-;;:::i;50942:386::-;;;;;;;;;;-1:-1:-1;50942:386:0;;;;;:::i;:::-;;:::i;39630:82::-;;;;;;;;;;-1:-1:-1;39630:82:0;;;;;;;-1:-1:-1;;;;;39630:82:0;;;38531:29;;;;;;;;;;;;;;;43542:160;;;;;;;;;;-1:-1:-1;43542:160:0;;;;;:::i;:::-;;:::i;38410:28::-;;;;;;;;;;;;;;;50408:133;;;;;;;;;;-1:-1:-1;50408:133:0;;;;;:::i;:::-;;:::i;39546:35::-;;;;;;;;;;-1:-1:-1;39546:35:0;;;;;;;;;;;52583:105;;;;;;;;;;-1:-1:-1;52583:105:0;;;;;:::i;:::-;;:::i;50811:123::-;;;;;;;;;;-1:-1:-1;50811:123:0;;;;;:::i;:::-;;:::i;50680:::-;;;;;;;;;;-1:-1:-1;50680:123:0;;;;;:::i;:::-;;:::i;38337:64::-;;;;;;;;;;-1:-1:-1;38337:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;52193:108;;;;;;;;;;-1:-1:-1;52193:108:0;;;;;:::i;:::-;;:::i;39363:53::-;;;;;;;;;;;;;;;;39588:35;;;;;;;;;;-1:-1:-1;39588:35:0;;;;-1:-1:-1;;;39588:35:0;;;;;;15696:201;;;;;;;;;;-1:-1:-1;15696:201:0;;;;;:::i;:::-;;:::i;38482:42::-;;;;;;;;;;;;;;;38647:34;;;;;;;;;;;;;;;;43314:220;43418:10;43391:4;43408:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;43408:31:0;;;;;;;;;;:41;;;43465:39;43391:4;;43408:31;;43465:39;;;;43442:7;398:25:1;;386:2;371:18;;252:177;43465:39:0;;;;;;;;-1:-1:-1;43522:4:0;43314:220;;;;;:::o;52309:112::-;14676:13;:11;:13::i;:::-;52385::::1;:28:::0;;-1:-1:-1;;;;;52385:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;52385:28:0;;::::1;::::0;;;::::1;::::0;;52309:112::o;51841:139::-;14676:13;:11;:13::i;:::-;51958:14;51942:13:::1;:30;51958:14:::0;51942:13;:30:::1;:::i;:::-;-1:-1:-1::0;;;51841:139:0:o;44163:394::-;-1:-1:-1;;;;;44335:18:0;;44300:4;44335:18;;;:9;:18;;;;;;;;44354:10;44335:30;;;;;;;;-1:-1:-1;;44380:28:0;;44376:111;;44458:17;44468:7;44458;:17;:::i;:::-;-1:-1:-1;;;;;44425:18:0;;;;;;:9;:18;;;;;;;;44444:10;44425:30;;;;;;;:50;44376:111;44506:43;44520:7;44529:10;44541:7;44506:13;:43::i;:::-;44499:50;;;44163:394;;;;;;:::o;51988:77::-;14676:13;:11;:13::i;:::-;52047:3:::1;:10:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;52047:10:0;;::::1;::::0;;;::::1;::::0;;51988:77::o;53117:97::-;14676:13;:11;:13::i;:::-;53184:14:::1;:22:::0;;-1:-1:-1;;53184:22:0::1;::::0;;53117:97::o;52696:308::-;14676:13;:11;:13::i;:::-;52778:9:::1;:22:::0;;-1:-1:-1;;;;;52778:22:0;;::::1;-1:-1:-1::0;;;;;;52778:22:0;;::::1;::::0;::::1;::::0;;;52811:16:::1;:37:::0;;;;::::1;::::0;::::1;::::0;;52778:9:::1;52861:34:::0;;;:16:::1;:34;::::0;;;;;;;:41;;-1:-1:-1;;52861:41:0;;::::1;52778:22:::0;52861:41;;::::1;::::0;;;52925:16;;;::::1;52913:29:::0;;:11:::1;:29:::0;;;;;:36;;;::::1;::::0;::::1;::::0;;52972:16;;;;::::1;52960:29:::0;;:11:::1;:29:::0;;;;;;:36;;;;::::1;::::0;;::::1;::::0;;52696:308::o;53426:156::-;14676:13;:11;:13::i;:::-;53542:31:::1;::::0;-1:-1:-1;;;53542:31:0;;53567:4:::1;53542:31;::::0;::::1;190:51:1::0;-1:-1:-1;;;;;53514:15:0;::::1;::::0;::::1;::::0;53530:10;;53514:15;;53542:16:::1;::::0;163:18:1;;53542:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53514:60;::::0;-1:-1:-1;;;;;;53514:60:0::1;::::0;;;;;;-1:-1:-1;;;;;11926:32:1;;;53514:60:0::1;::::0;::::1;11908:51:1::0;11975:18;;;11968:34;11881:18;;53514:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50298:102::-:0;14676:13;:11;:13::i;:::-;50370:9:::1;:22:::0;50298:102::o;43909:246::-;14676:13;:11;:13::i;:::-;44012:9:::1;44007:139;44027:27:::0;;::::1;44007:139;;;44112:4;44073:15;:36;44089:16;;44106:1;44089:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44073:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;44073:36:0;:43;;-1:-1:-1;;44073:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44131:3:::1;::::0;::::1;:::i;:::-;;;44007:139;;50549:123:::0;14676:13;:11;:13::i;:::-;-1:-1:-1;;;;;50634:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:30;;-1:-1:-1;;50634:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50549:123::o;53012:97::-;14676:13;:11;:13::i;:::-;53079:14:::1;:22:::0;;-1:-1:-1;;53079:22:0::1;::::0;;53012:97::o;52429:146::-;14676:13;:11;:13::i;:::-;52540:27:::1;:18:::0;52561:6:::1;52540:27;:::i;:::-;52520:17;:47:::0;-1:-1:-1;52429:146:0:o;53222:196::-;14676:13;:11;:13::i;:::-;53294:12:::1;53312:10;-1:-1:-1::0;;;;;53312:15:0::1;53335:21;53312:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53293:68;;;53380:7;53372:38;;;;-1:-1:-1::0;;;53372:38:0::1;;;;;;;:::i;:::-;;;;;;;;;53282:136;53222:196:::0;:::o;42697:609::-;42822:9;;42775:4;;-1:-1:-1;;;;;42822:9:0;42800:10;:32;42792:82;;;;-1:-1:-1;;;42792:82:0;;13467:2:1;42792:82:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:34;13525:18;;;13518:62;-1:-1:-1;;;13596:18:1;;;13589:35;13641:19;;42792:82:0;13265:401:1;42792:82:0;-1:-1:-1;;;;;42893:18:0;;;;;;:9;:18;;;;;;:29;-1:-1:-1;42893:29:0;42885:78;;;;-1:-1:-1;;;42885:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42994:18:0;;42976:15;42994:18;;;:9;:18;;;;;;;;43013:10;42994:30;;;;;;;;-1:-1:-1;;43039:28:0;;43035:111;;43117:17;43127:7;43117;:17;:::i;:::-;-1:-1:-1;;;;;43084:18:0;;;;;;:9;:18;;;;;;;;43103:10;43084:30;;;;;;;:50;43035:111;43173:7;43158:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;43193:18:0;;;;;;:9;:18;;;;;:29;;43215:7;;43193:18;:29;;43215:7;;43193:29;:::i;:::-;;;;-1:-1:-1;;43238:38:0;;398:25:1;;;43264:1:0;;-1:-1:-1;;;;;43238:38:0;;;-1:-1:-1;;;;;;;;;;;43238:38:0;386:2:1;371:18;43238:38:0;;;;;;;-1:-1:-1;43294:4:0;;42697:609;-1:-1:-1;;;42697:609:0:o;15438:103::-;14676:13;:11;:13::i;:::-;15503:30:::1;15530:1;15503:18;:30::i;:::-;15438:103::o:0;52073:108::-;14676:13;:11;:13::i;:::-;52147:15:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;52147:26:0;;::::1;::::0;;;::::1;::::0;;52073:108::o;51336:497::-;14676:13;:11;:13::i;:::-;51417:5;51410:4:::1;:12;51417:5:::0;51410:4;:12:::1;:::i;:::-;-1:-1:-1::0;51809:16:0::1;::::0;-1:-1:-1;51809:16:0;;;::::1;::::0;::::1;;:::i;:::-;51768:25;::::0;;;::::1;::::0;::::1;;:::i;:::-;51736:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;51707:13;::::0;;;::::1;::::0;::::1;;:::i;:::-;51669:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;51633:20;::::0;;;::::1;::::0;::::1;;:::i;:::-;51585:32;::::0;;;::::1;::::0;::::1;;:::i;:::-;51558:11;::::0;;;::::1;::::0;::::1;;:::i;:::-;51533:9;::::0;;;::::1;::::0;::::1;;:::i;:::-;51491:26;::::0;;;::::1;::::0;::::1;;:::i;:::-;51459:16;;::::0;::::1;:5:::0;:16:::1;:::i;:::-;:58;;;;:::i;:::-;:83;;;;:::i;:::-;:110;;;;:::i;:::-;:158;;;;:::i;:::-;:194;;;;:::i;:::-;:232;;;;:::i;:::-;:261;;;;:::i;:::-;:293;;;;:::i;:::-;:334;;;;:::i;:::-;:366;;;;:::i;:::-;51435:8;:390:::0;;-1:-1:-1;;51435:390:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;51336:497:0:o;42300:389::-;42376:4;14676:13;:11;:13::i;:::-;42401:14:::1;::::0;::::1;::::0;::::1;;;42393:46;;;::::0;-1:-1:-1;;;42393:46:0;;18103:2:1;42393:46:0::1;::::0;::::1;18085:21:1::0;18142:2;18122:18;;;18115:30;-1:-1:-1;;;18161:18:1;;;18154:49;18220:18;;42393:46:0::1;17901:343:1::0;42393:46:0::1;-1:-1:-1::0;;;;;42458:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;:29;-1:-1:-1;42458:29:0::1;42450:78;;;;-1:-1:-1::0;;;42450:78:0::1;;;;;;;:::i;:::-;42556:7;42541:11;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;42576:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;:29;;42598:7;;42576:18;:29:::1;::::0;42598:7;;42576:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;42621:38:0::1;::::0;398:25:1;;;42647:1:0::1;::::0;-1:-1:-1;;;;;42621:38:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;42621:38:0;386:2:1;371:18;42621:38:0::1;252:177:1::0;42006:286:0;14676:13;:11;:13::i;:::-;42075:14:::1;::::0;::::1;;42067:46;;;::::0;-1:-1:-1;;;42067:46:0;;18451:2:1;42067:46:0::1;::::0;::::1;18433:21:1::0;18490:2;18470:18;;;18463:30;-1:-1:-1;;;18509:18:1;;;18502:49;18568:18;;42067:46:0::1;18249:343:1::0;42067:46:0::1;42141:7;42126:11;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42194:10:0::1;42184:21;::::0;;;:9:::1;:21;::::0;;;;;;;:32;;;::::1;::::0;;42243:41;398:25:1;;;-1:-1:-1;;;;;;;;;;;42243:41:0;371:18:1;42243:41:0::1;;;;;;;42006:286:::0;:::o;50942:386::-;14676:13;:11;:13::i;:::-;51138:19:::1;:42:::0;;;::::1;;-1:-1:-1::0;;;51138:42:0::1;-1:-1:-1::0;;51138:42:0;;::::1;::::0;;;::::1;::::0;;;51191:21:::1;:46:::0;51248:34:::1;:72:::0;50942:386::o;43542:160::-;43624:4;43648:46;43662:10;43674;43686:7;43648:13;:46::i;50408:133::-;14676:13;:11;:13::i;:::-;-1:-1:-1;;;;;50498:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:35;;-1:-1:-1;;50498:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50408:133::o;52583:105::-;14676:13;:11;:13::i;:::-;52655:14:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;52655:25:0;;::::1;::::0;;;::::1;::::0;;52583:105::o;50811:123::-;14676:13;:11;:13::i;:::-;-1:-1:-1;;;;;50896:20:0;;;::::1;;::::0;;;:13:::1;:20;::::0;;;;:30;;-1:-1:-1;;50896:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50811:123::o;50680:::-;14676:13;:11;:13::i;:::-;-1:-1:-1;;;;;50765:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:30;;-1:-1:-1;;50765:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50680:123::o;52193:108::-;14676:13;:11;:13::i;:::-;52267:15:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;52267:26:0::1;-1:-1:-1::0;;52267:26:0;;::::1;::::0;;;::::1;::::0;;52193:108::o;15696:201::-;14676:13;:11;:13::i;:::-;-1:-1:-1;;;;;15785:22:0;::::1;15777:73;;;::::0;-1:-1:-1;;;15777:73:0;;18929:2:1;15777:73:0::1;::::0;::::1;18911:21:1::0;18968:2;18948:18;;;18941:30;19007:34;18987:18;;;18980:62;-1:-1:-1;;;19058:18:1;;;19051:36;19104:19;;15777:73:0::1;18727:402:1::0;15777:73:0::1;15861:28;15880:8;15861:18;:28::i;:::-;15696:201:::0;:::o;14955:132::-;14836:7;14863:6;-1:-1:-1;;;;;14863:6:0;3753:10;15019:23;15011:68;;;;-1:-1:-1;;;15011:68:0;;19336:2:1;15011:68:0;;;19318:21:1;;;19355:18;;;19348:30;19414:34;19394:18;;;19387:62;19466:18;;15011:68:0;19134:356:1;44565:2300:0;44714:17;;44693:4;;44714:17;;44710:102;;;44755:45;44771:7;44780:10;44792:7;44755:15;:45::i;:::-;44748:52;;;;44710:102;44862:14;;44822;;44862;;;;;44861:15;:48;;;;-1:-1:-1;;;;;;44881:28:0;;;;;;:16;:28;;;;;;;;44880:29;44861:48;44857:606;;;45001:15;;;;;;;44997:155;;;-1:-1:-1;;;;;45041:27:0;;;;;;:15;:27;;;;;;;;:35;;:27;:35;45037:100;;-1:-1:-1;45113:4:0;45037:100;45170:15;;-1:-1:-1;;;45170:15:0;;;;45166:250;;;45321:17;;45286:32;45307:10;45286:20;:32::i;:::-;:52;45282:119;;;-1:-1:-1;45376:4:0;45282:119;44857:606;;;-1:-1:-1;45456:4:0;44857:606;45483:9;:38;;;-1:-1:-1;;;;;;45496:25:0;;;;;;:16;:25;;;;;;;;45483:38;45475:80;;;;-1:-1:-1;;;45475:80:0;;19697:2:1;45475:80:0;;;19679:21:1;19736:2;19716:18;;;19709:30;19775:31;19755:18;;;19748:59;19824:18;;45475:80:0;19495:353:1;45475:80:0;-1:-1:-1;;;;;45580:25:0;;45568:9;45580:25;;;:13;:25;;;;;;;;;:58;;;45631:6;-1:-1:-1;;;;;45609:29:0;:10;-1:-1:-1;;;;;45609:29:0;;45580:58;45568:70;;45656:4;45655:5;:33;;;;-1:-1:-1;;;;;;45665:23:0;;;;;;:11;:23;;;;;;;;45664:24;45655:33;45651:154;;;45750:9;;-1:-1:-1;;;;;45714:21:0;;;;;;:9;:21;;;;;;:31;;45738:7;;45714:31;:::i;:::-;45713:46;;45705:88;;;;-1:-1:-1;;;45705:88:0;;20055:2:1;45705:88:0;;;20037:21:1;20094:2;20074:18;;;20067:30;20133:31;20113:18;;;20106:59;20182:18;;45705:88:0;19853:353:1;45705:88:0;45835:4;:66;;;;;45867:34;;45856:7;:45;;45835:66;:109;;;;-1:-1:-1;45933:10:0;45919:25;;;;:13;:25;;;;;;;;45918:26;45835:109;:144;;;;-1:-1:-1;45962:17:0;;;;45961:18;45835:144;:180;;;;-1:-1:-1;45996:19:0;;-1:-1:-1;;;45996:19:0;;;;45835:180;:246;;;;-1:-1:-1;46060:21:0;;46050:4;46032:24;;;;:9;:24;;;;;;:49;;45835:246;45817:318;;;46108:15;:13;:15::i;:::-;-1:-1:-1;;;;;46147:18:0;;;;;;:9;:18;;;;;:29;;46169:7;;46147:18;:29;;46169:7;;46147:29;:::i;:::-;;;;-1:-1:-1;;;;;;;46249:22:0;;46189:19;46249:22;;;:13;:22;;;;;;46211:7;;46249:22;;;:52;;;46294:6;-1:-1:-1;;;;;46275:26:0;:7;-1:-1:-1;;;;;46275:26:0;;46249:52;46248:135;;;-1:-1:-1;;;;;;46324:25:0;;;;;;:13;:25;;;;;;;;;:58;;;46375:6;-1:-1:-1;;;;;46353:29:0;:10;-1:-1:-1;;;;;46353:29:0;;46324:58;46247:231;;46473:5;46247:231;;;-1:-1:-1;;;;;46405:20:0;;;;;;:11;:20;;;;;;;;46404:21;:49;;;;-1:-1:-1;;;;;;46430:23:0;;;;;;:11;:23;;;;;;;;46429:24;46404:49;46229:462;;;46519:29;46531:7;46540;46519:11;:29::i;:::-;46505:43;;46229:462;;;-1:-1:-1;;;;;46571:20:0;;;;;;:11;:20;;;;;;;;46570:21;:49;;;;-1:-1:-1;;;;;;46596:23:0;;;;;;:11;:23;;;;;;;;46595:24;46570:49;46566:125;;;46650:29;46662:7;46671;46650:11;:29::i;:::-;46636:43;;46566:125;-1:-1:-1;;;;;46728:21:0;;;;;;;:9;:21;;;;;;;:36;;;;;;46791:42;46728:21;;46791:42;;;-1:-1:-1;;;;;;;;;;;46791:42:0;;;46753:11;398:25:1;;386:2;371:18;;252:177;46791:42:0;;;;;;;;-1:-1:-1;46853:4:0;;44565:2300;-1:-1:-1;;;;;;44565:2300:0:o;16057:191::-;16131:16;16150:6;;-1:-1:-1;;;;;16167:17:0;;;-1:-1:-1;;;;;;16167:17:0;;;;;;16200:40;;16150:6;;;;;;;16200:40;;16131:16;16200:40;16120:128;16057:191;:::o;46873:285::-;-1:-1:-1;;;;;47020:18:0;;47003:4;47020:18;;;:9;:18;;;;;:29;;47042:7;;47020:18;47003:4;;47020:29;;47042:7;;47020:29;:::i;:::-;;;;-1:-1:-1;;;;;;;;47085:21:0;;;;;;:9;:21;;;;;:32;;;;;;-1:-1:-1;46873:285:0;;;;;:::o;43710:191::-;43828:13;;43860:33;;-1:-1:-1;;;43860:33:0;;-1:-1:-1;;;;;208:32:1;;;43860:33:0;;;190:51:1;43781:4:0;;43828:13;;;;;;;43860:23;;163:18:1;;43860:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47166:2505::-;39850:17;:24;;-1:-1:-1;;39850:24:0;39870:4;39850:24;;;47304:16:::1;::::0;;47318:1:::1;47304:16:::0;;;;;::::1;::::0;;;47246:21:::1;::::0;-1:-1:-1;;47304:16:0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;47304:16:0::1;47280:40;;47349:4;47331;47336:1;47331:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;47331:23:0::1;;;-1:-1:-1::0;;;;;47331:23:0::1;;;::::0;::::1;47383:4;47365;47370:1;47365:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;47365:23:0::1;;;-1:-1:-1::0;;;;;47365:23:0::1;;;::::0;::::1;47417:4;47399;47404:1;47399:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47399:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;47523:4:::1;47505:24;::::0;;;:9:::1;:24:::0;;;;;;;;47433:200;;-1:-1:-1;;;47433:200:0;;:6:::1;:57:::0;;::::1;::::0;::::1;::::0;:200:::1;::::0;47505:24;;47560:4;;47523;47607:15:::1;::::0;47433:200:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47646:16;47689:9;47665:21;:33;;;;:::i;:::-;47646:52:::0;-1:-1:-1;39252:6:0::1;47715:14:::0;::::1;47711:1953;;;47787:13;:24:::0;47836:4:::1;:15:::0;47746:12:::1;::::0;-1:-1:-1;;;;;47787:24:0::1;::::0;39252:6:::1;::::0;47825:26:::1;::::0;47824:34:::1;47836:15;47825:8:::0;:26:::1;:::i;:::-;47824:34;;;;:::i;:::-;47787:76;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47773:90;;;;;47886:7;47878:38;;;;-1:-1:-1::0;;;47878:38:0::1;;;;;;;:::i;:::-;47945:34:::0;;48004:4:::1;:25:::0;-1:-1:-1;;;;;47945:34:0;;::::1;::::0;39252:6:::1;::::0;47993:36:::1;::::0;48004:25;;::::1;47992:44;48004:25;47993:8:::0;:36:::1;:::i;:::-;47992:44;;;;:::i;:::-;47945:128;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47931:142;;;;;48096:7;48088:38;;;;-1:-1:-1::0;;;48088:38:0::1;;;;;;;:::i;:::-;48155:17:::0;;48197:4:::1;:8:::0;-1:-1:-1;;;;;48155:17:0;;::::1;::::0;39252:6:::1;::::0;48186:19:::1;::::0;-1:-1:-1;;;48197:8:0;::::1;48185:27;48197:8;48186::::0;:19:::1;:::i;:::-;48185:27;;;;:::i;:::-;48155:62;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48141:76;;;;;48240:7;48232:38;;;;-1:-1:-1::0;;;48232:38:0::1;;;;;;;:::i;:::-;48299:19:::0;;48343:4:::1;:10:::0;-1:-1:-1;;;;;48299:19:0;;::::1;::::0;39252:6:::1;::::0;48332:21:::1;::::0;48343:10;;::::1;48331:29;48343:10;48332:8:::0;:21:::1;:::i;:::-;48331:29;;;;:::i;:::-;48299:66;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48285:80;;;;;48388:7;48380:38;;;;-1:-1:-1::0;;;48380:38:0::1;;;;;;;:::i;:::-;48447:40:::0;;48530:4:::1;:31:::0;-1:-1:-1;;;;;48447:40:0;;::::1;::::0;39252:6:::1;::::0;48519:42:::1;::::0;-1:-1:-1;;;48530:31:0;::::1;48518:50;48530:31;48519:8:::0;:42:::1;:::i;:::-;48518:50;;;;:::i;:::-;48447:140;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48433:154;;;;;48610:7;48602:38;;;;-1:-1:-1::0;;;48602:38:0::1;;;;;;;:::i;:::-;48669:28:::0;;48722:4:::1;:19:::0;-1:-1:-1;;;;;48669:28:0;;::::1;::::0;39252:6:::1;::::0;48711:30:::1;::::0;-1:-1:-1;;;48722:19:0;::::1;48710:38;48722:19;48711:8:::0;:30:::1;:::i;:::-;48710:38;;;;:::i;:::-;48669:84;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48655:98;;;;;48776:7;48768:38;;;;-1:-1:-1::0;;;48768:38:0::1;;;;;;;:::i;:::-;48835:30:::0;;48890:4:::1;:21:::0;-1:-1:-1;;;;;48835:30:0;;::::1;::::0;39252:6:::1;::::0;48879:32:::1;::::0;-1:-1:-1;;;48890:21:0;::::1;48878:40;48890:21;48879:8:::0;:32:::1;:::i;:::-;48878:40;;;;:::i;:::-;48835:88;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48821:102;;;;;48946:7;48938:38;;;;-1:-1:-1::0;;;48938:38:0::1;;;;;;;:::i;:::-;49005:21:::0;;49051:4:::1;:12:::0;-1:-1:-1;;;;;49005:21:0;;::::1;::::0;39252:6:::1;::::0;49040:23:::1;::::0;-1:-1:-1;;;49051:12:0;::::1;49039:31;49051:12;49040:8:::0;:23:::1;:::i;:::-;49039:31;;;;:::i;:::-;49005:70;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48991:84;;;;;49098:7;49090:38;;;;-1:-1:-1::0;;;49090:38:0::1;;;;;;;:::i;:::-;49157:24:::0;;49206:4:::1;:15:::0;-1:-1:-1;;;;;49157:24:0;;::::1;::::0;39252:6:::1;::::0;49195:26:::1;::::0;-1:-1:-1;;;49206:15:0;::::1;49194:34;49206:15;49195:8:::0;:26:::1;:::i;:::-;49194:34;;;;:::i;:::-;49157:76;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49143:90;;;;;49256:7;49248:38;;;;-1:-1:-1::0;;;49248:38:0::1;;;;;;;:::i;:::-;49315:33:::0;;49373:4:::1;:24:::0;-1:-1:-1;;;;;49315:33:0;;::::1;::::0;39252:6:::1;::::0;49362:35:::1;::::0;-1:-1:-1;;;49373:24:0;::::1;49361:43;49373:24;49362:8:::0;:35:::1;:::i;:::-;49361:43;;;;:::i;:::-;49315:126;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49301:140;;;;;49464:7;49456:38;;;;-1:-1:-1::0;;;49456:38:0::1;;;;;;;:::i;:::-;49523:24:::0;;49572:4:::1;:15:::0;-1:-1:-1;;;;;49523:24:0;;::::1;::::0;39252:6:::1;::::0;49561:26:::1;::::0;-1:-1:-1;;;49572:15:0;::::1;49560:34;49572:15;49561:8:::0;:26:::1;:::i;:::-;49560:34;;;;:::i;:::-;49523:76;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49509:90;;;;;49622:7;49614:38;;;;-1:-1:-1::0;;;49614:38:0::1;;;;;;;:::i;:::-;47731:1933;47711:1953;-1:-1:-1::0;;39897:17:0;:25;;-1:-1:-1;;39897:25:0;;;-1:-1:-1;47166:2505:0:o;49679:330::-;49802:8;;49751:7;;;;39252:6;;49792:18;;49791:26;49802:8;49792:7;:18;:::i;:::-;49791:26;;;;:::i;:::-;49873:4;49855:24;;;;:9;:24;;;;;;;:37;;;;;;49919:43;49771:46;;-1:-1:-1;49873:4:0;-1:-1:-1;;;;;49919:43:0;;;-1:-1:-1;;;;;;;;;;;49919:43:0;;;49771:46;398:25:1;;386:2;371:18;;252:177;49919:43:0;;;;;;;;49982:19;49992:9;49982:7;:19;:::i;:::-;49975:26;49679:330;-1:-1:-1;;;;49679:330:0:o;50017:273::-;50140:3;;50089:7;;;;39252:6;;50130:13;;50140:3;;;50129:21;50140:3;50130:7;:13;:::i;:::-;50129:21;;;;:::i;:::-;50109:41;;50178:9;50163:11;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;50205:38:0;;398:25:1;;;50231:1:0;;-1:-1:-1;;;;;50205:38:0;;;-1:-1:-1;;;;;;;;;;;50205:38:0;386:2:1;371:18;50205:38:0;252:177:1;434:548;546:4;575:2;604;593:9;586:21;636:6;630:13;679:6;674:2;663:9;659:18;652:34;704:1;714:140;728:6;725:1;722:13;714:140;;;823:14;;;819:23;;813:30;789:17;;;808:2;785:26;778:66;743:10;;714:140;;;718:3;903:1;898:2;889:6;878:9;874:22;870:31;863:42;973:2;966;962:7;957:2;949:6;945:15;941:29;930:9;926:45;922:54;914:62;;;;434:548;;;;:::o;987:131::-;-1:-1:-1;;;;;1062:31:1;;1052:42;;1042:70;;1108:1;1105;1098:12;1123:315;1191:6;1199;1252:2;1240:9;1231:7;1227:23;1223:32;1220:52;;;1268:1;1265;1258:12;1220:52;1307:9;1294:23;1326:31;1351:5;1326:31;:::i;:::-;1376:5;1428:2;1413:18;;;;1400:32;;-1:-1:-1;;;1123:315:1:o;2674:247::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2841:9;2828:23;2860:31;2885:5;2860:31;:::i;2926:162::-;2992:5;3037:3;3028:6;3023:3;3019:16;3015:26;3012:46;;;3054:1;3051;3044:12;3012:46;-1:-1:-1;3076:6:1;2926:162;-1:-1:-1;2926:162:1:o;3093:250::-;3184:6;3237:3;3225:9;3216:7;3212:23;3208:33;3205:53;;;3254:1;3251;3244:12;3205:53;3277:60;3329:7;3318:9;3277:60;:::i;3348:456::-;3425:6;3433;3441;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;3549:9;3536:23;3568:31;3593:5;3568:31;:::i;:::-;3618:5;-1:-1:-1;3675:2:1;3660:18;;3647:32;3688:33;3647:32;3688:33;:::i;:::-;3348:456;;3740:7;;-1:-1:-1;;;3794:2:1;3779:18;;;;3766:32;;3348:456::o;3998:117::-;4083:6;4076:5;4072:18;4065:5;4062:29;4052:57;;4105:1;4102;4095:12;4120:245;4178:6;4231:2;4219:9;4210:7;4206:23;4202:32;4199:52;;;4247:1;4244;4237:12;4199:52;4286:9;4273:23;4305:30;4329:5;4305:30;:::i;4837:402::-;4919:6;4927;4980:2;4968:9;4959:7;4955:23;4951:32;4948:52;;;4996:1;4993;4986:12;4948:52;5035:9;5022:23;5054:31;5079:5;5054:31;:::i;:::-;5104:5;-1:-1:-1;5161:2:1;5146:18;;5133:32;5174:33;5133:32;5174:33;:::i;:::-;5226:7;5216:17;;;4837:402;;;;;:::o;5244:180::-;5303:6;5356:2;5344:9;5335:7;5331:23;5327:32;5324:52;;;5372:1;5369;5362:12;5324:52;-1:-1:-1;5395:23:1;;5244:180;-1:-1:-1;5244:180:1:o;5429:615::-;5515:6;5523;5576:2;5564:9;5555:7;5551:23;5547:32;5544:52;;;5592:1;5589;5582:12;5544:52;5632:9;5619:23;5661:18;5702:2;5694:6;5691:14;5688:34;;;5718:1;5715;5708:12;5688:34;5756:6;5745:9;5741:22;5731:32;;5801:7;5794:4;5790:2;5786:13;5782:27;5772:55;;5823:1;5820;5813:12;5772:55;5863:2;5850:16;5889:2;5881:6;5878:14;5875:34;;;5905:1;5902;5895:12;5875:34;5958:7;5953:2;5943:6;5940:1;5936:14;5932:2;5928:23;5924:32;5921:45;5918:65;;;5979:1;5976;5969:12;5918:65;6010:2;6002:11;;;;;6032:6;;-1:-1:-1;5429:615:1;;-1:-1:-1;;;;5429:615:1:o;6049:118::-;6135:5;6128:13;6121:21;6114:5;6111:32;6101:60;;6157:1;6154;6147:12;6172:382;6237:6;6245;6298:2;6286:9;6277:7;6273:23;6269:32;6266:52;;;6314:1;6311;6304:12;6266:52;6353:9;6340:23;6372:31;6397:5;6372:31;:::i;:::-;6422:5;-1:-1:-1;6479:2:1;6464:18;;6451:32;6492:30;6451:32;6492:30;:::i;6559:241::-;6615:6;6668:2;6656:9;6647:7;6643:23;6639:32;6636:52;;;6684:1;6681;6674:12;6636:52;6723:9;6710:23;6742:28;6764:5;6742:28;:::i;8485:377::-;8559:6;8567;8575;8628:2;8616:9;8607:7;8603:23;8599:32;8596:52;;;8644:1;8641;8634:12;8596:52;8683:9;8670:23;8702:28;8724:5;8702:28;:::i;:::-;8749:5;8801:2;8786:18;;8773:32;;-1:-1:-1;8852:2:1;8837:18;;;8824:32;;8485:377;-1:-1:-1;;;8485:377:1:o;9494:176::-;9539:11;9591:3;9578:17;9604:31;9629:5;9604:31;:::i;9675:195::-;9779:11;;-1:-1:-1;;;;;;9775:54:1;-1:-1:-1;;;;;9831:31:1;;;;9772:91;;;;9759:105;;9675:195::o;9875:1400::-;10022:89;10076:34;10104:5;10076:34;:::i;:::-;10070:4;10022:89;:::i;:::-;10120:106;10182:43;10221:2;10214:5;10210:14;10182:43;:::i;:::-;10178:1;10172:4;10168:12;10120:106;:::i;:::-;10235;10297:43;10336:2;10329:5;10325:14;10297:43;:::i;:::-;10293:1;10287:4;10283:12;10235:106;:::i;:::-;10350;10412:43;10451:2;10444:5;10440:14;10412:43;:::i;:::-;10408:1;10402:4;10398:12;10350:106;:::i;:::-;10465:107;10527:44;10566:3;10559:5;10555:15;10527:44;:::i;:::-;10523:1;10517:4;10513:12;10465:107;:::i;:::-;10581;10643:44;10682:3;10675:5;10671:15;10643:44;:::i;:::-;10639:1;10633:4;10629:12;10581:107;:::i;:::-;10697;10759:44;10798:3;10791:5;10787:15;10759:44;:::i;:::-;10755:1;10749:4;10745:12;10697:107;:::i;:::-;10813;10875:44;10914:3;10907:5;10903:15;10875:44;:::i;:::-;10871:1;10865:4;10861:12;10813:107;:::i;:::-;10929;10991:44;11030:3;11023:5;11019:15;10991:44;:::i;:::-;10987:1;10981:4;10977:12;10929:107;:::i;:::-;11045;11107:44;11146:3;11139:5;11135:15;11107:44;:::i;:::-;11103:1;11097:4;11093:12;11045:107;:::i;:::-;11161:108;11224:44;11263:3;11256:5;11252:15;11224:44;:::i;:::-;11219:2;11213:4;11209:13;11161:108;:::i;11280:127::-;11341:10;11336:3;11332:20;11329:1;11322:31;11372:4;11369:1;11362:15;11396:4;11393:1;11386:15;11412:128;11479:9;;;11500:11;;;11497:37;;;11514:18;;:::i;11545:184::-;11615:6;11668:2;11656:9;11647:7;11643:23;11639:32;11636:52;;;11684:1;11681;11674:12;11636:52;-1:-1:-1;11707:16:1;;11545:184;-1:-1:-1;11545:184:1:o;12013:245::-;12080:6;12133:2;12121:9;12112:7;12108:23;12104:32;12101:52;;;12149:1;12146;12139:12;12101:52;12181:9;12175:16;12200:28;12222:5;12200:28;:::i;12263:127::-;12324:10;12319:3;12315:20;12312:1;12305:31;12355:4;12352:1;12345:15;12379:4;12376:1;12369:15;12395:135;12434:3;12455:17;;;12452:43;;12475:18;;:::i;:::-;-1:-1:-1;12522:1:1;12511:13;;12395:135::o;12535:168::-;12608:9;;;12639;;12656:15;;;12650:22;;12636:37;12626:71;;12677:18;;:::i;12918:342::-;13120:2;13102:21;;;13159:2;13139:18;;;13132:30;-1:-1:-1;;;13193:2:1;13178:18;;13171:48;13251:2;13236:18;;12918:342::o;13671:400::-;13873:2;13855:21;;;13912:2;13892:18;;;13885:30;13951:34;13946:2;13931:18;;13924:62;-1:-1:-1;;;14017:2:1;14002:18;;13995:34;14061:3;14046:19;;13671:400::o;14076:174::-;14120:11;14172:3;14159:17;14185:30;14209:5;14185:30;:::i;16366:1357::-;16523:5;16510:19;16538:32;16562:7;16538:32;:::i;:::-;16638:6;16629:7;16625:20;16616:5;16612:10;16605:4;16599:11;16595:28;16592:54;16586:4;16579:68;;16656:95;16708:42;16746:2;16739:5;16735:14;16708:42;:::i;:::-;14347:11;;-1:-1:-1;;14383:24:1;14417:2;14413:14;;;;14429:10;14409:31;14380:61;14367:75;;14255:193;16656:95;16760:97;16814:42;16852:2;16845:5;16841:14;16814:42;:::i;:::-;14547:11;;-1:-1:-1;;14583:28:1;14621:2;14617:14;;;;14633;14613:35;14580:69;14567:83;;14453:203;16760:97;16866;16920:42;16958:2;16951:5;16947:14;16920:42;:::i;:::-;14755:11;;-1:-1:-1;;14791:32:1;14833:2;14829:14;;;;14845:18;14825:39;14788:77;14775:91;;14661:211;16866:97;16972:98;17026:43;17064:3;17057:5;17053:15;17026:43;:::i;:::-;14971:11;;-1:-1:-1;;15007:36:1;15053:2;15049:14;;;;15065:22;15045:43;15004:85;14991:99;;14877:219;16972:98;17079:99;17134:43;17172:3;17165:5;17161:15;17134:43;:::i;:::-;17128:4;15196:11;;-1:-1:-1;;;;15232:28:1;15286:2;15266:14;;;;-1:-1:-1;;;15262:35:1;15229:69;;;;15216:83;;15101:204;17079:99;17187;17242:43;17280:3;17273:5;17269:15;17242:43;:::i;:::-;17236:4;15405:11;;-1:-1:-1;;;;15441:28:1;15495:2;15475:14;;;;-1:-1:-1;;;15471:35:1;15438:69;;;;15425:83;;15310:204;17187:99;17295;17350:43;17388:3;17381:5;17377:15;17350:43;:::i;:::-;17344:4;15614:11;;-1:-1:-1;;;;15650:29:1;15706:3;15685:15;;;;-1:-1:-1;;;15681:37:1;15647:72;;;;15634:86;;15519:207;17295:99;17403;17458:43;17496:3;17489:5;17485:15;17458:43;:::i;:::-;17452:4;15826:11;;-1:-1:-1;;;;15862:29:1;15918:3;15897:15;;;;-1:-1:-1;;;15893:37:1;15859:72;;;;15846:86;;15731:207;17403:99;17511;17566:43;17604:3;17597:5;17593:15;17566:43;:::i;:::-;17560:4;16038:11;;-1:-1:-1;;;;16074:29:1;16130:3;16109:15;;;;-1:-1:-1;;;16105:37:1;16071:72;;;;16058:86;;15943:207;17511:99;17619:98;17673:43;17711:3;17704:5;17700:15;17673:43;:::i;:::-;17667:4;16249:11;;-1:-1:-1;;;;16285:29:1;16341:3;16320:15;;;;-1:-1:-1;;;16316:37:1;16282:72;;;;16269:86;;16155:206;17728:168;17795:6;17821:10;;;17833;;;17817:27;;17856:11;;;17853:37;;;17870:18;;:::i;:::-;17853:37;17728:168;;;;:::o;18597:125::-;18662:9;;;18683:10;;;18680:36;;;18696:18;;:::i;20343:980::-;20605:4;20653:3;20642:9;20638:19;20684:6;20673:9;20666:25;20710:2;20748:6;20743:2;20732:9;20728:18;20721:34;20791:3;20786:2;20775:9;20771:18;20764:31;20815:6;20850;20844:13;20881:6;20873;20866:22;20919:3;20908:9;20904:19;20897:26;;20958:2;20950:6;20946:15;20932:29;;20979:1;20989:195;21003:6;21000:1;20997:13;20989:195;;;21068:13;;-1:-1:-1;;;;;21064:39:1;21052:52;;21159:15;;;;21124:12;;;;21100:1;21018:9;20989:195;;;-1:-1:-1;;;;;;;21240:32:1;;;;21235:2;21220:18;;21213:60;-1:-1:-1;;;21304:3:1;21289:19;21282:35;21201:3;20343:980;-1:-1:-1;;;20343:980:1:o;21328:217::-;21368:1;21394;21384:132;;21438:10;21433:3;21429:20;21426:1;21419:31;21473:4;21470:1;21463:15;21501:4;21498:1;21491:15;21384:132;-1:-1:-1;21530:9:1;;21328:217::o

Swarm Source

ipfs://7018f3a0bbcffcf829fb036b147dca2d74efe088f1432183d74194b5e208d32e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.