ETH Price: $2,398.71 (+1.12%)

Token

Stable Yield Credit (Xi)
 

Overview

Max Total Supply

1,144,364.57475458 Xi

Holders

47

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
0xaimbot.eth
Balance
328.38468815 Xi

Value
$0.00
0x3597c57789289cd6d0621E82684a3D1a5a50Bc8f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StableYieldCredit

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-03
*/

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Oracle {
    function getPriceUSD(address reserve) external view returns (uint);
}

interface ISushiswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ISushiswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) 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 make 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;
    }
}



library SushiswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'SushiswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SushiswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
            )))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISushiswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SushiswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SushiswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA * reserveB / reserveA;
    }
}

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

contract StableYieldCredit is ReentrancyGuard {
    using SafeERC20 for IERC20;

    /// @notice EIP-20 token name for this token
    string public constant name = "Stable Yield Credit";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "Xi";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 8;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 0;
    
    /// @notice Total number of tokens staked for yield
    uint public stakedSupply = 0;

    mapping(address => mapping (address => uint)) internal allowances;
    mapping(address => uint) internal balances;
    mapping(address => uint) public stakes;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint chainId,address verifyingContract)");
    bytes32 public immutable DOMAINSEPARATOR;

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);
    
    /// @notice Stake event for claiming rewards
    event Staked(address indexed from, uint amount);
    
    // @notice Unstake event
    event Unstaked(address indexed from, uint amount);
    
    event Earned(address indexed from, uint amount);
    event Fees(uint amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    // Oracle used for price debt data (external to the AMM balance to avoid internal manipulation)
    Oracle public constant LINK = Oracle(0x271bf4568fb737cc2e6277e9B1EE0034098cDA2a);
    ISushiswapV2Factory public constant FACTORY = ISushiswapV2Factory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
    
    // user => token => borrowed
    mapping (address => mapping(address => uint)) public borrowed;
    // user => token => collateral
    mapping (address => mapping(address => uint)) public collateral;
    // user => token => credit
    mapping (address => mapping(address => uint)) public collateralCredit;
    
    address[] private _markets;
    mapping (address => bool) pairs;
    
    uint public rewardRate = 0;
    uint public periodFinish = 0;
    uint public DURATION = 7 days;
    uint public lastUpdateTime;
    uint public rewardPerTokenStored;
    
    mapping(address => uint) public userRewardPerTokenPaid;
    mapping(address => uint) public rewards;
    
    event Deposit(address indexed creditor, address indexed collateral, uint creditOut, uint amountIn, uint creditMinted);
    event Withdraw(address indexed creditor, address indexed collateral, uint creditIn, uint creditOut, uint amountOut);
    
    constructor () {
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
    }
    
    uint public FEE = 50;
    uint public BASE = 10000;
    
    function lastTimeRewardApplicable() public view returns (uint) {
        return Math.min(block.timestamp, periodFinish);
    }
    
    function rewardPerToken() public view returns (uint) {
        if (stakedSupply == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored +
                ((lastTimeRewardApplicable() - 
                lastUpdateTime) * 
                rewardRate * 1e18 / stakedSupply);
    }
    
    function earned(address account) public view returns (uint) {
        return (stakes[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18) + rewards[account];
    }

    function getRewardForDuration() external view returns (uint) {
        return rewardRate * DURATION;
    }
    
    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }
    
    function stake(uint256 amount) external nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        stakedSupply += amount;
        stakes[msg.sender] += amount;
        _transferTokens(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function unstake(uint amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        stakedSupply -= amount;
        stakes[msg.sender] -= amount;
        _transferTokens(address(this), msg.sender, amount);
        emit Unstaked(msg.sender, amount);
    }

    function getReward() public nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            _transferTokens(address(this), msg.sender, reward);
            emit Earned(msg.sender, reward);
        }
    }

    function exit() external {
        unstake(stakes[msg.sender]);
        getReward();
    }
    
    function notifyFeeAmount(uint reward) internal updateReward(address(0)) {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward / DURATION;
        } else {
            uint remaining = periodFinish - block.timestamp;
            uint leftover = remaining * rewardRate;
            rewardRate = (reward + leftover) / DURATION;
        }

        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint balance = balances[address(this)];
        require(rewardRate <= balance / DURATION, "Provided reward too high");

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp + DURATION;
        emit Fees(reward);
    }
    
    function markets() external view returns (address[] memory) {
        return _markets;
    }
    
    function _mint(address dst, uint amount) internal {
        // mint the amount
        totalSupply += amount;
        // transfer the amount to the recipient
        balances[dst] += amount;
        emit Transfer(address(0), dst, amount);
    }
    
    function _burn(address dst, uint amount) internal {
        // burn the amount
        totalSupply -= amount;
        // transfer the amount from the recipient
        balances[dst] -= amount;
        emit Transfer(dst, address(0), amount);
    }
    
    function depositAll(IERC20 token, uint minOut) external {
        _deposit(token, token.balanceOf(msg.sender), minOut);
    }
    
    function deposit(IERC20 token, uint amount, uint minOut) external {
        _deposit(token, amount, minOut);
    }
    
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired
    ) internal virtual returns (address pair, uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        pair = FACTORY.getPair(tokenA, tokenB);
        if (pair == address(0)) {
            pair = FACTORY.createPair(tokenA, tokenB);
            pairs[pair] = true;
            _markets.push(tokenA);
        } else if (!pairs[pair]) {
            pairs[pair] = true;
            _markets.push(tokenA);
        }
        
        (uint reserveA, uint reserveB) = SushiswapV2Library.getReserves(address(FACTORY), tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SushiswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SushiswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    
    function _deposit(IERC20 token, uint amount, uint minOut) internal {
        uint _price = LINK.getPriceUSD(address(token));
        uint _value = _price * amount / uint256(10)**token.decimals();
        require(_value > 0, "!value");
        
        (address _pair, uint amountA,) = _addLiquidity(address(token), address(this), amount, _value);
        
        token.safeTransferFrom(msg.sender, _pair, amountA);
        
        _value = _price * amountA / uint256(10)**token.decimals();
        require(_value > minOut, "insufficient credit");
        
        _mint(_pair, _value);
        borrowed[msg.sender][address(token)] += _value;
        
        uint _liquidity = ISushiswapV2Pair(_pair).mint(address(this));
        collateral[msg.sender][address(token)] += _liquidity;
        
        collateralCredit[msg.sender][address(token)] += _value;
        uint _fee = _value * FEE / BASE;
        _mint(msg.sender, _value - _fee);
        _mint(address(this), _fee);
        notifyFeeAmount(_fee);
        
        emit Deposit(msg.sender, address(token), _value, amount, _value);
    }
    
    function withdrawAll(IERC20 token, uint maxBurn) external {
        _withdraw(token, IERC20(address(this)).balanceOf(msg.sender), maxBurn);
    }
    
    function withdraw(IERC20 token, uint amount, uint maxBurn) external {
        _withdraw(token, amount, maxBurn);
    }
    
    function _withdraw(IERC20 token, uint amount, uint maxBurn) internal {
        uint _credit = collateralCredit[msg.sender][address(token)];
        uint _collateral = collateral[msg.sender][address(token)];
        uint _borrowed = borrowed[msg.sender][address(token)];
        
        if (_credit < amount) {
            amount = _credit;
        }
        
        // Calculate % of collateral to release
        uint _burned = _collateral * amount / _credit;
        _borrowed = _borrowed * amount / _credit;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        IERC20(_pair).safeTransfer(_pair, _burned); // send liquidity to pair
        ISushiswapV2Pair(_pair).burn(msg.sender);
        
        collateralCredit[msg.sender][address(token)] -= amount;
        collateral[msg.sender][address(token)] -= _burned;
        borrowed[msg.sender][address(token)] -= _borrowed;
        require(_borrowed+amount < maxBurn, "Burn exceeded");
        _burn(msg.sender, _borrowed+amount);
        
        emit Withdraw(msg.sender, address(token), amount, _borrowed, _burned);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) external returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(block.timestamp <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) external returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != type(uint).max) {
            uint newAllowance = spenderAllowance - amount;
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        balances[src] -= amount;
        balances[dst] += amount;
        
        emit Transfer(src, dst, amount);
        
        if (pairs[src]) {
            uint _fee = amount * FEE / BASE;
            _transferTokens(dst, address(this), _fee);
            notifyFeeAmount(_fee);
        }
    }

    function _getChainId() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditMinted","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract ISushiswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"borrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateralCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"minOut","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxBurn","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"maxBurn","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600060015560006002556000600c556000600d5562093a80600e5560326013556127106014553480156200003757600080fd5b50600160005560408051808201909152601381527f537461626c65205969656c6420437265646974000000000000000000000000006020909101527f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357f731d4321f0316462c5e2d7805654a6b50447396c1df9b8234424c9752f8ec7d2620000be620000f5565b30604051602001620000d49493929190620000f9565b60408051601f1981840301815291905280516020909101206080526200011d565b4690565b938452602084019290925260408301526001600160a01b0316606082015260800190565b608051612b7662000140600039600081816106480152610dda0152612b766000f3fe608060405234801561001057600080fd5b50600436106102685760003560e01c80637ecebe0011610151578063cc6dbc27116100c3578063de3db0fe11610087578063de3db0fe146104b4578063df136d65146104c7578063e9fad8ee146104cf578063ebe2b12b146104d7578063ec342ad0146104df578063f4e5138f146104e757610268565b8063cc6dbc271461046b578063cd3daf9d1461047e578063d41ce4b114610486578063d505accf1461048e578063dd62ed3e146104a157610268565b8063a9059cbb11610115578063a9059cbb1461040f578063b0a02abe14610422578063b5c5f67214610435578063c57981b514610448578063c8f33c9114610450578063cc218ece1461045857610268565b80637ecebe00146103c657806380faa57d146103d95780638b876347146103e157806395d89b41146103f4578063a694fc3a146103fc57610268565b80631c1f78eb116101ea57806330adf81f116101ae57806330adf81f14610371578063313ce567146103795780633ac2a0321461038e5780633d18b912146103a357806370a08231146103ab5780637b0a47ee146103be57610268565b80631c1f78eb1461033357806320606b701461033b57806323b872dd146103435780632dd31000146103565780632e17de781461035e57610268565b806316934fc41161023157806316934fc4146102f35780631778e29c1461030657806318160ddd1461030e5780631b6b6d23146103165780631be052891461032b57610268565b80628cc2621461026d57806306fdde03146102965780630700037d146102ab578063095ea7b3146102be5780630efe6a8b146102de575b600080fd5b61028061027b366004612161565b6104fa565b60405161028d919061251d565b60405180910390f35b61029e610579565b60405161028d9190612578565b6102806102b9366004612161565b6105a8565b6102d16102cc366004612286565b6105ba565b60405161028d9190612512565b6102f16102ec3660046122d1565b610624565b005b610280610301366004612161565b610634565b610280610646565b61028061066a565b61031e610670565b60405161028d919061245a565b610280610688565b61028061068e565b6102806106a6565b6102d16103513660046121d1565b6106ca565b61031e610798565b6102f161036c366004612353565b6107b0565b6102806108ed565b610381610911565b60405161028d919061293b565b610396610916565b60405161028d91906124c5565b6102f1610978565b6102806103b9366004612161565b610a6f565b610280610a8a565b6102806103d4366004612161565b610a90565b610280610aa2565b6102806103ef366004612161565b610ab0565b61029e610ac2565b6102f161040a366004612353565b610ae0565b6102d161041d366004612286565b610c03565b610280610430366004612199565b610c19565b6102f16104433660046122d1565b610c36565b610280610c41565b610280610c47565b610280610466366004612199565b610c4d565b6102f1610479366004612286565b610c6a565b610280610ced565b610280610d51565b6102f161049c366004612211565b610d57565b6102806104af366004612199565b610f5d565b6102806104c2366004612199565b610f88565b610280610fa5565b6102f1610fab565b610280610fce565b610280610fd4565b6102f16104f5366004612286565b610fda565b6001600160a01b0381166000908152601260209081526040808320546011909252822054670de0b6b3a764000090610530610ced565b61053a9190612ab4565b6001600160a01b03851660009081526005602052604090205461055d9190612a95565b6105679190612961565b6105719190612949565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60126020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061061390869061251d565b60405180910390a350600192915050565b61062f83838361105c565b505050565b60056020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600e5481565b6000600e54600c546106a09190612a95565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061070457506000198114155b1561077f5760006107158583612ab4565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061077590859061251d565b60405180910390a3505b61078a86868661144f565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107dc5760405162461bcd60e51b81526004016107d3906128b7565b60405180910390fd5b6002600055336107ea610ced565b6010556107f5610aa2565b600f556001600160a01b0381161561083c57610810816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b6000821161085c5760405162461bcd60e51b81526004016107d390612799565b816002600082825461086e9190612ab4565b90915550503360009081526005602052604081208054849290610892908490612ab4565b909155506108a3905030338461144f565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108dc919061251d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600a80548060200260200160405190810160405280929190818152602001828054801561096e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610950575b5050505050905090565b6002600054141561099b5760405162461bcd60e51b81526004016107d3906128b7565b6002600055336109a9610ced565b6010556109b4610aa2565b600f556001600160a01b038116156109fb576109cf816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b336000908152601260205260409020548015610a665733600081815260126020526040812055610a2d9030908361144f565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108dc919061251d565b50506001600055565b6001600160a01b031660009081526004602052604090205490565b600c5481565b60066020526000908152604090205481565b60006106a042600d54611550565b60116020526000908152604090205481565b60405180604001604052806002815260200161586960f01b81525081565b60026000541415610b035760405162461bcd60e51b81526004016107d3906128b7565b600260005533610b11610ced565b601055610b1c610aa2565b600f556001600160a01b03811615610b6357610b37816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b60008211610b835760405162461bcd60e51b81526004016107d39061265c565b8160026000828254610b959190612949565b90915550503360009081526005602052604081208054849290610bb9908490612949565b90915550610bca905033308461144f565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108dc919061251d565b6000610c1033848461144f565b50600192915050565b600760209081526000928352604080842090915290825290205481565b61062f838383611566565b60135481565b600f5481565b600860209081526000928352604080842090915290825290205481565b6040516370a0823160e01b8152610ce990839030906370a0823190610c9390339060040161245a565b60206040518083038186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce3919061236b565b83611566565b5050565b600060025460001415610d0357506010546106a3565b600254600c54600f54610d14610aa2565b610d1e9190612ab4565b610d289190612a95565b610d3a90670de0b6b3a7640000612a95565b610d449190612961565b6010546106a09190612949565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610da483612af7565b9190505589604051602001610dbe96959493929190612526565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610e0b9291906123e9565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e48949392919061255a565b6020604051602081039080840390855afa158015610e6a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e9d5760405162461bcd60e51b81526004016107d390612842565b896001600160a01b0316816001600160a01b031614610ece5760405162461bcd60e51b81526004016107d39061276b565b86421115610eee5760405162461bcd60e51b81526004016107d3906126e0565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f49908c9061251d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600960209081526000928352604080842090915290825290205481565b60105481565b33600090815260056020526040902054610fc4906107b0565b610fcc610978565b565b600d5481565b60145481565b610ce982836001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161100a919061245a565b60206040518083038186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a919061236b565b835b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d9061109690879060040161245a565b60206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e6919061236b565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b919061236b565b61116690600a6129c7565b6111708584612a95565b61117a9190612961565b90506000811161119c5760405162461bcd60e51b81526004016107d39061263c565b6000806111ab87308886611850565b5090925090506111c66001600160a01b038816338484611b1f565b866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611237919061236b565b61124290600a6129c7565b61124c8286612a95565b6112569190612961565b92508483116112775760405162461bcd60e51b81526004016107d39061273e565b6112818284611b77565b3360009081526007602090815260408083206001600160a01b038b168452909152812080548592906112b4908490612949565b90915550506040516335313c2160e11b81526000906001600160a01b03841690636a627842906112e890309060040161245a565b602060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a919061236b565b3360009081526008602090815260408083206001600160a01b038d168452909152812080549293508392909190611372908490612949565b90915550503360009081526009602090815260408083206001600160a01b038c168452909152812080548692906113aa908490612949565b9091555050601454601354600091906113c39087612a95565b6113cd9190612961565b90506113e2336113dd8388612ab4565b611b77565b6113ec3082611b77565b6113f581611c05565b886001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6878b8960405161143c93929190612925565b60405180910390a3505050505050505050565b6001600160a01b03831660009081526004602052604081208054839290611477908490612ab4565b90915550506001600160a01b038216600090815260046020526040812080548392906114a4908490612949565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ee919061251d565b60405180910390a36001600160a01b0383166000908152600b602052604090205460ff161561062f5760006014546013548361152a9190612a95565b6115349190612961565b905061154183308361144f565b61154a81611c05565b50505050565b600081831061155f5781610791565b5090919050565b3360008181526009602090815260408083206001600160a01b038816808552908352818420548585526008845282852082865284528285205495855260078452828520918552925290912054909190848310156115c1578294505b6000836115ce8785612a95565b6115d89190612961565b9050836115e58784612a95565b6115ef9190612961565b60405163e6a4390560e01b815290925060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a439059061162e908b90309060040161246e565b60206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061217d565b90506116946001600160a01b0382168284611d51565b60405163226bf2d160e21b81526001600160a01b038216906389afcb44906116c090339060040161245a565b6040805180830381600087803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190612383565b50503360009081526009602090815260408083206001600160a01b038c16845290915281208054899290611746908490612ab4565b90915550503360009081526008602090815260408083206001600160a01b038c1684529091528120805484929061177e908490612ab4565b90915550503360009081526007602090815260408083206001600160a01b038c168452909152812080548592906117b6908490612ab4565b909155508690506117c78885612949565b106117e45760405162461bcd60e51b81526004016107d3906126b9565b6117f7336117f28986612949565b611d70565b876001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f89868660405161183e93929190612925565b60405180910390a35050505050505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a9060040161246e565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e0919061217d565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a9060040161246e565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b919061217d565b6001600160a01b038181166000908152600b602052604081208054600160ff199091168117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600b602052604090205460ff16611a79576001600160a01b038381166000908152600b602052604081208054600160ff199091168117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611df2565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611ecb565b9050868111611ade57879450925082611b11565b6000611aeb888486611ecb565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61154a846323b872dd60e01b858585604051602401611b4093929190612488565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f35565b8060016000828254611b899190612949565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612949565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061251d565b60405180910390a35050565b6000611c0f610ced565b601055611c1a610aa2565b600f556001600160a01b03811615611c6157611c35816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b600d544210611c7f57600e54611c779083612961565b600c55611cc1565b600042600d54611c8f9190612ab4565b90506000600c5482611ca19190612a95565b600e54909150611cb18286612949565b611cbb9190612961565b600c5550505b30600090815260046020526040902054600e54611cde9082612961565b600c541115611cff5760405162461bcd60e51b81526004016107d3906127c4565b42600f819055600e54611d1191612949565b600d556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d406490611d4490859061251d565b60405180910390a1505050565b61062f8363a9059cbb60e01b8484604051602401611b409291906124ac565b8060016000828254611d829190612ab4565b90915550506001600160a01b03821660009081526004602052604081208054839290611daf908490612ab4565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061251d565b6000806000611e018585612019565b509050600080611e128888886120a3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e829190612305565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611eb9578082611ebc565b81815b90999098509650505050505050565b6000808411611eec5760405162461bcd60e51b81526004016107d3906127fb565b600083118015611efc5750600082115b611f185760405162461bcd60e51b81526004016107d3906125ab565b82611f238386612a95565b611f2d9190612961565b949350505050565b611f47826001600160a01b0316612113565b611f635760405162461bcd60e51b81526004016107d3906128ee565b600080836001600160a01b031683604051611f7e91906123cd565b6000604051808303816000865af19150503d8060008114611fbb576040519150601f19603f3d011682016040523d82523d6000602084013e611fc0565b606091505b509150915081611fe25760405162461bcd60e51b81526004016107d390612684565b80511561154a5780806020019051810190611ffd91906122b1565b61154a5760405162461bcd60e51b81526004016107d39061286d565b600080826001600160a01b0316846001600160a01b0316141561204e5760405162461bcd60e51b81526004016107d3906125f5565b826001600160a01b0316846001600160a01b03161061206e578284612071565b83835b90925090506001600160a01b03821661209c5760405162461bcd60e51b81526004016107d390612709565b9250929050565b60008060006120b28585612019565b915091508582826040516020016120ca9291906123a6565b604051602081830303815290604052805190602001206040516020016120f1929190612404565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611f2d5750141592915050565b80516001600160701b038116811461057457600080fd5b600060208284031215612172578081fd5b813561079181612b28565b60006020828403121561218e578081fd5b815161079181612b28565b600080604083850312156121ab578081fd5b82356121b681612b28565b915060208301356121c681612b28565b809150509250929050565b6000806000606084860312156121e5578081fd5b83356121f081612b28565b9250602084013561220081612b28565b929592945050506040919091013590565b600080600080600080600060e0888a03121561222b578283fd5b873561223681612b28565b9650602088013561224681612b28565b95506040880135945060608801359350608088013560ff81168114612269578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215612298578182fd5b82356122a381612b28565b946020939093013593505050565b6000602082840312156122c2578081fd5b81518015158114610791578182fd5b6000806000606084860312156122e5578283fd5b83356122f081612b28565b95602085013595506040909401359392505050565b600080600060608486031215612319578283fd5b6123228461214a565b92506123306020850161214a565b9150604084015163ffffffff81168114612348578182fd5b809150509250925092565b600060208284031215612364578081fd5b5035919050565b60006020828403121561237c578081fd5b5051919050565b60008060408385031215612395578081fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b600082516123df818460208701612acb565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156125065783516001600160a01b0316835292840192918401916001016124e1565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082528251806020840152612597816040850160208701612acb565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c109d5c9b88195e18d959591959609a1b604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601390820152721a5b9cdd59999a58da595b9d0818dc99591a5d606a1b604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561295c5761295c612b12565b500190565b60008261297c57634e487b7160e01b81526012600452602481fd5b500490565b80825b600180861161299357506129be565b8187048211156129a5576129a5612b12565b808616156129b257918102915b9490941c938002612984565b94509492505050565b600061079160001984846000826129e057506001610791565b816129ed57506000610791565b8160018114612a035760028114612a0d57612a3a565b6001915050610791565b60ff841115612a1e57612a1e612b12565b6001841b915084821115612a3457612a34612b12565b50610791565b5060208310610133831016604e8410600b8410161715612a6d575081810a83811115612a6857612a68612b12565b610791565b612a7a8484846001612981565b808604821115612a8c57612a8c612b12565b02949350505050565b6000816000190483118215151615612aaf57612aaf612b12565b500290565b600082821015612ac657612ac6612b12565b500390565b60005b83811015612ae6578181015183820152602001612ace565b8381111561154a5750506000910152565b6000600019821415612b0b57612b0b612b12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612b3d57600080fd5b5056fea26469706673582212205ba5f19140c183716d26bce7fe182fe7b59569699ff6ad99c1d6ea6c9c6fd12664736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102685760003560e01c80637ecebe0011610151578063cc6dbc27116100c3578063de3db0fe11610087578063de3db0fe146104b4578063df136d65146104c7578063e9fad8ee146104cf578063ebe2b12b146104d7578063ec342ad0146104df578063f4e5138f146104e757610268565b8063cc6dbc271461046b578063cd3daf9d1461047e578063d41ce4b114610486578063d505accf1461048e578063dd62ed3e146104a157610268565b8063a9059cbb11610115578063a9059cbb1461040f578063b0a02abe14610422578063b5c5f67214610435578063c57981b514610448578063c8f33c9114610450578063cc218ece1461045857610268565b80637ecebe00146103c657806380faa57d146103d95780638b876347146103e157806395d89b41146103f4578063a694fc3a146103fc57610268565b80631c1f78eb116101ea57806330adf81f116101ae57806330adf81f14610371578063313ce567146103795780633ac2a0321461038e5780633d18b912146103a357806370a08231146103ab5780637b0a47ee146103be57610268565b80631c1f78eb1461033357806320606b701461033b57806323b872dd146103435780632dd31000146103565780632e17de781461035e57610268565b806316934fc41161023157806316934fc4146102f35780631778e29c1461030657806318160ddd1461030e5780631b6b6d23146103165780631be052891461032b57610268565b80628cc2621461026d57806306fdde03146102965780630700037d146102ab578063095ea7b3146102be5780630efe6a8b146102de575b600080fd5b61028061027b366004612161565b6104fa565b60405161028d919061251d565b60405180910390f35b61029e610579565b60405161028d9190612578565b6102806102b9366004612161565b6105a8565b6102d16102cc366004612286565b6105ba565b60405161028d9190612512565b6102f16102ec3660046122d1565b610624565b005b610280610301366004612161565b610634565b610280610646565b61028061066a565b61031e610670565b60405161028d919061245a565b610280610688565b61028061068e565b6102806106a6565b6102d16103513660046121d1565b6106ca565b61031e610798565b6102f161036c366004612353565b6107b0565b6102806108ed565b610381610911565b60405161028d919061293b565b610396610916565b60405161028d91906124c5565b6102f1610978565b6102806103b9366004612161565b610a6f565b610280610a8a565b6102806103d4366004612161565b610a90565b610280610aa2565b6102806103ef366004612161565b610ab0565b61029e610ac2565b6102f161040a366004612353565b610ae0565b6102d161041d366004612286565b610c03565b610280610430366004612199565b610c19565b6102f16104433660046122d1565b610c36565b610280610c41565b610280610c47565b610280610466366004612199565b610c4d565b6102f1610479366004612286565b610c6a565b610280610ced565b610280610d51565b6102f161049c366004612211565b610d57565b6102806104af366004612199565b610f5d565b6102806104c2366004612199565b610f88565b610280610fa5565b6102f1610fab565b610280610fce565b610280610fd4565b6102f16104f5366004612286565b610fda565b6001600160a01b0381166000908152601260209081526040808320546011909252822054670de0b6b3a764000090610530610ced565b61053a9190612ab4565b6001600160a01b03851660009081526005602052604090205461055d9190612a95565b6105679190612961565b6105719190612949565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60126020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061061390869061251d565b60405180910390a350600192915050565b61062f83838361105c565b505050565b60056020526000908152604090205481565b7f4042aac4451e5e84005a3e043b4190caf5625d5c4e121482367d3124a148e28481565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600e5481565b6000600e54600c546106a09190612a95565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061070457506000198114155b1561077f5760006107158583612ab4565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061077590859061251d565b60405180910390a3505b61078a86868661144f565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107dc5760405162461bcd60e51b81526004016107d3906128b7565b60405180910390fd5b6002600055336107ea610ced565b6010556107f5610aa2565b600f556001600160a01b0381161561083c57610810816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b6000821161085c5760405162461bcd60e51b81526004016107d390612799565b816002600082825461086e9190612ab4565b90915550503360009081526005602052604081208054849290610892908490612ab4565b909155506108a3905030338461144f565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108dc919061251d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600a80548060200260200160405190810160405280929190818152602001828054801561096e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610950575b5050505050905090565b6002600054141561099b5760405162461bcd60e51b81526004016107d3906128b7565b6002600055336109a9610ced565b6010556109b4610aa2565b600f556001600160a01b038116156109fb576109cf816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b336000908152601260205260409020548015610a665733600081815260126020526040812055610a2d9030908361144f565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108dc919061251d565b50506001600055565b6001600160a01b031660009081526004602052604090205490565b600c5481565b60066020526000908152604090205481565b60006106a042600d54611550565b60116020526000908152604090205481565b60405180604001604052806002815260200161586960f01b81525081565b60026000541415610b035760405162461bcd60e51b81526004016107d3906128b7565b600260005533610b11610ced565b601055610b1c610aa2565b600f556001600160a01b03811615610b6357610b37816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b60008211610b835760405162461bcd60e51b81526004016107d39061265c565b8160026000828254610b959190612949565b90915550503360009081526005602052604081208054849290610bb9908490612949565b90915550610bca905033308461144f565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108dc919061251d565b6000610c1033848461144f565b50600192915050565b600760209081526000928352604080842090915290825290205481565b61062f838383611566565b60135481565b600f5481565b600860209081526000928352604080842090915290825290205481565b6040516370a0823160e01b8152610ce990839030906370a0823190610c9390339060040161245a565b60206040518083038186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce3919061236b565b83611566565b5050565b600060025460001415610d0357506010546106a3565b600254600c54600f54610d14610aa2565b610d1e9190612ab4565b610d289190612a95565b610d3a90670de0b6b3a7640000612a95565b610d449190612961565b6010546106a09190612949565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610da483612af7565b9190505589604051602001610dbe96959493929190612526565b60405160208183030381529060405280519060200120905060007f4042aac4451e5e84005a3e043b4190caf5625d5c4e121482367d3124a148e28482604051602001610e0b9291906123e9565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e48949392919061255a565b6020604051602081039080840390855afa158015610e6a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e9d5760405162461bcd60e51b81526004016107d390612842565b896001600160a01b0316816001600160a01b031614610ece5760405162461bcd60e51b81526004016107d39061276b565b86421115610eee5760405162461bcd60e51b81526004016107d3906126e0565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f49908c9061251d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600960209081526000928352604080842090915290825290205481565b60105481565b33600090815260056020526040902054610fc4906107b0565b610fcc610978565b565b600d5481565b60145481565b610ce982836001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161100a919061245a565b60206040518083038186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a919061236b565b835b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d9061109690879060040161245a565b60206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e6919061236b565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b919061236b565b61116690600a6129c7565b6111708584612a95565b61117a9190612961565b90506000811161119c5760405162461bcd60e51b81526004016107d39061263c565b6000806111ab87308886611850565b5090925090506111c66001600160a01b038816338484611b1f565b866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611237919061236b565b61124290600a6129c7565b61124c8286612a95565b6112569190612961565b92508483116112775760405162461bcd60e51b81526004016107d39061273e565b6112818284611b77565b3360009081526007602090815260408083206001600160a01b038b168452909152812080548592906112b4908490612949565b90915550506040516335313c2160e11b81526000906001600160a01b03841690636a627842906112e890309060040161245a565b602060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a919061236b565b3360009081526008602090815260408083206001600160a01b038d168452909152812080549293508392909190611372908490612949565b90915550503360009081526009602090815260408083206001600160a01b038c168452909152812080548692906113aa908490612949565b9091555050601454601354600091906113c39087612a95565b6113cd9190612961565b90506113e2336113dd8388612ab4565b611b77565b6113ec3082611b77565b6113f581611c05565b886001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6878b8960405161143c93929190612925565b60405180910390a3505050505050505050565b6001600160a01b03831660009081526004602052604081208054839290611477908490612ab4565b90915550506001600160a01b038216600090815260046020526040812080548392906114a4908490612949565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114ee919061251d565b60405180910390a36001600160a01b0383166000908152600b602052604090205460ff161561062f5760006014546013548361152a9190612a95565b6115349190612961565b905061154183308361144f565b61154a81611c05565b50505050565b600081831061155f5781610791565b5090919050565b3360008181526009602090815260408083206001600160a01b038816808552908352818420548585526008845282852082865284528285205495855260078452828520918552925290912054909190848310156115c1578294505b6000836115ce8785612a95565b6115d89190612961565b9050836115e58784612a95565b6115ef9190612961565b60405163e6a4390560e01b815290925060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a439059061162e908b90309060040161246e565b60206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061217d565b90506116946001600160a01b0382168284611d51565b60405163226bf2d160e21b81526001600160a01b038216906389afcb44906116c090339060040161245a565b6040805180830381600087803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117119190612383565b50503360009081526009602090815260408083206001600160a01b038c16845290915281208054899290611746908490612ab4565b90915550503360009081526008602090815260408083206001600160a01b038c1684529091528120805484929061177e908490612ab4565b90915550503360009081526007602090815260408083206001600160a01b038c168452909152812080548592906117b6908490612ab4565b909155508690506117c78885612949565b106117e45760405162461bcd60e51b81526004016107d3906126b9565b6117f7336117f28986612949565b611d70565b876001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f89868660405161183e93929190612925565b60405180910390a35050505050505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a9060040161246e565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e0919061217d565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a9060040161246e565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b919061217d565b6001600160a01b038181166000908152600b602052604081208054600160ff199091168117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600b602052604090205460ff16611a79576001600160a01b038381166000908152600b602052604081208054600160ff199091168117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611df2565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611ecb565b9050868111611ade57879450925082611b11565b6000611aeb888486611ecb565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61154a846323b872dd60e01b858585604051602401611b4093929190612488565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f35565b8060016000828254611b899190612949565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612949565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061251d565b60405180910390a35050565b6000611c0f610ced565b601055611c1a610aa2565b600f556001600160a01b03811615611c6157611c35816104fa565b6001600160a01b0382166000908152601260209081526040808320939093556010546011909152919020555b600d544210611c7f57600e54611c779083612961565b600c55611cc1565b600042600d54611c8f9190612ab4565b90506000600c5482611ca19190612a95565b600e54909150611cb18286612949565b611cbb9190612961565b600c5550505b30600090815260046020526040902054600e54611cde9082612961565b600c541115611cff5760405162461bcd60e51b81526004016107d3906127c4565b42600f819055600e54611d1191612949565b600d556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d406490611d4490859061251d565b60405180910390a1505050565b61062f8363a9059cbb60e01b8484604051602401611b409291906124ac565b8060016000828254611d829190612ab4565b90915550506001600160a01b03821660009081526004602052604081208054839290611daf908490612ab4565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061251d565b6000806000611e018585612019565b509050600080611e128888886120a3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e829190612305565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611eb9578082611ebc565b81815b90999098509650505050505050565b6000808411611eec5760405162461bcd60e51b81526004016107d3906127fb565b600083118015611efc5750600082115b611f185760405162461bcd60e51b81526004016107d3906125ab565b82611f238386612a95565b611f2d9190612961565b949350505050565b611f47826001600160a01b0316612113565b611f635760405162461bcd60e51b81526004016107d3906128ee565b600080836001600160a01b031683604051611f7e91906123cd565b6000604051808303816000865af19150503d8060008114611fbb576040519150601f19603f3d011682016040523d82523d6000602084013e611fc0565b606091505b509150915081611fe25760405162461bcd60e51b81526004016107d390612684565b80511561154a5780806020019051810190611ffd91906122b1565b61154a5760405162461bcd60e51b81526004016107d39061286d565b600080826001600160a01b0316846001600160a01b0316141561204e5760405162461bcd60e51b81526004016107d3906125f5565b826001600160a01b0316846001600160a01b03161061206e578284612071565b83835b90925090506001600160a01b03821661209c5760405162461bcd60e51b81526004016107d390612709565b9250929050565b60008060006120b28585612019565b915091508582826040516020016120ca9291906123a6565b604051602081830303815290604052805190602001206040516020016120f1929190612404565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611f2d5750141592915050565b80516001600160701b038116811461057457600080fd5b600060208284031215612172578081fd5b813561079181612b28565b60006020828403121561218e578081fd5b815161079181612b28565b600080604083850312156121ab578081fd5b82356121b681612b28565b915060208301356121c681612b28565b809150509250929050565b6000806000606084860312156121e5578081fd5b83356121f081612b28565b9250602084013561220081612b28565b929592945050506040919091013590565b600080600080600080600060e0888a03121561222b578283fd5b873561223681612b28565b9650602088013561224681612b28565b95506040880135945060608801359350608088013560ff81168114612269578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215612298578182fd5b82356122a381612b28565b946020939093013593505050565b6000602082840312156122c2578081fd5b81518015158114610791578182fd5b6000806000606084860312156122e5578283fd5b83356122f081612b28565b95602085013595506040909401359392505050565b600080600060608486031215612319578283fd5b6123228461214a565b92506123306020850161214a565b9150604084015163ffffffff81168114612348578182fd5b809150509250925092565b600060208284031215612364578081fd5b5035919050565b60006020828403121561237c578081fd5b5051919050565b60008060408385031215612395578081fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b600082516123df818460208701612acb565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156125065783516001600160a01b0316835292840192918401916001016124e1565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082528251806020840152612597816040850160208701612acb565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c109d5c9b88195e18d959591959609a1b604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601390820152721a5b9cdd59999a58da595b9d0818dc99591a5d606a1b604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6000821982111561295c5761295c612b12565b500190565b60008261297c57634e487b7160e01b81526012600452602481fd5b500490565b80825b600180861161299357506129be565b8187048211156129a5576129a5612b12565b808616156129b257918102915b9490941c938002612984565b94509492505050565b600061079160001984846000826129e057506001610791565b816129ed57506000610791565b8160018114612a035760028114612a0d57612a3a565b6001915050610791565b60ff841115612a1e57612a1e612b12565b6001841b915084821115612a3457612a34612b12565b50610791565b5060208310610133831016604e8410600b8410161715612a6d575081810a83811115612a6857612a68612b12565b610791565b612a7a8484846001612981565b808604821115612a8c57612a8c612b12565b02949350505050565b6000816000190483118215151615612aaf57612aaf612b12565b500290565b600082821015612ac657612ac6612b12565b500390565b60005b83811015612ae6578181015183820152602001612ace565b8381111561154a5750506000910152565b6000600019821415612b0b57612b0b612b12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612b3d57600080fd5b5056fea26469706673582212205ba5f19140c183716d26bce7fe182fe7b59569699ff6ad99c1d6ea6c9c6fd12664736f6c63430008000033

Deployed Bytecode Sourcemap

11146:15934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15164:184;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11284:51;;;:::i;:::-;;;;;;;:::i;14151:39::-;;;;;;:::i;:::-;;:::i;23600:207::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18637:116::-;;;;;;:::i;:::-;;:::i;:::-;;11848:38;;;;;;:::i;:::-;;:::i;12085:40::-;;;:::i;11593:27::-;;;:::i;13300:80::-;;;:::i;:::-;;;;;;;:::i;13976:29::-;;;:::i;15356:108::-;;;:::i;11959:119::-;;;:::i;26010:513::-;;;;;;:::i;:::-;;:::i;13387:109::-;;;:::i;16135:311::-;;;;;;:::i;:::-;;:::i;12215:128::-;;;:::i;11495:34::-;;;:::i;:::-;;;;;;;:::i;17866:94::-;;;:::i;:::-;;;;;;;:::i;16454:308::-;;;:::i;25185:108::-;;;;;;:::i;:::-;;:::i;13908:26::-;;;:::i;12424:39::-;;;;;;:::i;:::-;;:::i;14675:128::-;;;:::i;14090:54::-;;;;;;:::i;:::-;;:::i;11396:36::-;;;:::i;15818:309::-;;;;;;:::i;:::-;;:::i;25554:149::-;;;;;;:::i;:::-;;:::i;13543:61::-;;;;;;:::i;:::-;;:::i;21416:120::-;;;;;;:::i;:::-;;:::i;14611:20::-;;;:::i;14012:26::-;;;:::i;13647:63::-;;;;;;:::i;:::-;;:::i;21257:147::-;;;;;;:::i;:::-;;:::i;14815:337::-;;;:::i;11690:28::-;;;:::i;24294:688::-;;;;;;:::i;:::-;;:::i;22989:136::-;;;;;;:::i;:::-;;:::i;13749:69::-;;;;;;:::i;:::-;;:::i;14045:32::-;;;:::i;16770:93::-;;;:::i;13941:28::-;;;:::i;14638:24::-;;;:::i;18498:127::-;;;;;;:::i;:::-;;:::i;15164:184::-;-1:-1:-1;;;;;15324:16:0;;15218:4;15324:16;;;:7;:16;;;;;;;;;15281:22;:31;;;;;;15316:4;;15262:16;:14;:16::i;:::-;:50;;;;:::i;:::-;-1:-1:-1;;;;;15243:15:0;;;;;;:6;:15;;;;;;:70;;;;:::i;:::-;:77;;;;:::i;:::-;15242:98;;;;:::i;:::-;15235:105;;15164:184;;;;:::o;11284:51::-;;;;;;;;;;;;;;-1:-1:-1;;;11284:51:0;;;;:::o;14151:39::-;;;;;;;;;;;;;:::o;23600:207::-;23693:10;23665:4;23682:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;23682:31:0;;;;;;;;;;:40;;;23740:37;23665:4;;23682:31;;23740:37;;;;23716:6;;23740:37;:::i;:::-;;;;;;;;-1:-1:-1;23795:4:0;23600:207;;;;:::o;18637:116::-;18714:31;18723:5;18730:6;18738;18714:8;:31::i;:::-;18637:116;;;:::o;11848:38::-;;;;;;;;;;;;;:::o;12085:40::-;;;:::o;11593:27::-;;;;:::o;13300:80::-;13337:42;13300:80;:::o;13976:29::-;;;;:::o;15356:108::-;15411:4;15448:8;;15435:10;;:21;;;;:::i;:::-;15428:28;;15356:108;;:::o;11959:119::-;12001:77;11959:119;:::o;26010:513::-;-1:-1:-1;;;;;26169:15:0;;26089:4;26169:15;;;:10;:15;;;;;;;;26124:10;26169:24;;;;;;;;26089:4;;26124:10;;26169:24;26210:14;;;;;:52;;;-1:-1:-1;;26228:16:0;:34;;26210:52;26206:242;;;26279:17;26299:25;26318:6;26299:16;:25;:::i;:::-;-1:-1:-1;;;;;26339:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;26400:36;26279:45;;-1:-1:-1;26339:24:0;;26400:36;;;;26279:45;;26400:36;:::i;:::-;;;;;;;;26206:242;;26460:33;26476:3;26481;26486:6;26460:15;:33::i;:::-;26511:4;26504:11;;;;26010:513;;;;;;:::o;13387:109::-;13453:42;13387:109;:::o;16135:311::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;;;;;;;;;7458:1;8188:7;:18;16198:10:::1;15549:16;:14;:16::i;:::-;15526:20;:39:::0;15593:26:::1;:24;:26::i;:::-;15576:14;:43:::0;-1:-1:-1;;;;;15634:21:0;::::1;::::0;15630:157:::1;;15691:15;15698:7;15691:6;:15::i;:::-;-1:-1:-1::0;;;;;15672:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15755:20:::1;::::0;15721:22:::1;:31:::0;;;;;;:54;15630:157:::1;16238:1:::2;16229:6;:10;16221:40;;;;-1:-1:-1::0;;;16221:40:0::2;;;;;;;:::i;:::-;16288:6;16272:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16312:10:0::2;16305:18;::::0;;;:6:::2;:18;::::0;;;;:28;;16327:6;;16305:18;:28:::2;::::0;16327:6;;16305:28:::2;:::i;:::-;::::0;;;-1:-1:-1;16344:50:0::2;::::0;-1:-1:-1;16368:4:0::2;16375:10;16387:6:::0;16344:15:::2;:50::i;:::-;16419:10;-1:-1:-1::0;;;;;16410:28:0::2;;16431:6;16410:28;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;7414:1:0;8367:7;:22;16135:311::o;12215:128::-;12257:86;12215:128;:::o;11495:34::-;11528:1;11495:34;:::o;17866:94::-;17908:16;17944:8;17937:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17937:15:0;;;;;;;;;;;;;;;;;;;;;;;17866:94;:::o;16454:308::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;16508:10:::1;15549:16;:14;:16::i;:::-;15526:20;:39:::0;15593:26:::1;:24;:26::i;:::-;15576:14;:43:::0;-1:-1:-1;;;;;15634:21:0;::::1;::::0;15630:157:::1;;15691:15;15698:7;15691:6;:15::i;:::-;-1:-1:-1::0;;;;;15672:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15755:20:::1;::::0;15721:22:::1;:31:::0;;;;;;:54;15630:157:::1;16556:10:::2;16531:14;16548:19:::0;;;:7:::2;:19;::::0;;;;;16582:10;;16578:177:::2;;16617:10;16631:1;16609:19:::0;;;:7:::2;:19;::::0;;;;:23;16647:50:::2;::::0;16671:4:::2;::::0;16690:6;16647:15:::2;:50::i;:::-;16724:10;-1:-1:-1::0;;;;;16717:26:0::2;;16736:6;16717:26;;;;;;:::i;16578:177::-;-1:-1:-1::0;;7414:1:0;8367:7;:22;16454:308::o;25185:108::-;-1:-1:-1;;;;;25268:17:0;25244:4;25268:17;;;:8;:17;;;;;;;25185:108::o;13908:26::-;;;;:::o;12424:39::-;;;;;;;;;;;;;:::o;14675:128::-;14732:4;14756:39;14765:15;14782:12;;14756:8;:39::i;14090:54::-;;;;;;;;;;;;;:::o;11396:36::-;;;;;;;;;;;;;;-1:-1:-1;;;11396:36:0;;;;:::o;15818:309::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;15884:10:::1;15549:16;:14;:16::i;:::-;15526:20;:39:::0;15593:26:::1;:24;:26::i;:::-;15576:14;:43:::0;-1:-1:-1;;;;;15634:21:0;::::1;::::0;15630:157:::1;;15691:15;15698:7;15691:6;:15::i;:::-;-1:-1:-1::0;;;;;15672:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15755:20:::1;::::0;15721:22:::1;:31:::0;;;;;;:54;15630:157:::1;15924:1:::2;15915:6;:10;15907:37;;;;-1:-1:-1::0;;;15907:37:0::2;;;;;;;:::i;:::-;15971:6;15955:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15995:10:0::2;15988:18;::::0;;;:6:::2;:18;::::0;;;;:28;;16010:6;;15988:18;:28:::2;::::0;16010:6;;15988:28:::2;:::i;:::-;::::0;;;-1:-1:-1;16027:50:0::2;::::0;-1:-1:-1;16043:10:0::2;16063:4;16070:6:::0;16027:15:::2;:50::i;:::-;16100:10;-1:-1:-1::0;;;;;16093:26:0::2;;16112:6;16093:26;;;;;;:::i;25554:149::-:0;25616:4;25633:40;25649:10;25661:3;25666:6;25633:15;:40::i;:::-;-1:-1:-1;25691:4:0;25554:149;;;;:::o;13543:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21416:120::-;21495:33;21505:5;21512:6;21520:7;21495:9;:33::i;14611:20::-;;;;:::o;14012:26::-;;;;:::o;13647:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21257:147::-;21343:43;;-1:-1:-1;;;21343:43:0;;21326:70;;21336:5;;21358:4;;21343:31;;:43;;21375:10;;21343:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21388:7;21326:9;:70::i;:::-;21257:147;;:::o;14815:337::-;14862:4;14883:12;;14899:1;14883:17;14879:77;;;-1:-1:-1;14924:20:0;;14917:27;;14879:77;15131:12;;15111:10;;15075:14;;15028:26;:24;:26::i;:::-;:61;;;;:::i;:::-;15027:94;;;;:::i;:::-;:101;;15124:4;15027:101;:::i;:::-;:116;;;;:::i;:::-;14986:20;;:158;;;;:::i;11690:28::-;;;;:::o;24294:688::-;-1:-1:-1;;;;;24504:13:0;;24421:18;24504:13;;;:6;:13;;;;;:15;;12257:86;;24480:5;;24487:7;;24496:6;;24504:15;24421:18;24504:15;;;:::i;:::-;;;;;24521:8;24452:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24442:89;;;;;;24421:110;;24542:14;24598:15;24615:10;24569:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24559:68;;;;;;24542:85;;24638:17;24658:26;24668:6;24676:1;24679;24682;24658:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24658:26:0;;-1:-1:-1;;24658:26:0;;;-1:-1:-1;;;;;;;24703:23:0;;24695:53;;;;-1:-1:-1;;;24695:53:0;;;;;;;:::i;:::-;24780:5;-1:-1:-1;;;;;24767:18:0;:9;-1:-1:-1;;;;;24767:18:0;;24759:51;;;;-1:-1:-1;;;24759:51:0;;;;;;;:::i;:::-;24848:8;24829:15;:27;;24821:55;;;;-1:-1:-1;;;24821:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24889:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;;:35;;;24942:32;;;;;24918:6;;24942:32;:::i;:::-;;;;;;;;24294:688;;;;;;;;;;:::o;22989:136::-;-1:-1:-1;;;;;23089:19:0;;;23065:4;23089:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;22989:136::o;13749:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14045:32::-;;;;:::o;16770:93::-;16821:10;16814:18;;;;:6;:18;;;;;;16806:27;;:7;:27::i;:::-;16844:11;:9;:11::i;:::-;16770:93::o;13941:28::-;;;;:::o;14638:24::-;;;;:::o;18498:127::-;18565:52;18574:5;18581;-1:-1:-1;;;;;18581:15:0;;18597:10;18581:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18610:6;20123:1122;20215:32;;-1:-1:-1;;;20215:32:0;;20201:11;;13337:42;;20215:16;;:32;;20240:5;;20215:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20201:46;;20258:11;20303:5;-1:-1:-1;;;;;20303:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20290:29;;20298:2;20290:29;:::i;:::-;20272:15;20281:6;20272;:15;:::i;:::-;:47;;;;:::i;:::-;20258:61;;20347:1;20338:6;:10;20330:29;;;;-1:-1:-1;;;20330:29:0;;;;;;;:::i;:::-;20381:13;20396:12;20413:60;20435:5;20451:4;20458:6;20466;20413:13;:60::i;:::-;-1:-1:-1;20380:93:0;;-1:-1:-1;20380:93:0;-1:-1:-1;20494:50:0;-1:-1:-1;;;;;20494:22:0;;20517:10;20380:93;;20494:22;:50::i;:::-;20606:5;-1:-1:-1;;;;;20606:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20593:29;;20601:2;20593:29;:::i;:::-;20574:16;20583:7;20574:6;:16;:::i;:::-;:48;;;;:::i;:::-;20565:57;;20650:6;20641;:15;20633:47;;;;-1:-1:-1;;;20633:47:0;;;;;;;:::i;:::-;20701:20;20707:5;20714:6;20701:5;:20::i;:::-;20741:10;20732:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;20732:36:0;;;;;;;;;:46;;20772:6;;20732:20;:46;;20772:6;;20732:46;:::i;:::-;;;;-1:-1:-1;;20817:43:0;;-1:-1:-1;;;20817:43:0;;20799:15;;-1:-1:-1;;;;;20817:28:0;;;;;:43;;20854:4;;20817:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20882:10;20871:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;20871:38:0;;;;;;;;;:52;;20799:61;;-1:-1:-1;20799:61:0;;20871:38;;:22;:52;;20799:61;;20871:52;:::i;:::-;;;;-1:-1:-1;;20961:10:0;20944:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;20944:44:0;;;;;;;;;:54;;20992:6;;20944:28;:54;;20992:6;;20944:54;:::i;:::-;;;;-1:-1:-1;;21036:4:0;;21030:3;;21009:9;;21036:4;21021:12;;:6;:12;:::i;:::-;:19;;;;:::i;:::-;21009:31;-1:-1:-1;21051:32:0;21057:10;21069:13;21009:31;21069:6;:13;:::i;:::-;21051:5;:32::i;:::-;21094:26;21108:4;21115;21094:5;:26::i;:::-;21131:21;21147:4;21131:15;:21::i;:::-;21206:5;-1:-1:-1;;;;;21178:59:0;21186:10;-1:-1:-1;;;;;21178:59:0;;21214:6;21222;21230;21178:59;;;;;;;;:::i;:::-;;;;;;;;20123:1122;;;;;;;;;:::o;26531:387::-;-1:-1:-1;;;;;26615:13:0;;;;;;:8;:13;;;;;:23;;26632:6;;26615:13;:23;;26632:6;;26615:23;:::i;:::-;;;;-1:-1:-1;;;;;;;26649:13:0;;;;;;:8;:13;;;;;:23;;26666:6;;26649:13;:23;;26666:6;;26649:23;:::i;:::-;;;;;;;;26712:3;-1:-1:-1;;;;;26698:26:0;26707:3;-1:-1:-1;;;;;26698:26:0;;26717:6;26698:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26749:10:0;;;;;;:5;:10;;;;;;;;26745:166;;;26776:9;26803:4;;26797:3;;26788:6;:12;;;;:::i;:::-;:19;;;;:::i;:::-;26776:31;;26822:41;26838:3;26851:4;26858;26822:15;:41::i;:::-;26878:21;26894:4;26878:15;:21::i;:::-;26745:166;26531:387;;;:::o;10721:106::-;10779:7;10810:1;10806;:5;:13;;10818:1;10806:13;;;-1:-1:-1;10814:1:0;;10799:20;-1:-1:-1;10721:106:0:o;21548:1137::-;21660:10;21628:12;21643:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;21643:44:0;;;;;;;;;;;;21717:22;;;:10;:22;;;;;:38;;;;;;;;;21783:20;;;:8;:20;;;;;:36;;;;;;;;;21643:44;;21717:38;21844:16;;;21840:65;;;21886:7;21877:16;;21840:65;21974:12;22012:7;21989:20;22003:6;21989:11;:20;:::i;:::-;:30;;;;:::i;:::-;21974:45;-1:-1:-1;22063:7:0;22042:18;22054:6;22042:9;:18;:::i;:::-;:28;;;;:::i;:::-;22097:46;;-1:-1:-1;;;22097:46:0;;22030:40;;-1:-1:-1;22081:13:0;;13453:42;;22097:15;;:46;;22121:5;;22137:4;;22097:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22081:62;-1:-1:-1;22164:42:0;-1:-1:-1;;;;;22164:26:0;;22081:62;22198:7;22164:26;:42::i;:::-;22243:40;;-1:-1:-1;;;22243:40:0;;-1:-1:-1;;;;;22243:28:0;;;;;:40;;22272:10;;22243:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;22321:10:0;22304:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;22304:44:0;;;;;;;;;:54;;22352:6;;22304:28;:54;;22352:6;;22304:54;:::i;:::-;;;;-1:-1:-1;;22380:10:0;22369:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;22369:38:0;;;;;;;;;:49;;22411:7;;22369:22;:49;;22411:7;;22369:49;:::i;:::-;;;;-1:-1:-1;;22438:10:0;22429:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;22429:36:0;;;;;;;;;:49;;22469:9;;22429:20;:49;;22469:9;;22429:49;:::i;:::-;;;;-1:-1:-1;22516:7:0;;-1:-1:-1;22497:16:0;22507:6;22497:9;:16;:::i;:::-;:26;22489:52;;;;-1:-1:-1;;;22489:52:0;;;;;;;:::i;:::-;22552:35;22558:10;22570:16;22580:6;22570:9;:16;:::i;:::-;22552:5;:35::i;:::-;22642:5;-1:-1:-1;;;;;22613:64:0;22622:10;-1:-1:-1;;;;;22613:64:0;;22650:6;22658:9;22669:7;22613:64;;;;;;;;:::i;:::-;;;;;;;;21548:1137;;;;;;;;:::o;18765:1346::-;19043:31;;-1:-1:-1;;;19043:31:0;;18931:12;;;;;;13453:42;;19043:15;;:31;;19059:6;;19067;;19043:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19036:38;-1:-1:-1;;;;;;19089:18:0;;19085:266;;19131:34;;-1:-1:-1;;;19131:34:0;;13453:42;;19131:18;;:34;;19150:6;;19158;;19131:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19180:11:0;;;;;;;:5;:11;;;;;:18;;19194:4;-1:-1:-1;;19180:18:0;;;;;;;;19213:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19213:21:0;;;;;;;;;;19180:11;-1:-1:-1;19085:266:0;;;-1:-1:-1;;;;;19257:11:0;;;;;;:5;:11;;;;;;;;19252:99;;-1:-1:-1;;;;;19285:11:0;;;;;;;:5;:11;;;;;:18;;19299:4;-1:-1:-1;;19285:18:0;;;;;;;;19318:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19318:21:0;;;;;;;;;;19252:99;19372:13;19387;19404:64;13453:42;19453:6;19461;19404:30;:64::i;:::-;19371:97;;;;19483:8;19495:1;19483:13;:30;;;;-1:-1:-1;19500:13:0;;19483:30;19479:625;;;19552:14;;-1:-1:-1;19568:14:0;;-1:-1:-1;19479:625:0;;;19616:19;19638:60;19663:14;19679:8;19689;19638:24;:60::i;:::-;19616:82;;19735:14;19717;:32;19713:380;;19792:14;;-1:-1:-1;19808:14:0;-1:-1:-1;19808:14:0;19713:380;;;19864:19;19886:60;19911:14;19927:8;19937;19886:24;:60::i;:::-;19864:82;;19990:14;19972;:32;;19965:40;;-1:-1:-1;;;19965:40:0;;;;;;;;;20046:14;-1:-1:-1;20062:14:0;;-1:-1:-1;19713:380:0;19479:625;;18765:1346;;;;;;;;;;:::o;1439:201::-;1537:95;1556:5;1586:27;;;1615:4;1621:2;1625:5;1563:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1563:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;1563:68:0;-1:-1:-1;;;;;;1563:68:0;;;;;;;;;;1537:18;:95::i;17972:250::-;18076:6;18061:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18142:13:0;;;;;;:8;:13;;;;;:23;;18159:6;;18142:13;:23;;18159:6;;18142:23;:::i;:::-;;;;-1:-1:-1;;18181:33:0;;-1:-1:-1;;;;;18181:33:0;;;18198:1;;18181:33;;;;18207:6;;18181:33;:::i;:::-;;;;;;;;17972:250;;:::o;16875:979::-;16943:1;15549:16;:14;:16::i;:::-;15526:20;:39;15593:26;:24;:26::i;:::-;15576:14;:43;-1:-1:-1;;;;;15634:21:0;;;15630:157;;15691:15;15698:7;15691:6;:15::i;:::-;-1:-1:-1;;;;;15672:16:0;;;;;;:7;:16;;;;;;;;:34;;;;15755:20;;15721:22;:31;;;;;;:54;15630:157;16981:12:::1;;16962:15;:31;16958:285;;17032:8;::::0;17023:17:::1;::::0;:6;:17:::1;:::i;:::-;17010:10;:30:::0;16958:285:::1;;;17073:14;17105:15;17090:12;;:30;;;;:::i;:::-;17073:47;;17135:13;17163:10;;17151:9;:22;;;;:::i;:::-;17223:8;::::0;17135:38;;-1:-1:-1;17202:17:0::1;17135:38:::0;17202:6;:17:::1;:::i;:::-;17201:30;;;;:::i;:::-;17188:10;:43:::0;-1:-1:-1;;16958:285:0::1;17635:4;17603:12;17618:23:::0;;;:8:::1;:23;::::0;;;;;17684:8:::1;::::0;17674:18:::1;::::0;17618:23;17674:18:::1;:::i;:::-;17660:10;;:32;;17652:69;;;;-1:-1:-1::0;;;17652:69:0::1;;;;;;;:::i;:::-;17751:15;17734:14;:32:::0;;;17810:8:::1;::::0;17792:26:::1;::::0;::::1;:::i;:::-;17777:12;:41:::0;17834:12:::1;::::0;::::1;::::0;::::1;::::0;17839:6;;17834:12:::1;:::i;:::-;;;;;;;;15797:1;16875:979:::0;;:::o;1258:173::-;1338:85;1357:5;1387:23;;;1412:2;1416:5;1364:58;;;;;;;;;:::i;18234:252::-;18338:6;18323:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18406:13:0;;;;;;:8;:13;;;;;:23;;18423:6;;18406:13;:23;;18423:6;;18406:23;:::i;:::-;;;;-1:-1:-1;;18445:33:0;;18467:1;;-1:-1:-1;;;;;18445:33:0;;;;;;;18471:6;;18445:33;:::i;9533:393::-;9626:13;9641;9668:14;9687:26;9698:6;9706;9687:10;:26::i;:::-;9667:46;;;9725:13;9740;9775:32;9783:7;9792:6;9800;9775:7;:32::i;:::-;-1:-1:-1;;;;;9758:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9724:98;-1:-1:-1;;;;;9724:98:0;;;-1:-1:-1;;;;;9724:98:0;;;9866:6;-1:-1:-1;;;;;9856:16:0;:6;-1:-1:-1;;;;;9856:16:0;;:62;;9899:8;9909;9856:62;;;9876:8;9886;9856:62;9833:85;;;;-1:-1:-1;9533:393:0;-1:-1:-1;;;;;;;9533:393:0:o;10045:322::-;10127:12;10170:1;10160:7;:11;10152:63;;;;-1:-1:-1;;;10152:63:0;;;;;;;:::i;:::-;10245:1;10234:8;:12;:28;;;;;10261:1;10250:8;:12;10234:28;10226:83;;;;-1:-1:-1;;;10226:83:0;;;;;;;:::i;:::-;10351:8;10330:18;10340:8;10330:7;:18;:::i;:::-;:29;;;;:::i;:::-;10320:39;10045:322;-1:-1:-1;;;;10045:322:0:o;1998:598::-;2086:27;2094:5;-1:-1:-1;;;;;2086:25:0;;:27::i;:::-;2078:71;;;;-1:-1:-1;;;2078:71:0;;;;;;;:::i;:::-;2223:12;2237:23;2272:5;-1:-1:-1;;;;;2264:19:0;2284:4;2264:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2222:67;;;;2308:7;2300:52;;;;-1:-1:-1;;;2300:52:0;;;;;;;:::i;:::-;2369:17;;:21;2365:224;;2511:10;2500:30;;;;;;;;;;;;:::i;:::-;2492:85;;;;-1:-1:-1;;;2492:85:0;;;;;;;:::i;8543:353::-;8618:14;8634;8679:6;-1:-1:-1;;;;;8669:16:0;:6;-1:-1:-1;;;;;8669:16:0;;;8661:68;;;;-1:-1:-1;;;8661:68:0;;;;;;;:::i;:::-;8768:6;-1:-1:-1;;;;;8759:15:0;:6;-1:-1:-1;;;;;8759:15:0;;:53;;8797:6;8805;8759:53;;;8778:6;8786;8759:53;8740:72;;-1:-1:-1;8740:72:0;-1:-1:-1;;;;;;8831:20:0;;8823:65;;;;-1:-1:-1;;;8823:65:0;;;;;;;:::i;:::-;8543:353;;;;;:::o;8988:487::-;9077:12;9103:14;9119;9137:26;9148:6;9156;9137:10;:26::i;:::-;9102:61;;;;9273:7;9326:6;9334;9309:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9299:43;;;;;;9212:251;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9212:251:0;;;;;;;;;9202:262;;9212:251;9202:262;;;;;8988:487;-1:-1:-1;;;;;;8988:487:0:o;818:374::-;878:4;1101:20;;944:66;1141:15;;;;;:42;;-1:-1:-1;1160:23:0;;;1133:51;-1:-1:-1;;818:374:0:o;14:190:1:-;95:13;;-1:-1:-1;;;;;137:42:1;;127:53;;117:2;;194:1;191;184:12;209:259;;321:2;309:9;300:7;296:23;292:32;289:2;;;342:6;334;327:22;289:2;386:9;373:23;405:33;432:5;405:33;:::i;473:263::-;;596:2;584:9;575:7;571:23;567:32;564:2;;;617:6;609;602:22;564:2;654:9;648:16;673:33;700:5;673:33;:::i;741:402::-;;;870:2;858:9;849:7;845:23;841:32;838:2;;;891:6;883;876:22;838:2;935:9;922:23;954:33;981:5;954:33;:::i;:::-;1006:5;-1:-1:-1;1063:2:1;1048:18;;1035:32;1076:35;1035:32;1076:35;:::i;:::-;1130:7;1120:17;;;828:315;;;;;:::o;1148:470::-;;;;1294:2;1282:9;1273:7;1269:23;1265:32;1262:2;;;1315:6;1307;1300:22;1262:2;1359:9;1346:23;1378:33;1405:5;1378:33;:::i;:::-;1430:5;-1:-1:-1;1487:2:1;1472:18;;1459:32;1500:35;1459:32;1500:35;:::i;:::-;1252:366;;1554:7;;-1:-1:-1;;;1608:2:1;1593:18;;;;1580:32;;1252:366::o;1623:853::-;;;;;;;;1835:3;1823:9;1814:7;1810:23;1806:33;1803:2;;;1857:6;1849;1842:22;1803:2;1901:9;1888:23;1920:33;1947:5;1920:33;:::i;:::-;1972:5;-1:-1:-1;2029:2:1;2014:18;;2001:32;2042:35;2001:32;2042:35;:::i;:::-;2096:7;-1:-1:-1;2150:2:1;2135:18;;2122:32;;-1:-1:-1;2201:2:1;2186:18;;2173:32;;-1:-1:-1;2257:3:1;2242:19;;2229:33;2306:4;2293:18;;2281:31;;2271:2;;2331:6;2323;2316:22;2271:2;1793:683;;;;-1:-1:-1;1793:683:1;;;;2359:7;2413:3;2398:19;;2385:33;;-1:-1:-1;2465:3:1;2450:19;;;2437:33;;1793:683;-1:-1:-1;;1793:683:1:o;2481:327::-;;;2610:2;2598:9;2589:7;2585:23;2581:32;2578:2;;;2631:6;2623;2616:22;2578:2;2675:9;2662:23;2694:33;2721:5;2694:33;:::i;:::-;2746:5;2798:2;2783:18;;;;2770:32;;-1:-1:-1;;;2568:240:1:o;2813:297::-;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2954:6;2946;2939:22;2901:2;2991:9;2985:16;3044:5;3037:13;3030:21;3023:5;3020:32;3010:2;;3071:6;3063;3056:22;3460:408;;;;3619:2;3607:9;3598:7;3594:23;3590:32;3587:2;;;3640:6;3632;3625:22;3587:2;3684:9;3671:23;3703:33;3730:5;3703:33;:::i;:::-;3755:5;3807:2;3792:18;;3779:32;;-1:-1:-1;3858:2:1;3843:18;;;3830:32;;3577:291;-1:-1:-1;;;3577:291:1:o;3873:474::-;;;;4029:2;4017:9;4008:7;4004:23;4000:32;3997:2;;;4050:6;4042;4035:22;3997:2;4078:42;4110:9;4078:42;:::i;:::-;4068:52;;4139:51;4186:2;4175:9;4171:18;4139:51;:::i;:::-;4129:61;;4233:2;4222:9;4218:18;4212:25;4277:10;4270:5;4266:22;4259:5;4256:33;4246:2;;4308:6;4300;4293:22;4246:2;4336:5;4326:15;;;3987:360;;;;;:::o;4352:190::-;;4464:2;4452:9;4443:7;4439:23;4435:32;4432:2;;;4485:6;4477;4470:22;4432:2;-1:-1:-1;4513:23:1;;4422:120;-1:-1:-1;4422:120:1:o;4547:194::-;;4670:2;4658:9;4649:7;4645:23;4641:32;4638:2;;;4691:6;4683;4676:22;4638:2;-1:-1:-1;4719:16:1;;4628:113;-1:-1:-1;4628:113:1:o;4746:255::-;;;4886:2;4874:9;4865:7;4861:23;4857:32;4854:2;;;4907:6;4899;4892:22;4854:2;-1:-1:-1;;4935:16:1;;4991:2;4976:18;;;4970:25;4935:16;;4970:25;;-1:-1:-1;4844:157:1:o;5006:333::-;-1:-1:-1;;5233:2:1;5229:15;;;5225:24;;5213:37;;5284:15;;;;5280:24;5275:2;5266:12;;5259:46;5330:2;5321:12;;5153:186::o;5344:274::-;;5511:6;5505:13;5527:53;5573:6;5568:3;5561:4;5553:6;5549:17;5527:53;:::i;:::-;5596:16;;;;;5481:137;-1:-1:-1;;5481:137:1:o;5623:392::-;-1:-1:-1;;;5881:27:1;;5933:1;5924:11;;5917:27;;;;5969:2;5960:12;;5953:28;6006:2;5997:12;;5871:144::o;6020:636::-;-1:-1:-1;;;;;;6379:26:1;;6442:2;6438:15;;;;-1:-1:-1;;6434:53:1;6430:1;6421:11;;6414:74;6513:2;6504:12;;6497:28;6555:66;6550:2;6541:12;;6534:88;6647:2;6638:12;;6369:287::o;6661:203::-;-1:-1:-1;;;;;6825:32:1;;;;6807:51;;6795:2;6780:18;;6762:102::o;6869:304::-;-1:-1:-1;;;;;7099:15:1;;;7081:34;;7151:15;;7146:2;7131:18;;7124:43;7031:2;7016:18;;6998:175::o;7178:375::-;-1:-1:-1;;;;;7436:15:1;;;7418:34;;7488:15;;;;7483:2;7468:18;;7461:43;7535:2;7520:18;;7513:34;;;;7368:2;7353:18;;7335:218::o;7558:274::-;-1:-1:-1;;;;;7750:32:1;;;;7732:51;;7814:2;7799:18;;7792:34;7720:2;7705:18;;7687:145::o;7837:661::-;8008:2;8060:21;;;8130:13;;8033:18;;;8152:22;;;7837:661;;8008:2;8231:15;;;;8205:2;8190:18;;;7837:661;8277:195;8291:6;8288:1;8285:13;8277:195;;;8356:13;;-1:-1:-1;;;;;8352:39:1;8340:52;;8447:15;;;;8412:12;;;;8388:1;8306:9;8277:195;;;-1:-1:-1;8489:3:1;;7988:510;-1:-1:-1;;;;;;7988:510:1:o;8503:187::-;8668:14;;8661:22;8643:41;;8631:2;8616:18;;8598:92::o;8695:177::-;8841:25;;;8829:2;8814:18;;8796:76::o;8877:591::-;9164:25;;;-1:-1:-1;;;;;9263:15:1;;;9258:2;9243:18;;9236:43;9315:15;;;;9310:2;9295:18;;9288:43;9362:2;9347:18;;9340:34;9405:3;9390:19;;9383:35;;;;9216:3;9434:19;;9427:35;9151:3;9136:19;;9118:350::o;9473:398::-;9700:25;;;9773:4;9761:17;;;;9756:2;9741:18;;9734:45;9810:2;9795:18;;9788:34;9853:2;9838:18;;9831:34;9687:3;9672:19;;9654:217::o;10333:383::-;;10482:2;10471:9;10464:21;10514:6;10508:13;10557:6;10552:2;10541:9;10537:18;10530:34;10573:66;10632:6;10627:2;10616:9;10612:18;10607:2;10599:6;10595:15;10573:66;:::i;:::-;10700:2;10679:15;-1:-1:-1;;10675:29:1;10660:45;;;;10707:2;10656:54;;10454:262;-1:-1:-1;;10454:262:1:o;10721:406::-;10923:2;10905:21;;;10962:2;10942:18;;;10935:30;11001:34;10996:2;10981:18;;10974:62;-1:-1:-1;;;11067:2:1;11052:18;;11045:40;11117:3;11102:19;;10895:232::o;11132:403::-;11334:2;11316:21;;;11373:2;11353:18;;;11346:30;11412:34;11407:2;11392:18;;11385:62;-1:-1:-1;;;11478:2:1;11463:18;;11456:37;11525:3;11510:19;;11306:229::o;11540:329::-;11742:2;11724:21;;;11781:1;11761:18;;;11754:29;-1:-1:-1;;;11814:2:1;11799:18;;11792:36;11860:2;11845:18;;11714:155::o;11874:338::-;12076:2;12058:21;;;12115:2;12095:18;;;12088:30;-1:-1:-1;;;12149:2:1;12134:18;;12127:44;12203:2;12188:18;;12048:164::o;12217:356::-;12419:2;12401:21;;;12438:18;;;12431:30;12497:34;12492:2;12477:18;;12470:62;12564:2;12549:18;;12391:182::o;12578:337::-;12780:2;12762:21;;;12819:2;12799:18;;;12792:30;-1:-1:-1;;;12853:2:1;12838:18;;12831:43;12906:2;12891:18;;12752:163::o;12920:339::-;13122:2;13104:21;;;13161:2;13141:18;;;13134:30;-1:-1:-1;;;13195:2:1;13180:18;;13173:45;13250:2;13235:18;;13094:165::o;13264:356::-;13466:2;13448:21;;;13485:18;;;13478:30;13544:34;13539:2;13524:18;;13517:62;13611:2;13596:18;;13438:182::o;13625:343::-;13827:2;13809:21;;;13866:2;13846:18;;;13839:30;-1:-1:-1;;;13900:2:1;13885:18;;13878:49;13959:2;13944:18;;13799:169::o;13973:344::-;14175:2;14157:21;;;14214:2;14194:18;;;14187:30;-1:-1:-1;;;14248:2:1;14233:18;;14226:50;14308:2;14293:18;;14147:170::o;14322:341::-;14524:2;14506:21;;;14563:2;14543:18;;;14536:30;-1:-1:-1;;;14597:2:1;14582:18;;14575:47;14654:2;14639:18;;14496:167::o;14668:348::-;14870:2;14852:21;;;14909:2;14889:18;;;14882:30;14948:26;14943:2;14928:18;;14921:54;15007:2;14992:18;;14842:174::o;15021:403::-;15223:2;15205:21;;;15262:2;15242:18;;;15235:30;15301:34;15296:2;15281:18;;15274:62;-1:-1:-1;;;15367:2:1;15352:18;;15345:37;15414:3;15399:19;;15195:229::o;15429:341::-;15631:2;15613:21;;;15670:2;15650:18;;;15643:30;-1:-1:-1;;;15704:2:1;15689:18;;15682:47;15761:2;15746:18;;15603:167::o;15775:406::-;15977:2;15959:21;;;16016:2;15996:18;;;15989:30;16055:34;16050:2;16035:18;;16028:62;-1:-1:-1;;;16121:2:1;16106:18;;16099:40;16171:3;16156:19;;15949:232::o;16186:355::-;16388:2;16370:21;;;16427:2;16407:18;;;16400:30;16466:33;16461:2;16446:18;;16439:61;16532:2;16517:18;;16360:181::o;16546:355::-;16748:2;16730:21;;;16787:2;16767:18;;;16760:30;16826:33;16821:2;16806:18;;16799:61;16892:2;16877:18;;16720:181::o;17088:319::-;17290:25;;;17346:2;17331:18;;17324:34;;;;17389:2;17374:18;;17367:34;17278:2;17263:18;;17245:162::o;17412:184::-;17584:4;17572:17;;;;17554:36;;17542:2;17527:18;;17509:87::o;17601:128::-;;17672:1;17668:6;17665:1;17662:13;17659:2;;;17678:18;;:::i;:::-;-1:-1:-1;17714:9:1;;17649:80::o;17734:217::-;;17800:1;17790:2;;-1:-1:-1;;;17825:31:1;;17879:4;17876:1;17869:15;17907:4;17832:1;17897:15;17790:2;-1:-1:-1;17936:9:1;;17780:171::o;17956:453::-;18052:6;18075:5;18089:314;18138:1;18175:2;18165:8;18162:16;18152:2;;18182:5;;;18152:2;18223:4;18218:3;18214:14;18208:4;18205:24;18202:2;;;18232:18;;:::i;:::-;18282:2;18272:8;18268:17;18265:2;;;18297:16;;;;18265:2;18376:17;;;;;18336:15;;18089:314;;;18033:376;;;;;;;:::o;18414:139::-;;18503:44;-1:-1:-1;;18530:8:1;18524:4;18558:922;18642:8;18632:2;;-1:-1:-1;18683:1:1;18697:5;;18632:2;18731:4;18721:2;;-1:-1:-1;18768:1:1;18782:5;;18721:2;18813:4;18831:1;18826:59;;;;18899:1;18894:183;;;;18806:271;;18826:59;18856:1;18847:10;;18870:5;;;18894:183;18931:3;18921:8;18918:17;18915:2;;;18938:18;;:::i;:::-;18994:1;18984:8;18980:16;18971:25;;19022:3;19015:5;19012:14;19009:2;;;19029:18;;:::i;:::-;19062:5;;;18806:271;;19161:2;19151:8;19148:16;19142:3;19136:4;19133:13;19129:36;19123:2;19113:8;19110:16;19105:2;19099:4;19096:12;19092:35;19089:77;19086:2;;;-1:-1:-1;19198:19:1;;;19233:14;;;19230:2;;;19250:18;;:::i;:::-;19283:5;;19086:2;19330:42;19368:3;19358:8;19352:4;19349:1;19330:42;:::i;:::-;19405:6;19400:3;19396:16;19387:7;19384:29;19381:2;;;19416:18;;:::i;:::-;19454:20;;18622:858;-1:-1:-1;;;;18622:858:1:o;19485:168::-;;19591:1;19587;19583:6;19579:14;19576:1;19573:21;19568:1;19561:9;19554:17;19550:45;19547:2;;;19598:18;;:::i;:::-;-1:-1:-1;19638:9:1;;19537:116::o;19658:125::-;;19726:1;19723;19720:8;19717:2;;;19731:18;;:::i;:::-;-1:-1:-1;19768:9:1;;19707:76::o;19788:258::-;19860:1;19870:113;19884:6;19881:1;19878:13;19870:113;;;19960:11;;;19954:18;19941:11;;;19934:39;19906:2;19899:10;19870:113;;;20001:6;19998:1;19995:13;19992:2;;;-1:-1:-1;;20036:1:1;20018:16;;20011:27;19841:205::o;20051:135::-;;-1:-1:-1;;20111:17:1;;20108:2;;;20131:18;;:::i;:::-;-1:-1:-1;20178:1:1;20167:13;;20098:88::o;20191:127::-;20252:10;20247:3;20243:20;20240:1;20233:31;20283:4;20280:1;20273:15;20307:4;20304:1;20297:15;20323:133;-1:-1:-1;;;;;20400:31:1;;20390:42;;20380:2;;20446:1;20443;20436:12;20380:2;20370:86;:::o

Swarm Source

ipfs://5ba5f19140c183716d26bce7fe182fe7b59569699ff6ad99c1d6ea6c9c6fd126
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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