ETH Price: $3,370.15 (-0.29%)

Token

Shiryo (SHIRYO)
 

Overview

Max Total Supply

150,000,000 SHIRYO

Holders

1,014

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,334.551141675361892038 SHIRYO

Value
$0.00
0x14749f4430bd42eb952f9411565183622c1d1304
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:
Contract

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-12-17
*/

/**
// https://shiryo.com
// https://x.com/Shiryo_Official
// https://t.me/Shiryo_Official
*/
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.17;

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

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

interface IUniswapV2Pair {
    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;
}

interface IUniswapV2Factory {
    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 IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(
        address owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

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

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

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

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

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

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

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

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

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

contract Contract is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;

    address public feeWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch

    // Seller Map
    mapping(address => uint256) private _holderFirstBuyTimestamp;

    // Blacklist Map
    mapping(address => bool) private _blacklist;
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public sellTotalFees;

    // block number of opened trading
    uint256 launchedAt;

    /******************/

    // exclude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event feeWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );  

    event AutoNukeLP();

    event ManualNukeLP();

	address public constant router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
	uint256 slippage = 50;

    constructor() ERC20(unicode"Shiryo", unicode"SHIRYO") {
		IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
		
        // #################################################################
        feeWallet = address(0xE7bd7Ad246abD89964732A0783bbe1f629f557Ad); // set as marketing wallet
        // #################################################################

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 150_000_000 * (10**18);

        maxTransactionAmount = (totalSupply * 20) / 1000; // 2% maxtransaction
        maxWallet = (totalSupply * 20) / 1000; // 2% maxwallet
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swapwallet

        buyTotalFees = 25;
        sellTotalFees = 25;


        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        launchedAt = block.number;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(
        uint256 newAmount
    ) external onlyOwner returns (bool) {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.5%"
        );
        maxTransactionAmount = newNum * (10 ** 18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 15) / 1000) / 1e18,
            "Cannot set maxWallet lower than 1.5%"
        );
        maxWallet = newNum * (10 ** 18);
    }

    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _fee
    ) external onlyOwner {
        buyTotalFees = _fee;
        require(buyTotalFees <= 40, "Must keep fees at 40% or less");
    }

    function updateSellFees(
        uint256 _fee
    ) external onlyOwner {
        sellTotalFees = _fee;
        require(sellTotalFees <= 40, "Must keep fees at 40% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function blacklistAccount(
        address account,
        bool isBlacklisted
    ) public onlyOwner {
        _blacklist[account] = isBlacklisted;
    }

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateFeeWallet(
        address newFeeWallet
    ) external onlyOwner {
        emit feeWalletUpdated(newFeeWallet, feeWallet);
        feeWallet = newFeeWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(
            !_blacklist[to] && !_blacklist[from],
            "You have been blacklisted from transfering tokens"
        );
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        // anti bot logic
        if (
            block.number <= (launchedAt + 0) &&
            to != uniswapV2Pair &&
            to != address(router)
        ) {
            _blacklist[to] = true;
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        // only take fees on buys/sells, do not take on wallet transfers
		uint256 fee;
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fee = amount.mul(sellTotalFees).div(100);
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fee = amount.mul(buyTotalFees).div(100);
            }

            if (fee > 0) {
                super._transfer(from, address(this), fee);
				amount -= fee;
            }
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

		// Get the expected amount of ETH out
    	uint256[] memory amountsOut = uniswapV2Router.getAmountsOut(tokenAmount, path);
		uint256 _slippage = amountsOut[1] * slippage / 100;
    	uint256 amountOutMin = amountsOut[1] - _slippage;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            amountOutMin, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        bool success;

		// Prevent swapping too many tokens in one TX
        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

		if(contractBalance > 0){
			swapTokensForEth(contractBalance);
		}

		if(address(this).balance > 0) {
			(success, ) = address(feeWallet).call{
            	value: address(this).balance
        	}("");
			require(success, "Transfer to fee wallet failed.");
		}
    }

	function setSlippage (uint256 _s) external onlyOwner {
		require(_s <= 50, "Slippage must be less than 50%");
		slippage = _s;
	}
}

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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"account","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTotalFees","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_s","type":"uint256"}],"name":"setSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600a805462ffffff19166001908117909155600e805460ff191690911790556032601555348015610033575f80fd5b506040518060400160405280600681526020016553686972796f60d01b8152506040518060400160405280600681526020016553484952594f60d01b815250816003908161008191906106d4565b50600461008e82826106d4565b5050505f6100a061038360201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600680546001600160a01b03191673e7bd7ad246abd89964732a0783bbe1f629f557ad179055737a250d5630b4cf539739df2c5dacb4c659f2488d610133816001610387565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801561017b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019f919061078e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020e919061078e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015610258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027c919061078e565b6001600160a01b031660a0819052610295906001610387565b60a0516102a39060016103fd565b6a7c13bc4b2c133c560000006103e86102bd8260146107c8565b6102c791906107df565b6007556103e86102d88260146107c8565b6102e291906107df565b6009556127106102f38260056107c8565b6102fd91906107df565b6008556019600f81905560105561032661031f6005546001600160a01b031690565b6001610450565b610331306001610450565b61033e61dead6001610450565b61035a6103536005546001600160a01b031690565b6001610387565b610365306001610387565b61037261dead6001610387565b61037c33826104f5565b5050610811565b3390565b6005546001600160a01b031633146103d35760405162461bcd60e51b815260206004820181905260248201525f805160206130f283398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b6001600160a01b0382165f81815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146104975760405162461bcd60e51b815260206004820181905260248201525f805160206130f283398151915260448201526064016103ca565b6001600160a01b0382165f81815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b03821661054b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103ca565b60025461055890826105d6565b6002556001600160a01b0382165f9081526020819052604090205461057d90826105d6565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b5f806105e283856107fe565b9050838110156106345760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103ca565b90505b92915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061066557607f821691505b60208210810361068357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105d157805f5260205f20601f840160051c810160208510156106ae5750805b601f840160051c820191505b818110156106cd575f81556001016106ba565b5050505050565b81516001600160401b038111156106ed576106ed61063d565b610701816106fb8454610651565b84610689565b6020601f821160018114610733575f831561071c5750848201515b5f19600385901b1c1916600184901b1784556106cd565b5f84815260208120601f198516915b828110156107625787850151825560209485019460019092019101610742565b508482101561077f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f6020828403121561079e575f80fd5b81516001600160a01b0381168114610634575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610637576106376107b4565b5f826107f957634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610637576106376107b4565b60805160a05161288861086a5f395f818161041201528181610d8d0152818161170d0152611a6601525f8181610310015281816116cf015281816120eb015281816121a30152818161228301526122bf01526128885ff3fe60806040526004361061026d575f3560e01c80638da5cb5b1161014a578063c8c8ebe4116100be578063eba4c33311610078578063eba4c3331461078b578063f0fa55a9146107aa578063f25f4b56146107c9578063f2fde38b146107e8578063f887ea4014610807578063f8b45b051461082e575f80fd5b8063c8c8ebe4146106d5578063d257b34f146106ea578063d85ba06314610709578063dd62ed3e1461071e578063e2f4560514610762578063e884f26014610777575f80fd5b8063a9059cbb1161010f578063a9059cbb14610613578063b62496f514610632578063bbc0c74214610660578063c02466681461067e578063c18bc1951461069d578063c876d0b9146106bc575f80fd5b80638da5cb5b14610585578063924de9b7146105a257806395d89b41146105c15780639a7a23d6146105d5578063a457c2d7146105f4575f80fd5b80634a62bb65116101e157806370a08231116101a657806370a08231146104d7578063715018a61461050b57806371fc46881461051f578063751039fc1461053e5780637571336a146105525780638a8c523c14610571575f80fd5b80634a62bb65146104345780634fbee1931461044d57806366718524146104845780636a486a8e146104a35780636ddd1713146104b8575f80fd5b8063203e727e11610232578063203e727e1461036857806323b872dd146103895780632d5a5d34146103a8578063313ce567146103c757806339509351146103e257806349bd5a5e14610401575f80fd5b806306fdde0314610278578063095ea7b3146102a257806310d5de53146102d15780631694505e146102ff57806318160ddd1461034a575f80fd5b3661027457005b5f80fd5b348015610283575f80fd5b5061028c610843565b604051610299919061235c565b60405180910390f35b3480156102ad575f80fd5b506102c16102bc3660046123a5565b6108d3565b6040519015158152602001610299565b3480156102dc575f80fd5b506102c16102eb3660046123cf565b60136020525f908152604090205460ff1681565b34801561030a575f80fd5b506103327f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610299565b348015610355575f80fd5b506002545b604051908152602001610299565b348015610373575f80fd5b506103876103823660046123ea565b6108e9565b005b348015610394575f80fd5b506102c16103a3366004612401565b6109cf565b3480156103b3575f80fd5b506103876103c236600461244e565b610a36565b3480156103d2575f80fd5b5060405160128152602001610299565b3480156103ed575f80fd5b506102c16103fc3660046123a5565b610a8a565b34801561040c575f80fd5b506103327f000000000000000000000000000000000000000000000000000000000000000081565b34801561043f575f80fd5b50600a546102c19060ff1681565b348015610458575f80fd5b506102c16104673660046123cf565b6001600160a01b03165f9081526012602052604090205460ff1690565b34801561048f575f80fd5b5061038761049e3660046123cf565b610abf565b3480156104ae575f80fd5b5061035a60105481565b3480156104c3575f80fd5b50600a546102c19062010000900460ff1681565b3480156104e2575f80fd5b5061035a6104f13660046123cf565b6001600160a01b03165f9081526020819052604090205490565b348015610516575f80fd5b50610387610b45565b34801561052a575f80fd5b506103876105393660046123ea565b610bb8565b348015610549575f80fd5b506102c1610c3b565b34801561055d575f80fd5b5061038761056c36600461244e565b610c77565b34801561057c575f80fd5b50610387610ccb565b348015610590575f80fd5b506005546001600160a01b0316610332565b3480156105ad575f80fd5b506103876105bc366004612481565b610d0c565b3480156105cc575f80fd5b5061028c610d52565b3480156105e0575f80fd5b506103876105ef36600461244e565b610d61565b3480156105ff575f80fd5b506102c161060e3660046123a5565b610e40565b34801561061e575f80fd5b506102c161062d3660046123a5565b610e8d565b34801561063d575f80fd5b506102c161064c3660046123cf565b60146020525f908152604090205460ff1681565b34801561066b575f80fd5b50600a546102c190610100900460ff1681565b348015610689575f80fd5b5061038761069836600461244e565b610e99565b3480156106a8575f80fd5b506103876106b73660046123ea565b610f21565b3480156106c7575f80fd5b50600e546102c19060ff1681565b3480156106e0575f80fd5b5061035a60075481565b3480156106f5575f80fd5b506102c16107043660046123ea565b610ff2565b348015610714575f80fd5b5061035a600f5481565b348015610729575f80fd5b5061035a61073836600461249a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561076d575f80fd5b5061035a60085481565b348015610782575f80fd5b506102c1611148565b348015610796575f80fd5b506103876107a53660046123ea565b611184565b3480156107b5575f80fd5b506103876107c43660046123ea565b611204565b3480156107d4575f80fd5b50600654610332906001600160a01b031681565b3480156107f3575f80fd5b506103876108023660046123cf565b611284565b348015610812575f80fd5b50610332737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610839575f80fd5b5061035a60095481565b606060038054610852906124d1565b80601f016020809104026020016040519081016040528092919081815260200182805461087e906124d1565b80156108c95780601f106108a0576101008083540402835291602001916108c9565b820191905f5260205f20905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b5f6108df33848461136e565b5060015b92915050565b6005546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390612509565b60405180910390fd5b670de0b6b3a76400006103e861093160025490565b61093c906005612552565b6109469190612569565b6109509190612569565b8110156109b75760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610913565b6109c981670de0b6b3a7640000612552565b60075550565b5f6109db848484611492565b610a2c8433610a2785604051806060016040528060288152602001612806602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190611cf2565b61136e565b5060019392505050565b6005546001600160a01b03163314610a605760405162461bcd60e51b815260040161091390612509565b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916108df918590610a279086611d2a565b6005546001600160a01b03163314610ae95760405162461bcd60e51b815260040161091390612509565b6006546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce8664928905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b6f5760405162461bcd60e51b815260040161091390612509565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610be25760405162461bcd60e51b815260040161091390612509565b600f8190556028811115610c385760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c6573730000006044820152606401610913565b50565b6005545f906001600160a01b03163314610c675760405162461bcd60e51b815260040161091390612509565b50600a805460ff19169055600190565b6005546001600160a01b03163314610ca15760405162461bcd60e51b815260040161091390612509565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610cf55760405162461bcd60e51b815260040161091390612509565b600a805462ffff0019166201010017905543601155565b6005546001600160a01b03163314610d365760405162461bcd60e51b815260040161091390612509565b600a8054911515620100000262ff000019909216919091179055565b606060048054610852906124d1565b6005546001600160a01b03163314610d8b5760405162461bcd60e51b815260040161091390612509565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610e325760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610913565b610e3c8282611d8f565b5050565b5f6108df3384610a278560405180606001604052806025815260200161282e60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611cf2565b5f6108df338484611492565b6005546001600160a01b03163314610ec35760405162461bcd60e51b815260040161091390612509565b6001600160a01b0382165f81815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610f4b5760405162461bcd60e51b815260040161091390612509565b670de0b6b3a76400006103e8610f6060025490565b610f6b90600f612552565b610f759190612569565b610f7f9190612569565b811015610fda5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e352560e01b6064820152608401610913565b610fec81670de0b6b3a7640000612552565b60095550565b6005545f906001600160a01b0316331461101e5760405162461bcd60e51b815260040161091390612509565b620186a061102b60025490565b611036906001612552565b6110409190612569565b8210156110ad5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610913565b6103e86110b960025490565b6110c4906005612552565b6110ce9190612569565b82111561113a5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610913565b50600881905560015b919050565b6005545f906001600160a01b031633146111745760405162461bcd60e51b815260040161091390612509565b50600e805460ff19169055600190565b6005546001600160a01b031633146111ae5760405162461bcd60e51b815260040161091390612509565b60108190556028811115610c385760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c6573730000006044820152606401610913565b6005546001600160a01b0316331461122e5760405162461bcd60e51b815260040161091390612509565b603281111561127f5760405162461bcd60e51b815260206004820152601e60248201527f536c697070616765206d757374206265206c657373207468616e2035302500006044820152606401610913565b601555565b6005546001600160a01b031633146112ae5760405162461bcd60e51b815260040161091390612509565b6001600160a01b0381166113135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113d05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610913565b6001600160a01b0382166114315760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610913565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166114b85760405162461bcd60e51b815260040161091390612588565b6001600160a01b0382166114de5760405162461bcd60e51b8152600401610913906125cd565b6001600160a01b0382165f908152600d602052604090205460ff1615801561151e57506001600160a01b0383165f908152600d602052604090205460ff16155b6115845760405162461bcd60e51b815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527072616e73666572696e6720746f6b656e7360781b6064820152608401610913565b805f0361159b5761159683835f611de2565b505050565b600a5460ff1615611a4d576005546001600160a01b038481169116148015906115d257506005546001600160a01b03838116911614155b80156115e657506001600160a01b03821615155b80156115fd57506001600160a01b03821661dead14155b80156116135750600554600160a01b900460ff16155b15611a4d57600a54610100900460ff166116a9576001600160a01b0383165f9081526012602052604090205460ff168061166457506001600160a01b0382165f9081526012602052604090205460ff165b6116a95760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610913565b600e5460ff16156117ee576005546001600160a01b0383811691161480159061170457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561174257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156117ee57325f908152600b602052604090205443116117dc5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610913565b325f908152600b602052604090204390555b6001600160a01b0383165f9081526014602052604090205460ff16801561182d57506001600160a01b0382165f9081526013602052604090205460ff16155b15611910576007548111156118a25760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610913565b6009546001600160a01b0383165f908152602081905260409020546118c79083612610565b111561190b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610913565b611a4d565b6001600160a01b0382165f9081526014602052604090205460ff16801561194f57506001600160a01b0383165f9081526013602052604090205460ff16155b156119c55760075481111561190b5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610913565b6001600160a01b0382165f9081526013602052604090205460ff16611a4d576009546001600160a01b0383165f90815260208190526040902054611a099083612610565b1115611a4d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610913565b601154611a5a905f612610565b4311158015611a9b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611ac457506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611aec576001600160a01b0382165f908152600d60205260409020805460ff191660011790555b305f9081526020819052604090205460085481108015908190611b175750600a5462010000900460ff165b8015611b2d5750600554600160a01b900460ff16155b8015611b5157506001600160a01b0385165f9081526014602052604090205460ff16155b8015611b7557506001600160a01b0385165f9081526012602052604090205460ff16155b8015611b9957506001600160a01b0384165f9081526012602052604090205460ff16155b15611bc7576005805460ff60a01b1916600160a01b179055611bb9611ee8565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526012602052604090205460ff600160a01b909204821615911680611c1357506001600160a01b0385165f9081526012602052604090205460ff165b15611c1b57505f5b5f8115611cde576001600160a01b0386165f9081526014602052604090205460ff168015611c4a57505f601054115b15611c7657611c6f6064611c6960105488611fd790919063ffffffff16565b90612055565b9050611cc0565b6001600160a01b0387165f9081526014602052604090205460ff168015611c9e57505f600f54115b15611cc057611cbd6064611c69600f5488611fd790919063ffffffff16565b90505b8015611cde57611cd1873083611de2565b611cdb8186612623565b94505b611ce9878787611de2565b50505050505050565b5f8184841115611d155760405162461bcd60e51b8152600401610913919061235c565b505f611d218486612623565b95945050505050565b5f80611d368385612610565b905083811015611d885760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610913565b9392505050565b6001600160a01b0382165f81815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611e085760405162461bcd60e51b815260040161091390612588565b6001600160a01b038216611e2e5760405162461bcd60e51b8152600401610913906125cd565b611e6a816040518060600160405280602681526020016127e0602691396001600160a01b0386165f908152602081905260409020549190611cf2565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611e989082611d2a565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611485565b305f90815260208190526040812054600854909190611f08906014612552565b821115611f2057600854611f1d906014612552565b91505b8115611f2f57611f2f82612096565b4715610e3c576006546040516001600160a01b039091169047905f81818185875af1925050503d805f8114611f7f576040519150601f19603f3d011682016040523d82523d5f602084013e611f84565b606091505b50508091505080610e3c5760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f206665652077616c6c6574206661696c65642e00006044820152606401610913565b5f825f03611fe657505f6108e3565b5f611ff18385612552565b905082611ffe8583612569565b14611d885760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610913565b5f611d8883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612330565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120c9576120c961264a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612145573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612169919061265e565b8160018151811061217c5761217c61264a565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f906121da90869086906004016126bc565b5f60405180830381865afa1580156121f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261221b91908101906126dc565b90505f6064601554836001815181106122365761223661264a565b60200260200101516122489190612552565b6122529190612569565b90505f81836001815181106122695761226961264a565b602002602001015161227b9190612623565b90506122a8307f00000000000000000000000000000000000000000000000000000000000000008761136e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906122fc90889085908990309042906004016127a4565b5f604051808303815f87803b158015612313575f80fd5b505af1158015612325573d5f803e3d5ffd5b505050505050505050565b5f81836123505760405162461bcd60e51b8152600401610913919061235c565b505f611d218486612569565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610c38575f80fd5b5f80604083850312156123b6575f80fd5b82356123c181612391565b946020939093013593505050565b5f602082840312156123df575f80fd5b8135611d8881612391565b5f602082840312156123fa575f80fd5b5035919050565b5f805f60608486031215612413575f80fd5b833561241e81612391565b9250602084013561242e81612391565b929592945050506040919091013590565b80358015158114611143575f80fd5b5f806040838503121561245f575f80fd5b823561246a81612391565b91506124786020840161243f565b90509250929050565b5f60208284031215612491575f80fd5b611d888261243f565b5f80604083850312156124ab575f80fd5b82356124b681612391565b915060208301356124c681612391565b809150509250929050565b600181811c908216806124e557607f821691505b60208210810361250357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108e3576108e361253e565b5f8261258357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808201808211156108e3576108e361253e565b818103818111156108e3576108e361253e565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561266e575f80fd5b8151611d8881612391565b5f8151808452602084019350602083015f5b828110156126b25781516001600160a01b031686526020958601959091019060010161268b565b5093949350505050565b828152604060208201525f6126d46040830184612679565b949350505050565b5f602082840312156126ec575f80fd5b815167ffffffffffffffff811115612702575f80fd5b8201601f81018413612712575f80fd5b805167ffffffffffffffff81111561272c5761272c612636565b8060051b604051601f19603f830116810181811067ffffffffffffffff8211171561275957612759612636565b604052918252602081840181019290810187841115612776575f80fd5b6020850194505b838510156127995784518082526020958601959093500161277d565b509695505050505050565b85815284602082015260a060408201525f6127c260a0830186612679565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d3a50e912269664f8924f28b50fd6bb677d659204a30ce2ae8248e62d6802bf164736f6c634300081a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061026d575f3560e01c80638da5cb5b1161014a578063c8c8ebe4116100be578063eba4c33311610078578063eba4c3331461078b578063f0fa55a9146107aa578063f25f4b56146107c9578063f2fde38b146107e8578063f887ea4014610807578063f8b45b051461082e575f80fd5b8063c8c8ebe4146106d5578063d257b34f146106ea578063d85ba06314610709578063dd62ed3e1461071e578063e2f4560514610762578063e884f26014610777575f80fd5b8063a9059cbb1161010f578063a9059cbb14610613578063b62496f514610632578063bbc0c74214610660578063c02466681461067e578063c18bc1951461069d578063c876d0b9146106bc575f80fd5b80638da5cb5b14610585578063924de9b7146105a257806395d89b41146105c15780639a7a23d6146105d5578063a457c2d7146105f4575f80fd5b80634a62bb65116101e157806370a08231116101a657806370a08231146104d7578063715018a61461050b57806371fc46881461051f578063751039fc1461053e5780637571336a146105525780638a8c523c14610571575f80fd5b80634a62bb65146104345780634fbee1931461044d57806366718524146104845780636a486a8e146104a35780636ddd1713146104b8575f80fd5b8063203e727e11610232578063203e727e1461036857806323b872dd146103895780632d5a5d34146103a8578063313ce567146103c757806339509351146103e257806349bd5a5e14610401575f80fd5b806306fdde0314610278578063095ea7b3146102a257806310d5de53146102d15780631694505e146102ff57806318160ddd1461034a575f80fd5b3661027457005b5f80fd5b348015610283575f80fd5b5061028c610843565b604051610299919061235c565b60405180910390f35b3480156102ad575f80fd5b506102c16102bc3660046123a5565b6108d3565b6040519015158152602001610299565b3480156102dc575f80fd5b506102c16102eb3660046123cf565b60136020525f908152604090205460ff1681565b34801561030a575f80fd5b506103327f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610299565b348015610355575f80fd5b506002545b604051908152602001610299565b348015610373575f80fd5b506103876103823660046123ea565b6108e9565b005b348015610394575f80fd5b506102c16103a3366004612401565b6109cf565b3480156103b3575f80fd5b506103876103c236600461244e565b610a36565b3480156103d2575f80fd5b5060405160128152602001610299565b3480156103ed575f80fd5b506102c16103fc3660046123a5565b610a8a565b34801561040c575f80fd5b506103327f0000000000000000000000007b5cf553b5150261dbda2fb6a918da41a1eb380981565b34801561043f575f80fd5b50600a546102c19060ff1681565b348015610458575f80fd5b506102c16104673660046123cf565b6001600160a01b03165f9081526012602052604090205460ff1690565b34801561048f575f80fd5b5061038761049e3660046123cf565b610abf565b3480156104ae575f80fd5b5061035a60105481565b3480156104c3575f80fd5b50600a546102c19062010000900460ff1681565b3480156104e2575f80fd5b5061035a6104f13660046123cf565b6001600160a01b03165f9081526020819052604090205490565b348015610516575f80fd5b50610387610b45565b34801561052a575f80fd5b506103876105393660046123ea565b610bb8565b348015610549575f80fd5b506102c1610c3b565b34801561055d575f80fd5b5061038761056c36600461244e565b610c77565b34801561057c575f80fd5b50610387610ccb565b348015610590575f80fd5b506005546001600160a01b0316610332565b3480156105ad575f80fd5b506103876105bc366004612481565b610d0c565b3480156105cc575f80fd5b5061028c610d52565b3480156105e0575f80fd5b506103876105ef36600461244e565b610d61565b3480156105ff575f80fd5b506102c161060e3660046123a5565b610e40565b34801561061e575f80fd5b506102c161062d3660046123a5565b610e8d565b34801561063d575f80fd5b506102c161064c3660046123cf565b60146020525f908152604090205460ff1681565b34801561066b575f80fd5b50600a546102c190610100900460ff1681565b348015610689575f80fd5b5061038761069836600461244e565b610e99565b3480156106a8575f80fd5b506103876106b73660046123ea565b610f21565b3480156106c7575f80fd5b50600e546102c19060ff1681565b3480156106e0575f80fd5b5061035a60075481565b3480156106f5575f80fd5b506102c16107043660046123ea565b610ff2565b348015610714575f80fd5b5061035a600f5481565b348015610729575f80fd5b5061035a61073836600461249a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561076d575f80fd5b5061035a60085481565b348015610782575f80fd5b506102c1611148565b348015610796575f80fd5b506103876107a53660046123ea565b611184565b3480156107b5575f80fd5b506103876107c43660046123ea565b611204565b3480156107d4575f80fd5b50600654610332906001600160a01b031681565b3480156107f3575f80fd5b506103876108023660046123cf565b611284565b348015610812575f80fd5b50610332737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610839575f80fd5b5061035a60095481565b606060038054610852906124d1565b80601f016020809104026020016040519081016040528092919081815260200182805461087e906124d1565b80156108c95780601f106108a0576101008083540402835291602001916108c9565b820191905f5260205f20905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b5f6108df33848461136e565b5060015b92915050565b6005546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390612509565b60405180910390fd5b670de0b6b3a76400006103e861093160025490565b61093c906005612552565b6109469190612569565b6109509190612569565b8110156109b75760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610913565b6109c981670de0b6b3a7640000612552565b60075550565b5f6109db848484611492565b610a2c8433610a2785604051806060016040528060288152602001612806602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190611cf2565b61136e565b5060019392505050565b6005546001600160a01b03163314610a605760405162461bcd60e51b815260040161091390612509565b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916108df918590610a279086611d2a565b6005546001600160a01b03163314610ae95760405162461bcd60e51b815260040161091390612509565b6006546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce8664928905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b6f5760405162461bcd60e51b815260040161091390612509565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610be25760405162461bcd60e51b815260040161091390612509565b600f8190556028811115610c385760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c6573730000006044820152606401610913565b50565b6005545f906001600160a01b03163314610c675760405162461bcd60e51b815260040161091390612509565b50600a805460ff19169055600190565b6005546001600160a01b03163314610ca15760405162461bcd60e51b815260040161091390612509565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610cf55760405162461bcd60e51b815260040161091390612509565b600a805462ffff0019166201010017905543601155565b6005546001600160a01b03163314610d365760405162461bcd60e51b815260040161091390612509565b600a8054911515620100000262ff000019909216919091179055565b606060048054610852906124d1565b6005546001600160a01b03163314610d8b5760405162461bcd60e51b815260040161091390612509565b7f0000000000000000000000007b5cf553b5150261dbda2fb6a918da41a1eb38096001600160a01b0316826001600160a01b031603610e325760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610913565b610e3c8282611d8f565b5050565b5f6108df3384610a278560405180606001604052806025815260200161282e60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611cf2565b5f6108df338484611492565b6005546001600160a01b03163314610ec35760405162461bcd60e51b815260040161091390612509565b6001600160a01b0382165f81815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610f4b5760405162461bcd60e51b815260040161091390612509565b670de0b6b3a76400006103e8610f6060025490565b610f6b90600f612552565b610f759190612569565b610f7f9190612569565b811015610fda5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e352560e01b6064820152608401610913565b610fec81670de0b6b3a7640000612552565b60095550565b6005545f906001600160a01b0316331461101e5760405162461bcd60e51b815260040161091390612509565b620186a061102b60025490565b611036906001612552565b6110409190612569565b8210156110ad5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610913565b6103e86110b960025490565b6110c4906005612552565b6110ce9190612569565b82111561113a5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610913565b50600881905560015b919050565b6005545f906001600160a01b031633146111745760405162461bcd60e51b815260040161091390612509565b50600e805460ff19169055600190565b6005546001600160a01b031633146111ae5760405162461bcd60e51b815260040161091390612509565b60108190556028811115610c385760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c6573730000006044820152606401610913565b6005546001600160a01b0316331461122e5760405162461bcd60e51b815260040161091390612509565b603281111561127f5760405162461bcd60e51b815260206004820152601e60248201527f536c697070616765206d757374206265206c657373207468616e2035302500006044820152606401610913565b601555565b6005546001600160a01b031633146112ae5760405162461bcd60e51b815260040161091390612509565b6001600160a01b0381166113135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113d05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610913565b6001600160a01b0382166114315760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610913565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166114b85760405162461bcd60e51b815260040161091390612588565b6001600160a01b0382166114de5760405162461bcd60e51b8152600401610913906125cd565b6001600160a01b0382165f908152600d602052604090205460ff1615801561151e57506001600160a01b0383165f908152600d602052604090205460ff16155b6115845760405162461bcd60e51b815260206004820152603160248201527f596f752068617665206265656e20626c61636b6c69737465642066726f6d207460448201527072616e73666572696e6720746f6b656e7360781b6064820152608401610913565b805f0361159b5761159683835f611de2565b505050565b600a5460ff1615611a4d576005546001600160a01b038481169116148015906115d257506005546001600160a01b03838116911614155b80156115e657506001600160a01b03821615155b80156115fd57506001600160a01b03821661dead14155b80156116135750600554600160a01b900460ff16155b15611a4d57600a54610100900460ff166116a9576001600160a01b0383165f9081526012602052604090205460ff168061166457506001600160a01b0382165f9081526012602052604090205460ff165b6116a95760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610913565b600e5460ff16156117ee576005546001600160a01b0383811691161480159061170457507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b801561174257507f0000000000000000000000007b5cf553b5150261dbda2fb6a918da41a1eb38096001600160a01b0316826001600160a01b031614155b156117ee57325f908152600b602052604090205443116117dc5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610913565b325f908152600b602052604090204390555b6001600160a01b0383165f9081526014602052604090205460ff16801561182d57506001600160a01b0382165f9081526013602052604090205460ff16155b15611910576007548111156118a25760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610913565b6009546001600160a01b0383165f908152602081905260409020546118c79083612610565b111561190b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610913565b611a4d565b6001600160a01b0382165f9081526014602052604090205460ff16801561194f57506001600160a01b0383165f9081526013602052604090205460ff16155b156119c55760075481111561190b5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610913565b6001600160a01b0382165f9081526013602052604090205460ff16611a4d576009546001600160a01b0383165f90815260208190526040902054611a099083612610565b1115611a4d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610913565b601154611a5a905f612610565b4311158015611a9b57507f0000000000000000000000007b5cf553b5150261dbda2fb6a918da41a1eb38096001600160a01b0316826001600160a01b031614155b8015611ac457506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611aec576001600160a01b0382165f908152600d60205260409020805460ff191660011790555b305f9081526020819052604090205460085481108015908190611b175750600a5462010000900460ff165b8015611b2d5750600554600160a01b900460ff16155b8015611b5157506001600160a01b0385165f9081526014602052604090205460ff16155b8015611b7557506001600160a01b0385165f9081526012602052604090205460ff16155b8015611b9957506001600160a01b0384165f9081526012602052604090205460ff16155b15611bc7576005805460ff60a01b1916600160a01b179055611bb9611ee8565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526012602052604090205460ff600160a01b909204821615911680611c1357506001600160a01b0385165f9081526012602052604090205460ff165b15611c1b57505f5b5f8115611cde576001600160a01b0386165f9081526014602052604090205460ff168015611c4a57505f601054115b15611c7657611c6f6064611c6960105488611fd790919063ffffffff16565b90612055565b9050611cc0565b6001600160a01b0387165f9081526014602052604090205460ff168015611c9e57505f600f54115b15611cc057611cbd6064611c69600f5488611fd790919063ffffffff16565b90505b8015611cde57611cd1873083611de2565b611cdb8186612623565b94505b611ce9878787611de2565b50505050505050565b5f8184841115611d155760405162461bcd60e51b8152600401610913919061235c565b505f611d218486612623565b95945050505050565b5f80611d368385612610565b905083811015611d885760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610913565b9392505050565b6001600160a01b0382165f81815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611e085760405162461bcd60e51b815260040161091390612588565b6001600160a01b038216611e2e5760405162461bcd60e51b8152600401610913906125cd565b611e6a816040518060600160405280602681526020016127e0602691396001600160a01b0386165f908152602081905260409020549190611cf2565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611e989082611d2a565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611485565b305f90815260208190526040812054600854909190611f08906014612552565b821115611f2057600854611f1d906014612552565b91505b8115611f2f57611f2f82612096565b4715610e3c576006546040516001600160a01b039091169047905f81818185875af1925050503d805f8114611f7f576040519150601f19603f3d011682016040523d82523d5f602084013e611f84565b606091505b50508091505080610e3c5760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f206665652077616c6c6574206661696c65642e00006044820152606401610913565b5f825f03611fe657505f6108e3565b5f611ff18385612552565b905082611ffe8583612569565b14611d885760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610913565b5f611d8883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612330565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120c9576120c961264a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612145573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612169919061265e565b8160018151811061217c5761217c61264a565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f906121da90869086906004016126bc565b5f60405180830381865afa1580156121f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261221b91908101906126dc565b90505f6064601554836001815181106122365761223661264a565b60200260200101516122489190612552565b6122529190612569565b90505f81836001815181106122695761226961264a565b602002602001015161227b9190612623565b90506122a8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8761136e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906122fc90889085908990309042906004016127a4565b5f604051808303815f87803b158015612313575f80fd5b505af1158015612325573d5f803e3d5ffd5b505050505050505050565b5f81836123505760405162461bcd60e51b8152600401610913919061235c565b505f611d218486612569565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610c38575f80fd5b5f80604083850312156123b6575f80fd5b82356123c181612391565b946020939093013593505050565b5f602082840312156123df575f80fd5b8135611d8881612391565b5f602082840312156123fa575f80fd5b5035919050565b5f805f60608486031215612413575f80fd5b833561241e81612391565b9250602084013561242e81612391565b929592945050506040919091013590565b80358015158114611143575f80fd5b5f806040838503121561245f575f80fd5b823561246a81612391565b91506124786020840161243f565b90509250929050565b5f60208284031215612491575f80fd5b611d888261243f565b5f80604083850312156124ab575f80fd5b82356124b681612391565b915060208301356124c681612391565b809150509250929050565b600181811c908216806124e557607f821691505b60208210810361250357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108e3576108e361253e565b5f8261258357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808201808211156108e3576108e361253e565b818103818111156108e3576108e361253e565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561266e575f80fd5b8151611d8881612391565b5f8151808452602084019350602083015f5b828110156126b25781516001600160a01b031686526020958601959091019060010161268b565b5093949350505050565b828152604060208201525f6126d46040830184612679565b949350505050565b5f602082840312156126ec575f80fd5b815167ffffffffffffffff811115612702575f80fd5b8201601f81018413612712575f80fd5b805167ffffffffffffffff81111561272c5761272c612636565b8060051b604051601f19603f830116810181811067ffffffffffffffff8211171561275957612759612636565b604052918252602081840181019290810187841115612776575f80fd5b6020850194505b838510156127995784518082526020958601959093500161277d565b509695505050505050565b85815284602082015260a060408201525f6127c260a0830186612679565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d3a50e912269664f8924f28b50fd6bb677d659204a30ce2ae8248e62d6802bf164736f6c634300081a0033

Deployed Bytecode Sourcemap

30903:13602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8031:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10264:194;;;;;;;;;;-1:-1:-1;10264:194:0;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;10264:194:0;945:187:1;32049:63:0;;;;;;;;;;-1:-1:-1;32049:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30981:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1580:32:1;;;1562:51;;1550:2;1535:18;30981:51:0;1389:230:1;9151:108:0;;;;;;;;;;-1:-1:-1;9239:12:0;;9151:108;;;1770:25:1;;;1758:2;1743:18;9151:108:0;1624:177:1;35881:277:0;;;;;;;;;;-1:-1:-1;35881:277:0;;;;;:::i;:::-;;:::i;:::-;;10940:454;;;;;;;;;;-1:-1:-1;10940:454:0;;;;;:::i;:::-;;:::i;37377:159::-;;;;;;;;;;-1:-1:-1;37377:159:0;;;;;:::i;:::-;;:::i;8993:93::-;;;;;;;;;;-1:-1:-1;8993:93:0;;9076:2;3177:36:1;;3165:2;3150:18;8993:93:0;3035:184:1;11803:293:0;;;;;;;;;;-1:-1:-1;11803:293:0;;;;;:::i;:::-;;:::i;31039:38::-;;;;;;;;;;;;;;;31264:33;;;;;;;;;;-1:-1:-1;31264:33:0;;;;;;;;38244:126;;;;;;;;;;-1:-1:-1;38244:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;38334:28:0;38310:4;38334:28;;;:19;:28;;;;;;;;;38244:126;38054:182;;;;;;;;;;-1:-1:-1;38054:182:0;;;;;:::i;:::-;;:::i;31806:28::-;;;;;;;;;;;;;;;;31344:31;;;;;;;;;;-1:-1:-1;31344:31:0;;;;;;;;;;;9322:143;;;;;;;;;;-1:-1:-1;9322:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;9439:18:0;9412:7;9439:18;;;;;;;;;;;;9322:143;23081:148;;;;;;;;;;;;;:::i;36806:181::-;;;;;;;;;;-1:-1:-1;36806:181:0;;;;;:::i;:::-;;:::i;35005:121::-;;;;;;;;;;;;;:::i;36433:169::-;;;;;;;;;;-1:-1:-1;36433:169:0;;;;;:::i;:::-;;:::i;34805:148::-;;;;;;;;;;;;;:::i;22439:79::-;;;;;;;;;;-1:-1:-1;22504:6:0;;-1:-1:-1;;;;;22504:6:0;22439:79;;36698:100;;;;;;;;;;-1:-1:-1;36698:100:0;;;;;:::i;:::-;;:::i;8250:104::-;;;;;;;;;;;;;:::i;37544:306::-;;;;;;;;;;-1:-1:-1;37544:306:0;;;;;:::i;:::-;;:::i;12599:393::-;;;;;;;;;;-1:-1:-1;12599:393:0;;;;;:::i;:::-;;:::i;9678:200::-;;;;;;;;;;-1:-1:-1;9678:200:0;;;;;:::i;:::-;;:::i;32270:57::-;;;;;;;;;;-1:-1:-1;32270:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31304:33;;;;;;;;;;-1:-1:-1;31304:33:0;;;;;;;;;;;37187:182;;;;;;;;;;-1:-1:-1;37187:182:0;;;;;:::i;:::-;;:::i;36166:259::-;;;;;;;;;;-1:-1:-1;36166:259:0;;;;;:::i;:::-;;:::i;31724:39::-;;;;;;;;;;-1:-1:-1;31724:39:0;;;;;;;;31149:35;;;;;;;;;;;;;;;;35392:481;;;;;;;;;;-1:-1:-1;35392:481:0;;;;;:::i;:::-;;:::i;31772:27::-;;;;;;;;;;;;;;;;9941:176;;;;;;;;;;-1:-1:-1;9941:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;10082:18:0;;;10055:7;10082:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9941:176;31191:33;;;;;;;;;;;;;;;;35187:135;;;;;;;;;;;;;:::i;36995:184::-;;;;;;;;;;-1:-1:-1;36995:184:0;;;;;:::i;:::-;;:::i;44370:132::-;;;;;;;;;;-1:-1:-1;44370:132:0;;;;;:::i;:::-;;:::i;31116:24::-;;;;;;;;;;-1:-1:-1;31116:24:0;;;;-1:-1:-1;;;;;31116:24:0;;;23384:281;;;;;;;;;;-1:-1:-1;23384:281:0;;;;;:::i;:::-;;:::i;32910:75::-;;;;;;;;;;;;32943:42;32910:75;;31231:24;;;;;;;;;;;;;;;;8031:100;8085:13;8118:5;8111:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8031:100;:::o;10264:194::-;10372:4;10389:39;282:10;10412:7;10421:6;10389:8;:39::i;:::-;-1:-1:-1;10446:4:0;10264:194;;;;;:::o;35881:277::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;;;;;;;;;36018:4:::1;36010;35989:13;9239:12:::0;;;9151:108;35989:13:::1;:17;::::0;36005:1:::1;35989:17;:::i;:::-;35988:26;;;;:::i;:::-;35987:35;;;;:::i;:::-;35977:6;:45;;35955:142;;;::::0;-1:-1:-1;;;35955:142:0;;5485:2:1;35955:142:0::1;::::0;::::1;5467:21:1::0;5524:2;5504:18;;;5497:30;5563:34;5543:18;;;5536:62;-1:-1:-1;;;5614:18:1;;;5607:45;5669:19;;35955:142:0::1;5283:411:1::0;35955:142:0::1;36131:19;:6:::0;36141:8:::1;36131:19;:::i;:::-;36108:20;:42:::0;-1:-1:-1;35881:277:0:o;10940:454::-;11080:4;11097:36;11107:6;11115:9;11126:6;11097:9;:36::i;:::-;11144:220;11167:6;282:10;11215:138;11271:6;11215:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11215:19:0;;;;;;:11;:19;;;;;;;;282:10;11215:33;;;;;;;;;;:37;:138::i;:::-;11144:8;:220::i;:::-;-1:-1:-1;11382:4:0;10940:454;;;;;:::o;37377:159::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37493:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:35;;-1:-1:-1;;37493:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37377:159::o;11803:293::-;282:10;11916:4;12005:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12005:34:0;;;;;;;;;;11916:4;;11933:133;;11983:7;;12005:50;;12044:10;12005:38;:50::i;38054:182::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;38183:9:::1;::::0;38152:41:::1;::::0;-1:-1:-1;;;;;38183:9:0;;::::1;::::0;38152:41;::::1;::::0;::::1;::::0;38183:9:::1;::::0;38152:41:::1;38204:9;:24:::0;;-1:-1:-1;;;;;;38204:24:0::1;-1:-1:-1::0;;;;;38204:24:0;;;::::1;::::0;;;::::1;::::0;;38054:182::o;23081:148::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;23172:6:::1;::::0;23151:40:::1;::::0;23188:1:::1;::::0;-1:-1:-1;;;;;23172:6:0::1;::::0;23151:40:::1;::::0;23188:1;;23151:40:::1;23202:6;:19:::0;;-1:-1:-1;;;;;;23202:19:0::1;::::0;;23081:148::o;36806:181::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;36889:12:::1;:19:::0;;;36943:2:::1;36927:18:::0;::::1;;36919:60;;;::::0;-1:-1:-1;;;36919:60:0;;5901:2:1;36919:60:0::1;::::0;::::1;5883:21:1::0;5940:2;5920:18;;;5913:30;5979:31;5959:18;;;5952:59;6028:18;;36919:60:0::1;5699:353:1::0;36919:60:0::1;36806:181:::0;:::o;35005:121::-;22651:6;;35057:4;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;35074:14:0::1;:22:::0;;-1:-1:-1;;35074:22:0::1;::::0;;;35005:121;:::o;36433:169::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36548:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;36548:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36433:169::o;34805:148::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;34860:13:::1;:20:::0;;-1:-1:-1;;34891:18:0;;;;;34933:12:::1;34920:10;:25:::0;34805:148::o;36698:100::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;36769:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;36769:21:0;;::::1;::::0;;;::::1;::::0;;36698:100::o;8250:104::-;8306:13;8339:7;8332:14;;;;;:::i;37544:306::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;37690:13:::1;-1:-1:-1::0;;;;;37682:21:0::1;:4;-1:-1:-1::0;;;;;37682:21:0::1;::::0;37660:128:::1;;;::::0;-1:-1:-1;;;37660:128:0;;6259:2:1;37660:128:0::1;::::0;::::1;6241:21:1::0;6298:2;6278:18;;;6271:30;6337:34;6317:18;;;6310:62;6408:27;6388:18;;;6381:55;6453:19;;37660:128:0::1;6057:421:1::0;37660:128:0::1;37801:41;37830:4;37836:5;37801:28;:41::i;:::-;37544:306:::0;;:::o;12599:393::-;12717:4;12734:228;282:10;12784:7;12806:145;12863:15;12806:145;;;;;;;;;;;;;;;;;282:10;12806:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12806:34:0;;;;;;;;;;;;:38;:145::i;9678:200::-;9789:4;9806:42;282:10;9830:9;9841:6;9806:9;:42::i;37187:182::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37272:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;37272:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37327:34;;1085:41:1;;;37327:34:0::1;::::0;1058:18:1;37327:34:0::1;;;;;;;37187:182:::0;;:::o;36166:259::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;36307:4:::1;36299;36277:13;9239:12:::0;;;9151:108;36277:13:::1;:18;::::0;36293:2:::1;36277:18;:::i;:::-;36276:27;;;;:::i;:::-;36275:36;;;;:::i;:::-;36265:6;:46;;36243:132;;;::::0;-1:-1:-1;;;36243:132:0;;6685:2:1;36243:132:0::1;::::0;::::1;6667:21:1::0;6724:2;6704:18;;;6697:30;6763:34;6743:18;;;6736:62;-1:-1:-1;;;6814:18:1;;;6807:34;6858:19;;36243:132:0::1;6483:400:1::0;36243:132:0::1;36398:19;:6:::0;36408:8:::1;36398:19;:::i;:::-;36386:9;:31:::0;-1:-1:-1;36166:259:0:o;35392:481::-;22651:6;;35489:4;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;35563:6:::1;35542:13;9239:12:::0;;;9151:108;35542:13:::1;:17;::::0;35558:1:::1;35542:17;:::i;:::-;35541:28;;;;:::i;:::-;35528:9;:41;;35506:144;;;::::0;-1:-1:-1;;;35506:144:0;;7090:2:1;35506:144:0::1;::::0;::::1;7072:21:1::0;7129:2;7109:18;;;7102:30;7168:34;7148:18;;;7141:62;-1:-1:-1;;;7219:18:1;;;7212:51;7280:19;;35506:144:0::1;6888:417:1::0;35506:144:0::1;35718:4;35697:13;9239:12:::0;;;9151:108;35697:13:::1;:17;::::0;35713:1:::1;35697:17;:::i;:::-;35696:26;;;;:::i;:::-;35683:9;:39;;35661:141;;;::::0;-1:-1:-1;;;35661:141:0;;7512:2:1;35661:141:0::1;::::0;::::1;7494:21:1::0;7551:2;7531:18;;;7524:30;7590:34;7570:18;;;7563:62;-1:-1:-1;;;7641:18:1;;;7634:50;7701:19;;35661:141:0::1;7310:416:1::0;35661:141:0::1;-1:-1:-1::0;35813:18:0::1;:30:::0;;;35861:4:::1;22721:1;35392:481:::0;;;:::o;35187:135::-;22651:6;;35247:4;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;35264:20:0::1;:28:::0;;-1:-1:-1;;35264:28:0::1;::::0;;;35187:135;:::o;36995:184::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;37079:13:::1;:20:::0;;;37135:2:::1;37118:19:::0;::::1;;37110:61;;;::::0;-1:-1:-1;;;37110:61:0;;5901:2:1;37110:61:0::1;::::0;::::1;5883:21:1::0;5940:2;5920:18;;;5913:30;5979:31;5959:18;;;5952:59;6028:18;;37110:61:0::1;5699:353:1::0;44370:132:0;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;44442:2:::1;44436;:8;;44428:51;;;::::0;-1:-1:-1;;;44428:51:0;;7933:2:1;44428:51:0::1;::::0;::::1;7915:21:1::0;7972:2;7952:18;;;7945:30;8011:32;7991:18;;;7984:60;8061:18;;44428:51:0::1;7731:354:1::0;44428:51:0::1;44484:8;:13:::0;44370:132::o;23384:281::-;22651:6;;-1:-1:-1;;;;;22651:6:0;282:10;22651:22;22643:67;;;;-1:-1:-1;;;22643:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23487:22:0;::::1;23465:110;;;::::0;-1:-1:-1;;;23465:110:0;;8292:2:1;23465:110:0::1;::::0;::::1;8274:21:1::0;8331:2;8311:18;;;8304:30;8370:34;8350:18;;;8343:62;-1:-1:-1;;;8421:18:1;;;8414:36;8467:19;;23465:110:0::1;8090:402:1::0;23465:110:0::1;23612:6;::::0;23591:38:::1;::::0;-1:-1:-1;;;;;23591:38:0;;::::1;::::0;23612:6:::1;::::0;23591:38:::1;::::0;23612:6:::1;::::0;23591:38:::1;23640:6;:17:::0;;-1:-1:-1;;;;;;23640:17:0::1;-1:-1:-1::0;;;;;23640:17:0;;;::::1;::::0;;;::::1;::::0;;23384:281::o;15983:380::-;-1:-1:-1;;;;;16119:19:0;;16111:68;;;;-1:-1:-1;;;16111:68:0;;8699:2:1;16111:68:0;;;8681:21:1;8738:2;8718:18;;;8711:30;8777:34;8757:18;;;8750:62;-1:-1:-1;;;8828:18:1;;;8821:34;8872:19;;16111:68:0;8497:400:1;16111:68:0;-1:-1:-1;;;;;16198:21:0;;16190:68;;;;-1:-1:-1;;;16190:68:0;;9104:2:1;16190:68:0;;;9086:21:1;9143:2;9123:18;;;9116:30;9182:34;9162:18;;;9155:62;-1:-1:-1;;;9233:18:1;;;9226:32;9275:19;;16190:68:0;8902:398:1;16190:68:0;-1:-1:-1;;;;;16271:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16323:32;;1770:25:1;;;16323:32:0;;1743:18:1;16323:32:0;;;;;;;;15983:380;;;:::o;38428:4596::-;-1:-1:-1;;;;;38560:18:0;;38552:68;;;;-1:-1:-1;;;38552:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38639:16:0;;38631:64;;;;-1:-1:-1;;;38631:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38729:14:0;;;;;;:10;:14;;;;;;;;38728:15;:36;;;;-1:-1:-1;;;;;;38748:16:0;;;;;;:10;:16;;;;;;;;38747:17;38728:36;38706:135;;;;-1:-1:-1;;;38706:135:0;;10317:2:1;38706:135:0;;;10299:21:1;10356:2;10336:18;;;10329:30;10395:34;10375:18;;;10368:62;-1:-1:-1;;;10446:18:1;;;10439:47;10503:19;;38706:135:0;10115:413:1;38706:135:0;38856:6;38866:1;38856:11;38852:93;;38884:28;38900:4;38906:2;38910:1;38884:15;:28::i;:::-;38428:4596;;;:::o;38852:93::-;38961:14;;;;38957:2487;;;22504:6;;-1:-1:-1;;;;;39014:15:0;;;22504:6;;39014:15;;;;:49;;-1:-1:-1;22504:6:0;;-1:-1:-1;;;;;39050:13:0;;;22504:6;;39050:13;;39014:49;:86;;;;-1:-1:-1;;;;;;39084:16:0;;;;39014:86;:128;;;;-1:-1:-1;;;;;;39121:21:0;;39135:6;39121:21;;39014:128;:158;;;;-1:-1:-1;39164:8:0;;-1:-1:-1;;;39164:8:0;;;;39163:9;39014:158;38992:2441;;;39212:13;;;;;;;39207:223;;-1:-1:-1;;;;;39284:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;39313:23:0;;;;;;:19;:23;;;;;;;;39284:52;39250:160;;;;-1:-1:-1;;;39250:160:0;;10735:2:1;39250:160:0;;;10717:21:1;10774:2;10754:18;;;10747:30;-1:-1:-1;;;10793:18:1;;;10786:52;10855:18;;39250:160:0;10533:346:1;39250:160:0;39586:20;;;;39582:641;;;22504:6;;-1:-1:-1;;;;;39661:13:0;;;22504:6;;39661:13;;;;:72;;;39717:15;-1:-1:-1;;;;;39703:30:0;:2;-1:-1:-1;;;;;39703:30:0;;;39661:72;:129;;;;;39776:13;-1:-1:-1;;;;;39762:28:0;:2;-1:-1:-1;;;;;39762:28:0;;;39661:129;39631:573;;;39908:9;39879:39;;;;:28;:39;;;;;;39954:12;-1:-1:-1;39841:258:0;;;;-1:-1:-1;;;39841:258:0;;11086:2:1;39841:258:0;;;11068:21:1;11125:2;11105:18;;;11098:30;11164:34;11144:18;;;11137:62;11235:34;11215:18;;;11208:62;-1:-1:-1;;;11286:19:1;;;11279:40;11336:19;;39841:258:0;10884:477:1;39841:258:0;40155:9;40126:39;;;;:28;:39;;;;;40168:12;40126:54;;39631:573;-1:-1:-1;;;;;40297:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;40354:35:0;;;;;;:31;:35;;;;;;;;40353:36;40297:92;40271:1147;;;40476:20;;40466:6;:30;;40432:169;;;;-1:-1:-1;;;40432:169:0;;11568:2:1;40432:169:0;;;11550:21:1;11607:2;11587:18;;;11580:30;11646:34;11626:18;;;11619:62;-1:-1:-1;;;11697:18:1;;;11690:51;11758:19;;40432:169:0;11366:417:1;40432:169:0;40684:9;;-1:-1:-1;;;;;9439:18:0;;9412:7;9439:18;;;;;;;;;;;40658:22;;:6;:22;:::i;:::-;:35;;40624:140;;;;-1:-1:-1;;;40624:140:0;;12120:2:1;40624:140:0;;;12102:21:1;12159:2;12139:18;;;12132:30;-1:-1:-1;;;12178:18:1;;;12171:49;12237:18;;40624:140:0;11918:343:1;40624:140:0;40271:1147;;;-1:-1:-1;;;;;40862:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;40917:37:0;;;;;;:31;:37;;;;;;;;40916:38;40862:92;40836:582;;;41041:20;;41031:6;:30;;40997:170;;;;-1:-1:-1;;;40997:170:0;;12468:2:1;40997:170:0;;;12450:21:1;12507:2;12487:18;;;12480:30;12546:34;12526:18;;;12519:62;-1:-1:-1;;;12597:18:1;;;12590:52;12659:19;;40997:170:0;12266:418:1;40836:582:0;-1:-1:-1;;;;;41198:35:0;;;;;;:31;:35;;;;;;;;41193:225;;41318:9;;-1:-1:-1;;;;;9439:18:0;;9412:7;9439:18;;;;;;;;;;;41292:22;;:6;:22;:::i;:::-;:35;;41258:140;;;;-1:-1:-1;;;41258:140:0;;12120:2:1;41258:140:0;;;12102:21:1;12159:2;12139:18;;;12132:30;-1:-1:-1;;;12178:18:1;;;12171:49;12237:18;;41258:140:0;11918:343:1;41258:140:0;41518:10;;:14;;41531:1;41518:14;:::i;:::-;41501:12;:32;;:68;;;;;41556:13;-1:-1:-1;;;;;41550:19:0;:2;-1:-1:-1;;;;;41550:19:0;;;41501:68;:106;;;;-1:-1:-1;;;;;;41586:21:0;;32943:42;41586:21;;41501:106;41483:184;;;-1:-1:-1;;;;;41634:14:0;;;;;;:10;:14;;;;;:21;;-1:-1:-1;;41634:21:0;41651:4;41634:21;;;41483:184;41728:4;41679:28;9439:18;;;;;;;;;;;41786;;41762:42;;;;;;;41835:35;;-1:-1:-1;41859:11:0;;;;;;;41835:35;:61;;;;-1:-1:-1;41888:8:0;;-1:-1:-1;;;41888:8:0;;;;41887:9;41835:61;:110;;;;-1:-1:-1;;;;;;41914:31:0;;;;;;:25;:31;;;;;;;;41913:32;41835:110;:153;;;;-1:-1:-1;;;;;;41963:25:0;;;;;;:19;:25;;;;;;;;41962:26;41835:153;:194;;;;-1:-1:-1;;;;;;42006:23:0;;;;;;:19;:23;;;;;;;;42005:24;41835:194;41817:326;;;42056:8;:15;;-1:-1:-1;;;;42056:15:0;-1:-1:-1;;;42056:15:0;;;42088:10;:8;:10::i;:::-;42115:8;:16;;-1:-1:-1;;;;42115:16:0;;;41817:326;42171:8;;-1:-1:-1;;;;;42281:25:0;;42155:12;42281:25;;;:19;:25;;;;;;42171:8;-1:-1:-1;;;42171:8:0;;;;;42170:9;;42281:25;;:52;;-1:-1:-1;;;;;;42310:23:0;;;;;;:19;:23;;;;;;;;42281:52;42277:100;;;-1:-1:-1;42360:5:0;42277:100;42457:11;42483:7;42479:492;;;-1:-1:-1;;;;;42535:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;42584:1;42568:13;;:17;42535:50;42531:304;;;42612:34;42642:3;42612:25;42623:13;;42612:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;42606:40;;42531:304;;;-1:-1:-1;;;;;42708:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;42758:1;42743:12;;:16;42708:51;42704:131;;;42786:33;42815:3;42786:24;42797:12;;42786:6;:10;;:24;;;;:::i;:33::-;42780:39;;42704:131;42855:7;;42851:109;;42883:41;42899:4;42913;42920:3;42883:15;:41::i;:::-;42931:13;42941:3;42931:13;;:::i;:::-;;;42851:109;42983:33;42999:4;43005:2;43009:6;42983:15;:33::i;:::-;38541:4483;;;;38428:4596;;;:::o;18264:226::-;18384:7;18420:12;18412:6;;;;18404:29;;;;-1:-1:-1;;;18404:29:0;;;;;;;;:::i;:::-;-1:-1:-1;18444:9:0;18456:5;18460:1;18456;:5;:::i;:::-;18444:17;18264:226;-1:-1:-1;;;;;18264:226:0:o;17361:181::-;17419:7;;17451:5;17455:1;17451;:5;:::i;:::-;17439:17;;17480:1;17475;:6;;17467:46;;;;-1:-1:-1;;;17467:46:0;;13024:2:1;17467:46:0;;;13006:21:1;13063:2;13043:18;;;13036:30;13102:29;13082:18;;;13075:57;13149:18;;17467:46:0;12822:351:1;17467:46:0;17533:1;17361:181;-1:-1:-1;;;17361:181:0:o;37858:188::-;-1:-1:-1;;;;;37941:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;37941:39:0;;;;;;;;;;37998:40;;37941:39;;:31;37998:40;;;37858:188;;:::o;13482:610::-;-1:-1:-1;;;;;13622:20:0;;13614:70;;;;-1:-1:-1;;;13614:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13703:23:0;;13695:71;;;;-1:-1:-1;;;13695:71:0;;;;;;;:::i;:::-;13859:108;13895:6;13859:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13859:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;13839:17:0;;;:9;:17;;;;;;;;;;;:128;;;;14001:20;;;;;;;:32;;14026:6;14001:24;:32::i;:::-;-1:-1:-1;;;;;13978:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14049:35;1770:25:1;;;13978:20:0;;14049:35;;;;;;1743:18:1;14049:35:0;1624:177:1;43794:571:0;43877:4;43833:23;9439:18;;;;;;;;;;;43990;;9439;;43833:23;43990;;44011:2;43990:23;:::i;:::-;43972:15;:41;43968:115;;;44048:18;;:23;;44069:2;44048:23;:::i;:::-;44030:41;;43968:115;44092:19;;44089:68;;44118:33;44135:15;44118:16;:33::i;:::-;44166:21;:25;44163:195;;44221:9;;44213:83;;-1:-1:-1;;;;;44221:9:0;;;;44259:21;;44213:83;;;;44259:21;44221:9;44213:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44199:97;;;;;44310:7;44302:50;;;;-1:-1:-1;;;44302:50:0;;13590:2:1;44302:50:0;;;13572:21:1;13629:2;13609:18;;;13602:30;13668:32;13648:18;;;13641:60;13718:18;;44302:50:0;13388:354:1;18749:471:0;18807:7;19052:1;19057;19052:6;19048:47;;-1:-1:-1;19082:1:0;19075:8;;19048:47;19107:9;19119:5;19123:1;19119;:5;:::i;:::-;19107:17;-1:-1:-1;19152:1:0;19143:5;19147:1;19107:17;19143:5;:::i;:::-;:10;19135:56;;;;-1:-1:-1;;;19135:56:0;;13949:2:1;19135:56:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027:34;14007:18;;;14000:62;-1:-1:-1;;;14078:18:1;;;14071:31;14119:19;;19135:56:0;13747:397:1;19696:132:0;19754:7;19781:39;19785:1;19788;19781:39;;;;;;;;;;;;;;;;;:3;:39::i;43032:754::-;43122:16;;;43136:1;43122:16;;;;;;;;43098:21;;43122:16;;;;;;;;;;-1:-1:-1;43122:16:0;43098:40;;43167:4;43149;43154:1;43149:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;43149:23:0;;;-1:-1:-1;;;;;43149:23:0;;;;;43193:15;-1:-1:-1;;;;;43193:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43183:4;43188:1;43183:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43183:32:0;;;:7;;;;;;;;;:32;43296:48;;-1:-1:-1;;;43296:48:0;;43266:27;;43296:15;:29;;;;:48;;43326:11;;43339:4;;43296:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43296:48:0;;;;;;;;;;;;:::i;:::-;43266:78;;43349:17;43396:3;43385:8;;43369:10;43380:1;43369:13;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;:30;;;;:::i;:::-;43349:50;;43407:20;43446:9;43430:10;43441:1;43430:13;;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;43407:48;;43468:62;43485:4;43500:15;43518:11;43468:8;:62::i;:::-;43543:235;;-1:-1:-1;;;43543:235:0;;-1:-1:-1;;;;;43543:15:0;:66;;;;:235;;43624:11;;43650:12;;43705:4;;43732;;43752:15;;43543:235;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43087:699;;;;43032:754;:::o;20324:312::-;20444:7;20479:12;20472:5;20464:28;;;;-1:-1:-1;;;20464:28:0;;;;;;;;:::i;:::-;-1:-1:-1;20503:9:0;20515:5;20519:1;20515;:5;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:367;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;904:2;889:18;;;;876:32;;-1:-1:-1;;;573:367:1:o;1137:247::-;1196:6;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1304:9;1291:23;1323:31;1348:5;1323:31;:::i;1806:226::-;1865:6;1918:2;1906:9;1897:7;1893:23;1889:32;1886:52;;;1934:1;1931;1924:12;1886:52;-1:-1:-1;1979:23:1;;1806:226;-1:-1:-1;1806:226:1:o;2037:508::-;2114:6;2122;2130;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;2238:9;2225:23;2257:31;2282:5;2257:31;:::i;:::-;2307:5;-1:-1:-1;2364:2:1;2349:18;;2336:32;2377:33;2336:32;2377:33;:::i;:::-;2037:508;;2429:7;;-1:-1:-1;;;2509:2:1;2494:18;;;;2481:32;;2037:508::o;2550:160::-;2615:20;;2671:13;;2664:21;2654:32;;2644:60;;2700:1;2697;2690:12;2715:315;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2896:9;2883:23;2915:31;2940:5;2915:31;:::i;:::-;2965:5;-1:-1:-1;2989:35:1;3020:2;3005:18;;2989:35;:::i;:::-;2979:45;;2715:315;;;;;:::o;3432:180::-;3488:6;3541:2;3529:9;3520:7;3516:23;3512:32;3509:52;;;3557:1;3554;3547:12;3509:52;3580:26;3596:9;3580:26;:::i;3617:388::-;3685:6;3693;3746:2;3734:9;3725:7;3721:23;3717:32;3714:52;;;3762:1;3759;3752:12;3714:52;3801:9;3788:23;3820:31;3845:5;3820:31;:::i;:::-;3870:5;-1:-1:-1;3927:2:1;3912:18;;3899:32;3940:33;3899:32;3940:33;:::i;:::-;3992:7;3982:17;;;3617:388;;;;;:::o;4010:380::-;4089:1;4085:12;;;;4132;;;4153:61;;4207:4;4199:6;4195:17;4185:27;;4153:61;4260:2;4252:6;4249:14;4229:18;4226:38;4223:161;;4306:10;4301:3;4297:20;4294:1;4287:31;4341:4;4338:1;4331:15;4369:4;4366:1;4359:15;4223:161;;4010:380;;;:::o;4395:356::-;4597:2;4579:21;;;4616:18;;;4609:30;4675:34;4670:2;4655:18;;4648:62;4742:2;4727:18;;4395:356::o;4756:127::-;4817:10;4812:3;4808:20;4805:1;4798:31;4848:4;4845:1;4838:15;4872:4;4869:1;4862:15;4888:168;4961:9;;;4992;;5009:15;;;5003:22;;4989:37;4979:71;;5030:18;;:::i;5061:217::-;5101:1;5127;5117:132;;5171:10;5166:3;5162:20;5159:1;5152:31;5206:4;5203:1;5196:15;5234:4;5231:1;5224:15;5117:132;-1:-1:-1;5263:9:1;;5061:217::o;9305:401::-;9507:2;9489:21;;;9546:2;9526:18;;;9519:30;9585:34;9580:2;9565:18;;9558:62;-1:-1:-1;;;9651:2:1;9636:18;;9629:35;9696:3;9681:19;;9305:401::o;9711:399::-;9913:2;9895:21;;;9952:2;9932:18;;;9925:30;9991:34;9986:2;9971:18;;9964:62;-1:-1:-1;;;10057:2:1;10042:18;;10035:33;10100:3;10085:19;;9711:399::o;11788:125::-;11853:9;;;11874:10;;;11871:36;;;11887:18;;:::i;12689:128::-;12756:9;;;12777:11;;;12774:37;;;12791:18;;:::i;14149:127::-;14210:10;14205:3;14201:20;14198:1;14191:31;14241:4;14238:1;14231:15;14265:4;14262:1;14255:15;14281:127;14342:10;14337:3;14333:20;14330:1;14323:31;14373:4;14370:1;14363:15;14397:4;14394:1;14387:15;14413:251;14483:6;14536:2;14524:9;14515:7;14511:23;14507:32;14504:52;;;14552:1;14549;14542:12;14504:52;14584:9;14578:16;14603:31;14628:5;14603:31;:::i;14669:446::-;14722:3;14760:5;14754:12;14787:6;14782:3;14775:19;14819:4;14814:3;14810:14;14803:21;;14858:4;14851:5;14847:16;14881:1;14891:199;14905:6;14902:1;14899:13;14891:199;;;14970:13;;-1:-1:-1;;;;;14966:39:1;14954:52;;15035:4;15026:14;;;;15063:17;;;;15002:1;14920:9;14891:199;;;-1:-1:-1;15106:3:1;;14669:446;-1:-1:-1;;;;14669:446:1:o;15120:332::-;15327:6;15316:9;15309:25;15370:2;15365;15354:9;15350:18;15343:30;15290:4;15390:56;15442:2;15431:9;15427:18;15419:6;15390:56;:::i;:::-;15382:64;15120:332;-1:-1:-1;;;;15120:332:1:o;15457:1165::-;15552:6;15605:2;15593:9;15584:7;15580:23;15576:32;15573:52;;;15621:1;15618;15611:12;15573:52;15654:9;15648:16;15687:18;15679:6;15676:30;15673:50;;;15719:1;15716;15709:12;15673:50;15742:22;;15795:4;15787:13;;15783:27;-1:-1:-1;15773:55:1;;15824:1;15821;15814:12;15773:55;15857:2;15851:9;15883:18;15875:6;15872:30;15869:56;;;15905:18;;:::i;:::-;15951:6;15948:1;15944:14;15987:2;15981:9;16050:2;16046:7;16041:2;16037;16033:11;16029:25;16021:6;16017:38;16121:6;16109:10;16106:22;16085:18;16073:10;16070:34;16067:62;16064:88;;;16132:18;;:::i;:::-;16168:2;16161:22;16218;;;16268:2;16298:11;;;16294:20;;;16218:22;16256:15;;16326:19;;;16323:39;;;16358:1;16355;16348:12;16323:39;16390:2;16386;16382:11;16371:22;;16402:189;16418:6;16413:3;16410:15;16402:189;;;16508:10;;16531:18;;;16578:2;16435:12;;;;16508:10;;-1:-1:-1;16569:12:1;16402:189;;;-1:-1:-1;16610:6:1;15457:1165;-1:-1:-1;;;;;;15457:1165:1:o;16627:574::-;16918:6;16907:9;16900:25;16961:6;16956:2;16945:9;16941:18;16934:34;17004:3;16999:2;16988:9;16984:18;16977:31;16881:4;17025:57;17077:3;17066:9;17062:19;17054:6;17025:57;:::i;:::-;-1:-1:-1;;;;;17118:32:1;;;;17113:2;17098:18;;17091:60;-1:-1:-1;17182:3:1;17167:19;17160:35;17017:65;16627:574;-1:-1:-1;;;16627:574:1:o

Swarm Source

ipfs://d3a50e912269664f8924f28b50fd6bb677d659204a30ce2ae8248e62d6802bf1
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.