ETH Price: $2,506.60 (+0.33%)
Gas: 3.09 Gwei

Token

zkHive (ZKHIVE)
 

Overview

Max Total Supply

100,000,000 ZKHIVE

Holders

3,961 (0.00%)

Market

Price

$0.00 @ 0.000001 ETH (-0.60%)

Onchain Market Cap

$201,454.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 ZKHIVE

Value
$0.00
0xb2a7b6bedbcbe2cf36e318cf485329567c8a4d73
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

zkHive is a decentralized firewall for crypto communities and individuals.

Market

Volume (24H):$314.38
Market Capitalization:$0.00
Circulating Supply:0.00 ZKHIVE
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V2 (Ethereum)
0X750C3A0A0CE9984EEB8C5D146DFF024B584E5E33-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.002
0.0000008 Eth
$314.08
155,688.512 0X750C3A0A0CE9984EEB8C5D146DFF024B584E5E33
100.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
ZKHiveToken

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-05
*/

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

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
 
    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
 
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
 

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
 
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
 
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
 
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
 
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https:
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
 
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
 
 

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}
 
 

 


 
pragma solidity ^0.8.0;
 
 

 


 
pragma solidity ^0.8.0;
 
 
 
/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https:
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    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}.
     *
     * 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 default value returned by this function, unless
     * it's 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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }
 
        return true;
    }
 
    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
 
        _beforeTokenTransfer(from, to, amount);
 
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            
            
            _balances[to] += amount;
        }
 
        emit Transfer(from, to, amount);
 
        _afterTokenTransfer(from, to, 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 += amount;
        unchecked {
            
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
 
        _afterTokenTransfer(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);
 
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            
            _totalSupply -= amount;
        }
 
        emit Transfer(account, address(0), amount);
 
        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 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 {}
 
    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
 
 

 


 
pragma solidity ^0.8.0;
 
 
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}
 
 

 
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 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 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;
}
 
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}
 
 
interface IUniswapV2ERC20 {
    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;
}
 
 

 

 
pragma solidity ^0.8.15;
 
 
 
 
contract ZKHiveToken is ERC20Burnable, Ownable {
    uint256 private constant TOTAL_SUPPLY = 100_000_000e18;
    address public marketingWallet;
    uint256 public maxPercentToSwap = 5;
    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;
 
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
 
    bool private swapping;
    uint256 public swapTokensAtAmount;
    bool public isTradingEnabled;
    uint256 public openTradeBlock;
    uint256 public fastBlocks;
    uint256 public fastBlocks2;
 
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
 
    event ExcludeFromFees(address indexed account);
    event FeesUpdated(uint256 sellFee, uint256 buyFee);
    event MarketingWalletChanged(address marketingWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndSendMarketing(uint256 tokensSwapped, uint256 bnbSend);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
 
    uint256 public immutable fastBlockSellFee;
    uint256 public immutable fastBlockBuyFee;
    uint256 public sellFee;
    uint256 public buyFee;
 
    
    bool public _removeLimits;
    uint256 public maxTxAmount;
    uint256 public maxHolding;
    mapping(address => bool) public isExempt;
 
    mapping(address => bool) public bld;
    bool public blStopped = false;
 
    constructor (address router, address operator) ERC20("zkHive", "ZKHIVE")
    {
        _mint(owner(), TOTAL_SUPPLY);
 
        swapTokensAtAmount = TOTAL_SUPPLY / 1000;
        maxHolding = TOTAL_SUPPLY / 1000;
        maxTxAmount = TOTAL_SUPPLY / 1000;
        marketingWallet = operator;
 
        fastBlockSellFee = 90;
        fastBlockBuyFee = 90;
        sellFee = 25;
        buyFee = 25;
        fastBlocks = 4;
        fastBlocks2 = 12;
 
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
 
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
 
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
 
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
 
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(uniswapV2Router)] = true;
 
        
        isExempt[address(uniswapV2Router)] = true;
        isExempt[owner()] = true;
    }
 
    receive() external payable {
    }
 
    function openTrade() public onlyOwner {
        require(isTradingEnabled == false, "Trading is already open!");
        isTradingEnabled = true;
        openTradeBlock = block.number;
    }
 
    function extractTokens(address token) external onlyOwner {
        require(token != address(this), "3");
        if (token == address(0x0)) {
            payable(msg.sender).transfer(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }
 
    function sendETH(address payable recipient, uint256 amount) internal {
        
        recipient.call{gas: 2300, value: amount}("");
    }
 
    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 {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
 
        emit SetAutomatedMarketMakerPair(pair, value);
    }
 
    
    function excludeFromFees(address account) external onlyOwner {
        require(!_isExcludedFromFees[account], "1");
        _isExcludedFromFees[account] = true;
 
        emit ExcludeFromFees(account);
    }
 
    function includeInFees(address account) external onlyOwner {
        require(_isExcludedFromFees[account], "2");
        _isExcludedFromFees[account] = false;
    }
 
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }
 
    function updateFees(uint256 _sellFee, uint256 _buyFee) external onlyOwner {
        require(_sellFee <= 8, "Fee max");
        require(_buyFee <= 8, "Fee max");
        sellFee = _sellFee;
        buyFee = _buyFee;
 
        emit FeesUpdated(sellFee, buyFee);
    }
 
    function updateWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != marketingWallet, "Marketing wallet is already that address");
        marketingWallet = _marketingWallet;
        emit MarketingWalletChanged(marketingWallet);
    }
 
    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");
 
        if (!swapping) {
            _check(from, to, amount);
        }
 
        if (!isExempt[from] && !isExempt[to]) {
            require(isTradingEnabled, "Trade is not open");
            if (openTradeBlock + fastBlocks2 > block.number) {
                require(tx.origin == to || automatedMarketMakerPairs[to], "early");
            }
        }
 
        uint _buyFee = buyFee;
        uint _sellFee = sellFee;
        if (openTradeBlock + fastBlocks > block.number) {
            _buyFee = fastBlockBuyFee;
            _sellFee = fastBlockSellFee;
        }
 
        if (amount == 0) {
            return;
        }
 
        bool takeFee = !swapping;
 
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
 
        uint256 toSwap = balanceOf(address(this));
 
        bool canSwap = toSwap >= swapTokensAtAmount && toSwap > 0 && !automatedMarketMakerPairs[from] && takeFee;
        if (canSwap &&
            !swapping) {
            swapping = true;
            uint256 pairBalance = balanceOf(uniswapV2Pair);
            if (toSwap > pairBalance * maxPercentToSwap / 100) {
                toSwap = pairBalance * maxPercentToSwap / 100;
            }
            swapAndSendMarketing(toSwap);
            swapping = false;
        }
 
        if (takeFee && to == uniswapV2Pair && _sellFee > 0) {
            uint256 fees = (amount * _sellFee) / 100;
            amount = amount - fees;
 
            super._transfer(from, address(this), fees);
        }
        else if (takeFee && from == uniswapV2Pair && _buyFee > 0) {
            uint256 fees = (amount * _buyFee) / 100;
            amount = amount - fees;
 
            super._transfer(from, address(this), fees);
        }
 
        super._transfer(from, to, amount);
    }
 
    
    function swapAndSendMarketing(uint256 tokenAmount) private {
 
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
 
        try uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, 
            path,
            address(this),
            block.timestamp) {}
        catch {
        }
 
        uint256 newBalance = address(this).balance;
        sendETH(payable(marketingWallet), newBalance);
 
        emit SwapAndSendMarketing(tokenAmount, newBalance);
    }
 
    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(newAmount > 0);
        swapTokensAtAmount = newAmount;
    }
 
    function setMaxPercentToSwap(uint256 newAmount) external onlyOwner {
        require(newAmount > 1, "too low");
        require(newAmount <= 10, "too high");
        maxPercentToSwap = newAmount;
    }
 
    function _check(
        address from,
        address to,
        uint256 amount
    ) internal {
        
        if (!_removeLimits) {
            require(!bld[from] && !bld[to], "bld");
 
            
            if (!isUnused(from, to) && !isExempt[to]) {
                _checkMaxTxAmount(to, amount);
                
                _checkMaxHoldingLimit(to, amount);
            }
        }
    }
 
    function _checkMaxTxAmount(address to, uint256 amount) internal view {
        require(amount <= maxTxAmount, "Amount exceeds max");
 
    }
 
    function _checkMaxHoldingLimit(address to, uint256 amount) internal view {
        if (to == uniswapV2Pair) {
            return;
        }
 
        require(balanceOf(to) + amount <= maxHolding, "Max holding exceeded max");
 
    }
 
    function blAdd(address[] memory addresses) external onlyOwner {
        require(!blStopped, "bl is stopped");
        for (uint i = 0; i < addresses.length; i++) {
            bld[addresses[i]] = true;
        }
    }
 
    function blRemove(address[] memory addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            bld[addresses[i]] = false;
        }
    }
 
    function removeBl() external onlyOwner {
        blStopped = true;
    }
 
    function isUnused(address from, address to) view public returns (bool){
        
        return (from == owner() || to == owner() || from == address(this) || to == address(this));
    }
 
    function removeLimits() external onlyOwner {
        _removeLimits = true;
    }
 
    function setMaxTxAmount(uint256 maxTxAmount_) external onlyOwner {
        maxTxAmount = maxTxAmount_;
    }
 
    function setMaxHolding(uint256 maxHolding_) external onlyOwner {
        maxHolding = maxHolding_;
    }
 
    function setExempt(address who, bool status) public onlyOwner {
        isExempt[who] = status;
    }
 
    function multiTransfer(address[] memory to, uint256[] memory amounts) external onlyOwner {
        require(to.length == amounts.length, "length mismatch");
 
        for (uint i = 0; i < to.length; i++) {
            _transfer(msg.sender, to[i], amounts[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","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":"bnbSend","type":"uint256"}],"name":"SwapAndSendMarketing","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"},{"inputs":[],"name":"_removeLimits","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":"addresses","type":"address[]"}],"name":"blAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bld","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"extractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fastBlockBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlockSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlocks2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"isExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"isUnused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHolding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPercentToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","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":"address","name":"who","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxHolding_","type":"uint256"}],"name":"setMaxHolding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setMaxPercentToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount_","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"updateWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260056007556018805460ff191690553480156200001f575f80fd5b50604051620031923803806200319283398101604081905262000042916200074e565b604051806040016040528060068152602001657a6b4869766560d01b815250604051806040016040528060068152602001655a4b4849564560d01b815250816003908162000091919062000821565b506004620000a0828262000821565b505050620000bd620000b76200040260201b60201c565b62000406565b620000e6620000d46005546001600160a01b031690565b6a52b7d2dcc80cd2e400000062000457565b620000ff6103e86a52b7d2dcc80cd2e4000000620008ed565b600a556200011b6103e86a52b7d2dcc80cd2e4000000620008ed565b601555620001376103e86a52b7d2dcc80cd2e4000000620008ed565b601455600680546001600160a01b0319166001600160a01b0383811691909117909155605a608081905260a052601960118190556012556004600d819055600c600e556040805163c45a015560e01b8152905185935f939085169263c45a015592818301926020928290030181865afa158015620001b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001dd91906200090d565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000229573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200024f91906200090d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200029a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002c091906200090d565b600880546001600160a01b038086166001600160a01b031992831681179093556009805491851691909216179055909150620003009030905f196200051c565b6200030d81600162000643565b6001600f5f620003256005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055600f84527f99629f56119585bf27511b6b7d295dffb54757453fcc3dabcf51d92028301f1080548616600190811790915530825283822080548716821790556008805484168352848320805488168317905554909216815260169384905291822080549094168117909355620003d06005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055506200095692505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620004b35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060025f828254620004c6919062000930565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620005805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620004aa565b6001600160a01b038216620005e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004aa565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503620006da5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620004aa565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b505050565b80516001600160a01b038116811462000749575f80fd5b919050565b5f806040838503121562000760575f80fd5b6200076b8362000732565b91506200077b6020840162000732565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620007ad57607f821691505b602082108103620007cc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200072d57805f5260205f20601f840160051c81016020851015620007f95750805b601f840160051c820191505b818110156200081a575f815560010162000805565b5050505050565b81516001600160401b038111156200083d576200083d62000784565b62000855816200084e845462000798565b84620007d2565b602080601f8311600181146200088b575f8415620008735750858301515b5f19600386901b1c1916600185901b178555620008e5565b5f85815260208120601f198616915b82811015620008bb578886015182559484019460019091019084016200089a565b5085821015620008d957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f826200090857634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156200091e575f80fd5b620009298262000732565b9392505050565b808201808211156200095057634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05161280c620009865f395f81816103be015261187701525f81816107e0015261189a015261280c5ff3fe608060405260043610610353575f3560e01c8063751039fc116101bd578063a457c2d7116100f2578063e2f4560511610092578063ec28438a1161006d578063ec28438a146109d2578063f2fde38b146109f1578063f60ae6ab14610a10578063fb201b1d14610a25575f80fd5b8063e2f4560514610985578063e57f14e11461099a578063e7de382b146109b9575f80fd5b8063afa4f3b2116100cd578063afa4f3b2146108e0578063b62496f5146108ff578063c7214e201461092d578063dd62ed3e14610941575f80fd5b8063a457c2d714610874578063a9059cbb14610893578063ad5dff73146108b2575f80fd5b80638da5cb5b1161015d5780639a7a23d6116101385780639a7a23d6146108025780639bc7c8c0146108215780639c7d15a2146108405780639fde54f514610855575f80fd5b80638da5cb5b1461079e57806395d89b41146107bb57806396483bc2146107cf575f80fd5b806379cc67901161019857806379cc67901461072c5780638321e7401461074b578063848b86e31461076a5780638c0b5e2214610789575f80fd5b8063751039fc146106da57806375f0a874146106ee578063778325251461070d575f80fd5b8063333e6f06116102935780634a30b386116102335780636db794371161020e5780636db794371461064557806370a0823114610664578063715018a61461069857806371d8a776146106ac575f80fd5b80634a30b386146105e05780634dd0f946146105f95780634fbee1931461060e575f80fd5b80633d378b1c1161026e5780633d378b1c1461057857806342966c681461058d57806347062402146105ac57806349bd5a5e146105c1575f80fd5b8063333e6f06146105255780633381c64a1461053a5780633950935114610559575f80fd5b806316a2f82a116102fe57806320518758116102d957806320518758146104b757806323b872dd146104d65780632b14ca56146104f5578063313ce5671461050a575f80fd5b806316a2f82a1461046557806318160ddd146104845780631e89d54514610498575f80fd5b806307ebd12f1161032e57806307ebd12f146103ee578063095ea7b31461040f5780631694505e1461042e575f80fd5b8063064a59d01461035e57806306fdde031461038c578063071833a2146103ad575f80fd5b3661035a57005b5f80fd5b348015610369575f80fd5b50600b546103779060ff1681565b60405190151581526020015b60405180910390f35b348015610397575f80fd5b506103a0610a39565b6040516103839190612306565b3480156103b8575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610383565b3480156103f9575f80fd5b5061040d610408366004612366565b610ac9565b005b34801561041a575f80fd5b50610377610429366004612381565b610c2f565b348015610439575f80fd5b5060085461044d906001600160a01b031681565b6040516001600160a01b039091168152602001610383565b348015610470575f80fd5b5061040d61047f366004612366565b610c48565b34801561048f575f80fd5b506002546103e0565b3480156104a3575f80fd5b5061040d6104b2366004612488565b610cbb565b3480156104c2575f80fd5b5061040d6104d136600461253d565b610d69565b3480156104e1575f80fd5b506103776104f0366004612554565b610dec565b348015610500575f80fd5b506103e060115481565b348015610515575f80fd5b5060405160128152602001610383565b348015610530575f80fd5b506103e060155481565b348015610545575f80fd5b5061040d610554366004612592565b610e0f565b348015610564575f80fd5b50610377610573366004612381565b610e71565b348015610583575f80fd5b506103e0600c5481565b348015610598575f80fd5b5061040d6105a736600461253d565b610eaf565b3480156105b7575f80fd5b506103e060125481565b3480156105cc575f80fd5b5060095461044d906001600160a01b031681565b3480156105eb575f80fd5b506013546103779060ff1681565b348015610604575f80fd5b506103e0600d5481565b348015610619575f80fd5b50610377610628366004612366565b6001600160a01b03165f908152600f602052604090205460ff1690565b348015610650575f80fd5b5061040d61065f3660046125cc565b610eb9565b34801561066f575f80fd5b506103e061067e366004612366565b6001600160a01b03165f9081526020819052604090205490565b3480156106a3575f80fd5b5061040d610f7e565b3480156106b7575f80fd5b506103776106c6366004612366565b60176020525f908152604090205460ff1681565b3480156106e5575f80fd5b5061040d610f91565b3480156106f9575f80fd5b5060065461044d906001600160a01b031681565b348015610718575f80fd5b5061040d610727366004612592565b610fa8565b348015610737575f80fd5b5061040d610746366004612381565b61104e565b348015610756575f80fd5b506103776107653660046125ec565b611063565b348015610775575f80fd5b5061040d610784366004612366565b6110cf565b348015610794575f80fd5b506103e060145481565b3480156107a9575f80fd5b506005546001600160a01b031661044d565b3480156107c6575f80fd5b506103a06111a7565b3480156107da575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000000081565b34801561080d575f80fd5b5061040d61081c366004612630565b6111b6565b34801561082c575f80fd5b5061040d61083b36600461253d565b61124c565b34801561084b575f80fd5b506103e060075481565b348015610860575f80fd5b5061040d61086f366004612630565b611259565b34801561087f575f80fd5b5061037761088e366004612381565b61128b565b34801561089e575f80fd5b506103776108ad366004612381565b61131c565b3480156108bd575f80fd5b506103776108cc366004612366565b60166020525f908152604090205460ff1681565b3480156108eb575f80fd5b5061040d6108fa36600461253d565b611329565b34801561090a575f80fd5b50610377610919366004612366565b60106020525f908152604090205460ff1681565b348015610938575f80fd5b5061040d611341565b34801561094c575f80fd5b506103e061095b3660046125ec565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610990575f80fd5b506103e0600a5481565b3480156109a5575f80fd5b5061040d6109b4366004612366565b611358565b3480156109c4575f80fd5b506018546103779060ff1681565b3480156109dd575f80fd5b5061040d6109ec36600461253d565b6113f7565b3480156109fc575f80fd5b5061040d610a0b366004612366565b611404565b348015610a1b575f80fd5b506103e0600e5481565b348015610a30575f80fd5b5061040d61147a565b606060038054610a489061265c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a749061265c565b8015610abf5780601f10610a9657610100808354040283529160200191610abf565b820191905f5260205f20905b815481529060010190602001808311610aa257829003601f168201915b5050505050905090565b610ad16114e8565b306001600160a01b03821603610b125760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064015b60405180910390fd5b6001600160a01b038116610b4d5760405133904780156108fc02915f818181858888f19350505050158015610b49573d5f803e3d5ffd5b5050565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612694565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2891906126ab565b5050505b50565b5f33610c3c818585611542565b60019150505b92915050565b610c506114e8565b6001600160a01b0381165f908152600f602052604090205460ff16610c9b5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610b09565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610cc36114e8565b8051825114610d145760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d6174636800000000000000000000000000000000006044820152606401610b09565b5f5b8251811015610d6457610d5c33848381518110610d3557610d356126c6565b6020026020010151848481518110610d4f57610d4f6126c6565b6020026020010151611665565b600101610d16565b505050565b610d716114e8565b60018111610dab5760405162461bcd60e51b8152602060048201526007602482015266746f6f206c6f7760c81b6044820152606401610b09565b600a811115610de75760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401610b09565b600755565b5f33610df9858285611add565b610e04858585611665565b506001949350505050565b610e176114e8565b5f5b8151811015610b49575f60175f848481518110610e3857610e386126c6565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610e19565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190610c3c9082908690610eaa9087906126ee565b611542565b610c2c3382611b67565b610ec16114e8565b6008821115610efc5760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b09565b6008811115610f375760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b09565b6011829055601281905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b610f866114e8565b610f8f5f611c97565b565b610f996114e8565b6013805460ff19166001179055565b610fb06114e8565b60185460ff1615610ff35760405162461bcd60e51b815260206004820152600d60248201526c189b081a5cc81cdd1bdc1c1959609a1b6044820152606401610b09565b5f5b8151811015610b4957600160175f848481518110611015576110156126c6565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610ff5565b611059823383611add565b610b498282611b67565b5f6110766005546001600160a01b031690565b6001600160a01b0316836001600160a01b031614806110a257506005546001600160a01b038381169116145b806110b557506001600160a01b03831630145b806110c857506001600160a01b03821630145b9392505050565b6110d76114e8565b6006546001600160a01b03908116908216036111465760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610b09565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200160405180910390a150565b606060048054610a489061265c565b6111be6114e8565b6009546001600160a01b03908116908316036112425760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b09565b610b498282611cf5565b6112546114e8565b601555565b6112616114e8565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091908381101561130f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b09565b610e048286868403611542565b5f33610c3c818585611665565b6113316114e8565b5f811161133c575f80fd5b600a55565b6113496114e8565b6018805460ff19166001179055565b6113606114e8565b6001600160a01b0381165f908152600f602052604090205460ff16156113ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610b09565b6001600160a01b0381165f818152600f6020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6113ff6114e8565b601455565b61140c6114e8565b6001600160a01b0381166114715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b09565b610c2c81611c97565b6114826114e8565b600b5460ff16156114d55760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720697320616c7265616479206f70656e2100000000000000006044820152606401610b09565b600b805460ff1916600117905543600c55565b6005546001600160a01b03163314610f8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b09565b6001600160a01b0383166115a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b09565b6001600160a01b0382166116055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b09565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116c95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b09565b6001600160a01b03821661172b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b09565b600954600160a01b900460ff1661174757611747838383611ddd565b6001600160a01b0383165f9081526016602052604090205460ff1615801561178757506001600160a01b0382165f9081526016602052604090205460ff16155b1561185757600b5460ff166117de5760405162461bcd60e51b815260206004820152601160248201527f5472616465206973206e6f74206f70656e0000000000000000000000000000006044820152606401610b09565b43600e54600c546117ef91906126ee565b111561185757326001600160a01b038316148061182357506001600160a01b0382165f9081526010602052604090205460ff165b6118575760405162461bcd60e51b81526020600482015260056024820152646561726c7960d81b6044820152606401610b09565b601254601154600d54600c54439161186e916126ee565b11156118ba57507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b825f036118c8575050505050565b6009546001600160a01b0386165f908152600f602052604090205460ff600160a01b90920482161591168061191457506001600160a01b0385165f908152600f602052604090205460ff165b1561191c57505f5b305f9081526020819052604081205490505f600a54821015801561193f57505f82115b801561196357506001600160a01b0388165f9081526010602052604090205460ff16155b801561196c5750825b90508080156119855750600954600160a01b900460ff16155b15611a0c576009805460ff60a01b198116600160a01b179091556001600160a01b03165f908152602081905260409020546007546064906119c69083612701565b6119d09190612718565b8311156119f4576064600754826119e79190612701565b6119f19190612718565b92505b6119fd83611ea1565b506009805460ff60a01b191690555b828015611a2657506009546001600160a01b038881169116145b8015611a3157505f84115b15611a6c575f6064611a438689612701565b611a4d9190612718565b9050611a598188612737565b9650611a66893083612026565b50611ac8565b828015611a8657506009546001600160a01b038981169116145b8015611a9157505f85115b15611ac8575f6064611aa38789612701565b611aad9190612718565b9050611ab98188612737565b9650611ac6893083612026565b505b611ad3888888612026565b5050505050505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610c285781811015611b5a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b09565b610c288484848403611542565b6001600160a01b038216611bc75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b09565b6001600160a01b0382165f9081526020819052604090205481811015611c3a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b09565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503611d8a5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b09565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60135460ff16610d64576001600160a01b0383165f9081526017602052604090205460ff16158015611e2757506001600160a01b0382165f9081526017602052604090205460ff16155b611e595760405162461bcd60e51b8152602060048201526003602482015262189b1960ea1b6044820152606401610b09565b611e638383611063565b158015611e8857506001600160a01b0382165f9081526016602052604090205460ff16155b15610d6457611e9782826121c8565b610d64828261221a565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611ed457611ed46126c6565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4f919061274a565b81600181518110611f6257611f626126c6565b6001600160a01b03928316602091820292909201015260085460405163791ac94760e01b815291169063791ac94790611fa79085905f90869030904290600401612765565b5f604051808303815f87803b158015611fbe575f80fd5b505af1925050508015611fcf575060015b506006544790611fe8906001600160a01b0316826122ae565b60408051848152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a1505050565b6001600160a01b03831661208a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b09565b6001600160a01b0382166120ec5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b09565b6001600160a01b0383165f90815260208190526040902054818110156121635760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b09565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610c28565b601454811115610b495760405162461bcd60e51b815260206004820152601260248201527f416d6f756e742065786365656473206d617800000000000000000000000000006044820152606401610b09565b6009546001600160a01b0390811690831603612234575050565b60155481612256846001600160a01b03165f9081526020819052604090205490565b61226091906126ee565b1115610b495760405162461bcd60e51b815260206004820152601860248201527f4d617820686f6c64696e67206578636565646564206d617800000000000000006044820152606401610b09565b816001600160a01b03166108fc826040515f60405180830381858888f193505050503d805f81146122fa576040519150601f19603f3d011682016040523d82523d5f602084013e6122ff565b606091505b5050505050565b5f602080835283518060208501525f5b8181101561233257858101830151858201604001528201612316565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c2c575f80fd5b5f60208284031215612376575f80fd5b81356110c881612352565b5f8060408385031215612392575f80fd5b823561239d81612352565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123e8576123e86123ab565b604052919050565b5f67ffffffffffffffff821115612409576124096123ab565b5060051b60200190565b5f82601f830112612422575f80fd5b81356020612437612432836123f0565b6123bf565b8083825260208201915060208460051b870101935086841115612458575f80fd5b602086015b8481101561247d57803561247081612352565b835291830191830161245d565b509695505050505050565b5f8060408385031215612499575f80fd5b823567ffffffffffffffff808211156124b0575f80fd5b6124bc86838701612413565b93506020915081850135818111156124d2575f80fd5b85019050601f810186136124e4575f80fd5b80356124f2612432826123f0565b81815260059190911b82018301908381019088831115612510575f80fd5b928401925b8284101561252e57833582529284019290840190612515565b80955050505050509250929050565b5f6020828403121561254d575f80fd5b5035919050565b5f805f60608486031215612566575f80fd5b833561257181612352565b9250602084013561258181612352565b929592945050506040919091013590565b5f602082840312156125a2575f80fd5b813567ffffffffffffffff8111156125b8575f80fd5b6125c484828501612413565b949350505050565b5f80604083850312156125dd575f80fd5b50508035926020909101359150565b5f80604083850312156125fd575f80fd5b823561260881612352565b9150602083013561261881612352565b809150509250929050565b8015158114610c2c575f80fd5b5f8060408385031215612641575f80fd5b823561264c81612352565b9150602083013561261881612623565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602082840312156126a4575f80fd5b5051919050565b5f602082840312156126bb575f80fd5b81516110c881612623565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c4257610c426126da565b8082028115828204841417610c4257610c426126da565b5f8261273257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610c4257610c426126da565b5f6020828403121561275a575f80fd5b81516110c881612352565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156127b55784516001600160a01b031683529383019391830191600101612790565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122082a4674fb0568b36457e7f00d1cdf63186bacb2770e642660864ae77d271fe8864736f6c634300081800330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000f2dc06f7178e385fde976d4f8c3b8084590359b2

Deployed Bytecode

0x608060405260043610610353575f3560e01c8063751039fc116101bd578063a457c2d7116100f2578063e2f4560511610092578063ec28438a1161006d578063ec28438a146109d2578063f2fde38b146109f1578063f60ae6ab14610a10578063fb201b1d14610a25575f80fd5b8063e2f4560514610985578063e57f14e11461099a578063e7de382b146109b9575f80fd5b8063afa4f3b2116100cd578063afa4f3b2146108e0578063b62496f5146108ff578063c7214e201461092d578063dd62ed3e14610941575f80fd5b8063a457c2d714610874578063a9059cbb14610893578063ad5dff73146108b2575f80fd5b80638da5cb5b1161015d5780639a7a23d6116101385780639a7a23d6146108025780639bc7c8c0146108215780639c7d15a2146108405780639fde54f514610855575f80fd5b80638da5cb5b1461079e57806395d89b41146107bb57806396483bc2146107cf575f80fd5b806379cc67901161019857806379cc67901461072c5780638321e7401461074b578063848b86e31461076a5780638c0b5e2214610789575f80fd5b8063751039fc146106da57806375f0a874146106ee578063778325251461070d575f80fd5b8063333e6f06116102935780634a30b386116102335780636db794371161020e5780636db794371461064557806370a0823114610664578063715018a61461069857806371d8a776146106ac575f80fd5b80634a30b386146105e05780634dd0f946146105f95780634fbee1931461060e575f80fd5b80633d378b1c1161026e5780633d378b1c1461057857806342966c681461058d57806347062402146105ac57806349bd5a5e146105c1575f80fd5b8063333e6f06146105255780633381c64a1461053a5780633950935114610559575f80fd5b806316a2f82a116102fe57806320518758116102d957806320518758146104b757806323b872dd146104d65780632b14ca56146104f5578063313ce5671461050a575f80fd5b806316a2f82a1461046557806318160ddd146104845780631e89d54514610498575f80fd5b806307ebd12f1161032e57806307ebd12f146103ee578063095ea7b31461040f5780631694505e1461042e575f80fd5b8063064a59d01461035e57806306fdde031461038c578063071833a2146103ad575f80fd5b3661035a57005b5f80fd5b348015610369575f80fd5b50600b546103779060ff1681565b60405190151581526020015b60405180910390f35b348015610397575f80fd5b506103a0610a39565b6040516103839190612306565b3480156103b8575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000005a81565b604051908152602001610383565b3480156103f9575f80fd5b5061040d610408366004612366565b610ac9565b005b34801561041a575f80fd5b50610377610429366004612381565b610c2f565b348015610439575f80fd5b5060085461044d906001600160a01b031681565b6040516001600160a01b039091168152602001610383565b348015610470575f80fd5b5061040d61047f366004612366565b610c48565b34801561048f575f80fd5b506002546103e0565b3480156104a3575f80fd5b5061040d6104b2366004612488565b610cbb565b3480156104c2575f80fd5b5061040d6104d136600461253d565b610d69565b3480156104e1575f80fd5b506103776104f0366004612554565b610dec565b348015610500575f80fd5b506103e060115481565b348015610515575f80fd5b5060405160128152602001610383565b348015610530575f80fd5b506103e060155481565b348015610545575f80fd5b5061040d610554366004612592565b610e0f565b348015610564575f80fd5b50610377610573366004612381565b610e71565b348015610583575f80fd5b506103e0600c5481565b348015610598575f80fd5b5061040d6105a736600461253d565b610eaf565b3480156105b7575f80fd5b506103e060125481565b3480156105cc575f80fd5b5060095461044d906001600160a01b031681565b3480156105eb575f80fd5b506013546103779060ff1681565b348015610604575f80fd5b506103e0600d5481565b348015610619575f80fd5b50610377610628366004612366565b6001600160a01b03165f908152600f602052604090205460ff1690565b348015610650575f80fd5b5061040d61065f3660046125cc565b610eb9565b34801561066f575f80fd5b506103e061067e366004612366565b6001600160a01b03165f9081526020819052604090205490565b3480156106a3575f80fd5b5061040d610f7e565b3480156106b7575f80fd5b506103776106c6366004612366565b60176020525f908152604090205460ff1681565b3480156106e5575f80fd5b5061040d610f91565b3480156106f9575f80fd5b5060065461044d906001600160a01b031681565b348015610718575f80fd5b5061040d610727366004612592565b610fa8565b348015610737575f80fd5b5061040d610746366004612381565b61104e565b348015610756575f80fd5b506103776107653660046125ec565b611063565b348015610775575f80fd5b5061040d610784366004612366565b6110cf565b348015610794575f80fd5b506103e060145481565b3480156107a9575f80fd5b506005546001600160a01b031661044d565b3480156107c6575f80fd5b506103a06111a7565b3480156107da575f80fd5b506103e07f000000000000000000000000000000000000000000000000000000000000005a81565b34801561080d575f80fd5b5061040d61081c366004612630565b6111b6565b34801561082c575f80fd5b5061040d61083b36600461253d565b61124c565b34801561084b575f80fd5b506103e060075481565b348015610860575f80fd5b5061040d61086f366004612630565b611259565b34801561087f575f80fd5b5061037761088e366004612381565b61128b565b34801561089e575f80fd5b506103776108ad366004612381565b61131c565b3480156108bd575f80fd5b506103776108cc366004612366565b60166020525f908152604090205460ff1681565b3480156108eb575f80fd5b5061040d6108fa36600461253d565b611329565b34801561090a575f80fd5b50610377610919366004612366565b60106020525f908152604090205460ff1681565b348015610938575f80fd5b5061040d611341565b34801561094c575f80fd5b506103e061095b3660046125ec565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610990575f80fd5b506103e0600a5481565b3480156109a5575f80fd5b5061040d6109b4366004612366565b611358565b3480156109c4575f80fd5b506018546103779060ff1681565b3480156109dd575f80fd5b5061040d6109ec36600461253d565b6113f7565b3480156109fc575f80fd5b5061040d610a0b366004612366565b611404565b348015610a1b575f80fd5b506103e0600e5481565b348015610a30575f80fd5b5061040d61147a565b606060038054610a489061265c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a749061265c565b8015610abf5780601f10610a9657610100808354040283529160200191610abf565b820191905f5260205f20905b815481529060010190602001808311610aa257829003601f168201915b5050505050905090565b610ad16114e8565b306001600160a01b03821603610b125760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064015b60405180910390fd5b6001600160a01b038116610b4d5760405133904780156108fc02915f818181858888f19350505050158015610b49573d5f803e3d5ffd5b5050565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612694565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2891906126ab565b5050505b50565b5f33610c3c818585611542565b60019150505b92915050565b610c506114e8565b6001600160a01b0381165f908152600f602052604090205460ff16610c9b5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610b09565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610cc36114e8565b8051825114610d145760405162461bcd60e51b815260206004820152600f60248201527f6c656e677468206d69736d6174636800000000000000000000000000000000006044820152606401610b09565b5f5b8251811015610d6457610d5c33848381518110610d3557610d356126c6565b6020026020010151848481518110610d4f57610d4f6126c6565b6020026020010151611665565b600101610d16565b505050565b610d716114e8565b60018111610dab5760405162461bcd60e51b8152602060048201526007602482015266746f6f206c6f7760c81b6044820152606401610b09565b600a811115610de75760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401610b09565b600755565b5f33610df9858285611add565b610e04858585611665565b506001949350505050565b610e176114e8565b5f5b8151811015610b49575f60175f848481518110610e3857610e386126c6565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610e19565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190610c3c9082908690610eaa9087906126ee565b611542565b610c2c3382611b67565b610ec16114e8565b6008821115610efc5760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b09565b6008811115610f375760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b09565b6011829055601281905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b610f866114e8565b610f8f5f611c97565b565b610f996114e8565b6013805460ff19166001179055565b610fb06114e8565b60185460ff1615610ff35760405162461bcd60e51b815260206004820152600d60248201526c189b081a5cc81cdd1bdc1c1959609a1b6044820152606401610b09565b5f5b8151811015610b4957600160175f848481518110611015576110156126c6565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610ff5565b611059823383611add565b610b498282611b67565b5f6110766005546001600160a01b031690565b6001600160a01b0316836001600160a01b031614806110a257506005546001600160a01b038381169116145b806110b557506001600160a01b03831630145b806110c857506001600160a01b03821630145b9392505050565b6110d76114e8565b6006546001600160a01b03908116908216036111465760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610b09565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200160405180910390a150565b606060048054610a489061265c565b6111be6114e8565b6009546001600160a01b03908116908316036112425760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b09565b610b498282611cf5565b6112546114e8565b601555565b6112616114e8565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091908381101561130f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b09565b610e048286868403611542565b5f33610c3c818585611665565b6113316114e8565b5f811161133c575f80fd5b600a55565b6113496114e8565b6018805460ff19166001179055565b6113606114e8565b6001600160a01b0381165f908152600f602052604090205460ff16156113ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610b09565b6001600160a01b0381165f818152600f6020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6113ff6114e8565b601455565b61140c6114e8565b6001600160a01b0381166114715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b09565b610c2c81611c97565b6114826114e8565b600b5460ff16156114d55760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720697320616c7265616479206f70656e2100000000000000006044820152606401610b09565b600b805460ff1916600117905543600c55565b6005546001600160a01b03163314610f8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b09565b6001600160a01b0383166115a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b09565b6001600160a01b0382166116055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b09565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116c95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b09565b6001600160a01b03821661172b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b09565b600954600160a01b900460ff1661174757611747838383611ddd565b6001600160a01b0383165f9081526016602052604090205460ff1615801561178757506001600160a01b0382165f9081526016602052604090205460ff16155b1561185757600b5460ff166117de5760405162461bcd60e51b815260206004820152601160248201527f5472616465206973206e6f74206f70656e0000000000000000000000000000006044820152606401610b09565b43600e54600c546117ef91906126ee565b111561185757326001600160a01b038316148061182357506001600160a01b0382165f9081526010602052604090205460ff165b6118575760405162461bcd60e51b81526020600482015260056024820152646561726c7960d81b6044820152606401610b09565b601254601154600d54600c54439161186e916126ee565b11156118ba57507f000000000000000000000000000000000000000000000000000000000000005a90507f000000000000000000000000000000000000000000000000000000000000005a5b825f036118c8575050505050565b6009546001600160a01b0386165f908152600f602052604090205460ff600160a01b90920482161591168061191457506001600160a01b0385165f908152600f602052604090205460ff165b1561191c57505f5b305f9081526020819052604081205490505f600a54821015801561193f57505f82115b801561196357506001600160a01b0388165f9081526010602052604090205460ff16155b801561196c5750825b90508080156119855750600954600160a01b900460ff16155b15611a0c576009805460ff60a01b198116600160a01b179091556001600160a01b03165f908152602081905260409020546007546064906119c69083612701565b6119d09190612718565b8311156119f4576064600754826119e79190612701565b6119f19190612718565b92505b6119fd83611ea1565b506009805460ff60a01b191690555b828015611a2657506009546001600160a01b038881169116145b8015611a3157505f84115b15611a6c575f6064611a438689612701565b611a4d9190612718565b9050611a598188612737565b9650611a66893083612026565b50611ac8565b828015611a8657506009546001600160a01b038981169116145b8015611a9157505f85115b15611ac8575f6064611aa38789612701565b611aad9190612718565b9050611ab98188612737565b9650611ac6893083612026565b505b611ad3888888612026565b5050505050505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610c285781811015611b5a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b09565b610c288484848403611542565b6001600160a01b038216611bc75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b09565b6001600160a01b0382165f9081526020819052604090205481811015611c3a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b09565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503611d8a5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b09565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60135460ff16610d64576001600160a01b0383165f9081526017602052604090205460ff16158015611e2757506001600160a01b0382165f9081526017602052604090205460ff16155b611e595760405162461bcd60e51b8152602060048201526003602482015262189b1960ea1b6044820152606401610b09565b611e638383611063565b158015611e8857506001600160a01b0382165f9081526016602052604090205460ff16155b15610d6457611e9782826121c8565b610d64828261221a565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611ed457611ed46126c6565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4f919061274a565b81600181518110611f6257611f626126c6565b6001600160a01b03928316602091820292909201015260085460405163791ac94760e01b815291169063791ac94790611fa79085905f90869030904290600401612765565b5f604051808303815f87803b158015611fbe575f80fd5b505af1925050508015611fcf575060015b506006544790611fe8906001600160a01b0316826122ae565b60408051848152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a1505050565b6001600160a01b03831661208a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b09565b6001600160a01b0382166120ec5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b09565b6001600160a01b0383165f90815260208190526040902054818110156121635760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b09565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610c28565b601454811115610b495760405162461bcd60e51b815260206004820152601260248201527f416d6f756e742065786365656473206d617800000000000000000000000000006044820152606401610b09565b6009546001600160a01b0390811690831603612234575050565b60155481612256846001600160a01b03165f9081526020819052604090205490565b61226091906126ee565b1115610b495760405162461bcd60e51b815260206004820152601860248201527f4d617820686f6c64696e67206578636565646564206d617800000000000000006044820152606401610b09565b816001600160a01b03166108fc826040515f60405180830381858888f193505050503d805f81146122fa576040519150601f19603f3d011682016040523d82523d5f602084013e6122ff565b606091505b5050505050565b5f602080835283518060208501525f5b8181101561233257858101830151858201604001528201612316565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c2c575f80fd5b5f60208284031215612376575f80fd5b81356110c881612352565b5f8060408385031215612392575f80fd5b823561239d81612352565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123e8576123e86123ab565b604052919050565b5f67ffffffffffffffff821115612409576124096123ab565b5060051b60200190565b5f82601f830112612422575f80fd5b81356020612437612432836123f0565b6123bf565b8083825260208201915060208460051b870101935086841115612458575f80fd5b602086015b8481101561247d57803561247081612352565b835291830191830161245d565b509695505050505050565b5f8060408385031215612499575f80fd5b823567ffffffffffffffff808211156124b0575f80fd5b6124bc86838701612413565b93506020915081850135818111156124d2575f80fd5b85019050601f810186136124e4575f80fd5b80356124f2612432826123f0565b81815260059190911b82018301908381019088831115612510575f80fd5b928401925b8284101561252e57833582529284019290840190612515565b80955050505050509250929050565b5f6020828403121561254d575f80fd5b5035919050565b5f805f60608486031215612566575f80fd5b833561257181612352565b9250602084013561258181612352565b929592945050506040919091013590565b5f602082840312156125a2575f80fd5b813567ffffffffffffffff8111156125b8575f80fd5b6125c484828501612413565b949350505050565b5f80604083850312156125dd575f80fd5b50508035926020909101359150565b5f80604083850312156125fd575f80fd5b823561260881612352565b9150602083013561261881612352565b809150509250929050565b8015158114610c2c575f80fd5b5f8060408385031215612641575f80fd5b823561264c81612352565b9150602083013561261881612623565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602082840312156126a4575f80fd5b5051919050565b5f602082840312156126bb575f80fd5b81516110c881612623565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c4257610c426126da565b8082028115828204841417610c4257610c426126da565b5f8261273257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610c4257610c426126da565b5f6020828403121561275a575f80fd5b81516110c881612352565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156127b55784516001600160a01b031683529383019391830191600101612790565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122082a4674fb0568b36457e7f00d1cdf63186bacb2770e642660864ae77d271fe8864736f6c63430008180033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000f2dc06f7178e385fde976d4f8c3b8084590359b2

-----Decoded View---------------
Arg [0] : router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : operator (address): 0xF2Dc06F7178e385fdE976d4F8c3b8084590359B2

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


Deployed Bytecode Sourcemap

29699:10701:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30213:28;;;;;;;;;;-1:-1:-1;30213:28:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;30213:28:0;;;;;;;;8638:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30944:40::-;;;;;;;;;;;;;;;;;;905:25:1;;;893:2;878:18;30944:40:0;759:177:1;32775:407:0;;;;;;;;;;-1:-1:-1;32775:407:0;;;;;:::i;:::-;;:::i;:::-;;11005:201;;;;;;;;;;-1:-1:-1;11005:201:0;;;;;:::i;:::-;;:::i;29893:41::-;;;;;;;;;;-1:-1:-1;29893:41:0;;;;-1:-1:-1;;;;;29893:41:0;;;;;;-1:-1:-1;;;;;1863:55:1;;;1845:74;;1833:2;1818:18;29893:41:0;1672:253:1;34141:167:0;;;;;;;;;;-1:-1:-1;34141:167:0;;;;;:::i;:::-;;:::i;9770:108::-;;;;;;;;;;-1:-1:-1;9858:12:0;;9770:108;;40117:280;;;;;;;;;;-1:-1:-1;40117:280:0;;;;;:::i;:::-;;:::i;37937:205::-;;;;;;;;;;-1:-1:-1;37937:205:0;;;;;:::i;:::-;;:::i;11787:261::-;;;;;;;;;;-1:-1:-1;11787:261:0;;;;;:::i;:::-;;:::i;30991:22::-;;;;;;;;;;;;;;;;9611:93;;;;;;;;;;-1:-1:-1;9611:93:0;;9694:2;5209:36:1;;5197:2;5182:18;9611:93:0;5067:184:1;31122:25:0;;;;;;;;;;;;;;;;39212:179;;;;;;;;;;-1:-1:-1;39212:179:0;;;;;:::i;:::-;;:::i;12458:238::-;;;;;;;;;;-1:-1:-1;12458:238:0;;;;;:::i;:::-;;:::i;30248:29::-;;;;;;;;;;;;;;;;19785:91;;;;;;;;;;-1:-1:-1;19785:91:0;;;;;:::i;:::-;;:::i;31020:21::-;;;;;;;;;;;;;;;;29941:29;;;;;;;;;;-1:-1:-1;29941:29:0;;;;-1:-1:-1;;;;;29941:29:0;;;31057:25;;;;;;;;;;-1:-1:-1;31057:25:0;;;;;;;;30284;;;;;;;;;;;;;;;;34317:126;;;;;;;;;;-1:-1:-1;34317:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;34407:28:0;34383:4;34407:28;;;:19;:28;;;;;;;;;34317:126;34452:272;;;;;;;;;;-1:-1:-1;34452:272:0;;;;;:::i;:::-;;:::i;9942:127::-;;;;;;;;;;-1:-1:-1;9942:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10043:18:0;10016:7;10043:18;;;;;;;;;;;;9942:127;2551:103;;;;;;;;;;;;;:::i;31204:35::-;;;;;;;;;;-1:-1:-1;31204:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39680:82;;;;;;;;;;;;;:::i;29814:30::-;;;;;;;;;;-1:-1:-1;29814:30:0;;;;-1:-1:-1;;;;;29814:30:0;;;38981:222;;;;;;;;;;-1:-1:-1;38981:222:0;;;;;:::i;:::-;;:::i;20196:164::-;;;;;;;;;;-1:-1:-1;20196:164:0;;;;;:::i;:::-;;:::i;39483:188::-;;;;;;;;;;-1:-1:-1;39483:188:0;;;;;:::i;:::-;;:::i;34733:274::-;;;;;;;;;;-1:-1:-1;34733:274:0;;;;;:::i;:::-;;:::i;31089:26::-;;;;;;;;;;;;;;;;1908:87;;;;;;;;;;-1:-1:-1;1981:6:0;;-1:-1:-1;;;;;1981:6:0;1908:87;;8858:104;;;;;;;;;;;;;:::i;30896:41::-;;;;;;;;;;;;;;;33342:245;;;;;;;;;;-1:-1:-1;33342:245:0;;;;;:::i;:::-;;:::i;39890:106::-;;;;;;;;;;-1:-1:-1;39890:106:0;;;;;:::i;:::-;;:::i;29851:35::-;;;;;;;;;;;;;;;;40005:103;;;;;;;;;;-1:-1:-1;40005:103:0;;;;;:::i;:::-;;:::i;13200:437::-;;;;;;;;;;-1:-1:-1;13200:437:0;;;;;:::i;:::-;;:::i;10276:193::-;;;;;;;;;;-1:-1:-1;10276:193:0;;;;;:::i;:::-;;:::i;31154:40::-;;;;;;;;;;-1:-1:-1;31154:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37777:151;;;;;;;;;;-1:-1:-1;37777:151:0;;;;;:::i;:::-;;:::i;30411:57::-;;;;;;;;;;-1:-1:-1;30411:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39400:74;;;;;;;;;;;;;:::i;10533:151::-;;;;;;;;;;-1:-1:-1;10533:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;10649:18:0;;;10622:7;10649:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10533:151;30173:33;;;;;;;;;;;;;;;;33920:212;;;;;;;;;;-1:-1:-1;33920:212:0;;;;;:::i;:::-;;:::i;31246:29::-;;;;;;;;;;-1:-1:-1;31246:29:0;;;;;;;;39771:110;;;;;;;;;;-1:-1:-1;39771:110:0;;;;;:::i;:::-;;:::i;2810:201::-;;;;;;;;;;-1:-1:-1;2810:201:0;;;;;:::i;:::-;;:::i;30316:26::-;;;;;;;;;;;;;;;;32573:193;;;;;;;;;;;;;:::i;8638:100::-;8692:13;8725:5;8718:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8638:100;:::o;32775:407::-;1793:13;:11;:13::i;:::-;32868:4:::1;-1:-1:-1::0;;;;;32851:22:0;::::1;::::0;32843:36:::1;;;::::0;-1:-1:-1;;;32843:36:0;;7583:2:1;32843:36:0::1;::::0;::::1;7565:21:1::0;7622:1;7602:18;;;7595:29;-1:-1:-1;;;7640:18:1;;;7633:31;7681:18;;32843:36:0::1;;;;;;;;;-1:-1:-1::0;;;;;32894:21:0;::::1;32890:126;;32932:51;::::0;32940:10:::1;::::0;32961:21:::1;32932:51:::0;::::1;;;::::0;::::1;::::0;;;32961:21;32940:10;32932:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;32775:407:::0;:::o;32890:126::-:1;33088:35;::::0;-1:-1:-1;;;33088:35:0;;33117:4:::1;33088:35;::::0;::::1;1845:74:1::0;33053:5:0;;33026:17:::1;::::0;-1:-1:-1;;;;;33088:20:0;::::1;::::0;::::1;::::0;1818:18:1;;33088:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33134:40;::::0;-1:-1:-1;;;33134:40:0;;33154:10:::1;33134:40;::::0;::::1;8073:74:1::0;8163:18;;;8156:34;;;33070:53:0;;-1:-1:-1;;;;;;33134:19:0;::::1;::::0;::::1;::::0;8046:18:1;;33134:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32832:350;;1817:1;32775:407:::0;:::o;11005:201::-;11088:4;648:10;11144:32;648:10;11160:7;11169:6;11144:8;:32::i;:::-;11194:4;11187:11;;;11005:201;;;;;:::o;34141:167::-;1793:13;:11;:13::i;:::-;-1:-1:-1;;;;;34219:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;34211:42;;;::::0;-1:-1:-1;;;34211:42:0;;8653:2:1;34211:42:0::1;::::0;::::1;8635:21:1::0;8692:1;8672:18;;;8665:29;-1:-1:-1;;;8710:18:1;;;8703:31;8751:18;;34211:42:0::1;8451:324:1::0;34211:42:0::1;-1:-1:-1::0;;;;;34264:28:0::1;34295:5;34264:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;34264:36:0::1;::::0;;34141:167::o;40117:280::-;1793:13;:11;:13::i;:::-;40238:7:::1;:14;40225:2;:9;:27;40217:55;;;::::0;-1:-1:-1;;;40217:55:0;;8982:2:1;40217:55:0::1;::::0;::::1;8964:21:1::0;9021:2;9001:18;;;8994:30;9060:17;9040:18;;;9033:45;9095:18;;40217:55:0::1;8780:339:1::0;40217:55:0::1;40291:6;40286:104;40307:2;:9;40303:1;:13;40286:104;;;40338:40;40348:10;40360:2;40363:1;40360:5;;;;;;;;:::i;:::-;;;;;;;40367:7;40375:1;40367:10;;;;;;;;:::i;:::-;;;;;;;40338:9;:40::i;:::-;40318:3;;40286:104;;;;40117:280:::0;;:::o;37937:205::-;1793:13;:11;:13::i;:::-;38035:1:::1;38023:9;:13;38015:33;;;::::0;-1:-1:-1;;;38015:33:0;;9458:2:1;38015:33:0::1;::::0;::::1;9440:21:1::0;9497:1;9477:18;;;9470:29;-1:-1:-1;;;9515:18:1;;;9508:37;9562:18;;38015:33:0::1;9256:330:1::0;38015:33:0::1;38080:2;38067:9;:15;;38059:36;;;::::0;-1:-1:-1;;;38059:36:0;;9793:2:1;38059:36:0::1;::::0;::::1;9775:21:1::0;9832:1;9812:18;;;9805:29;-1:-1:-1;;;9850:18:1;;;9843:38;9898:18;;38059:36:0::1;9591:331:1::0;38059:36:0::1;38106:16;:28:::0;37937:205::o;11787:261::-;11884:4;648:10;11942:38;11958:4;648:10;11973:6;11942:15;:38::i;:::-;11991:27;12001:4;12007:2;12011:6;11991:9;:27::i;:::-;-1:-1:-1;12036:4:0;;11787:261;-1:-1:-1;;;;11787:261:0:o;39212:179::-;1793:13;:11;:13::i;:::-;39293:6:::1;39288:96;39309:9;:16;39305:1;:20;39288:96;;;39367:5;39347:3;:17;39351:9;39361:1;39351:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;39347:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39347:17:0;:25;;-1:-1:-1;;39347:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;39327:3:0::1;39288:96;;12458:238:::0;648:10;12546:4;10649:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;10649:27:0;;;;;;;;;;12546:4;;648:10;12602:64;;648:10;;10649:27;;12627:38;;12655:10;;12627:38;:::i;:::-;12602:8;:64::i;19785:91::-;19841:27;648:10;19861:6;19841:5;:27::i;34452:272::-;1793:13;:11;:13::i;:::-;34557:1:::1;34545:8;:13;;34537:33;;;::::0;-1:-1:-1;;;34537:33:0;;10391:2:1;34537:33:0::1;::::0;::::1;10373:21:1::0;10430:1;10410:18;;;10403:29;-1:-1:-1;;;10448:18:1;;;10441:37;10495:18;;34537:33:0::1;10189:330:1::0;34537:33:0::1;34600:1;34589:7;:12;;34581:32;;;::::0;-1:-1:-1;;;34581:32:0;;10391:2:1;34581:32:0::1;::::0;::::1;10373:21:1::0;10430:1;10410:18;;;10403:29;-1:-1:-1;;;10448:18:1;;;10441:37;10495:18;;34581:32:0::1;10189:330:1::0;34581:32:0::1;34624:7;:18:::0;;;34653:6:::1;:16:::0;;;34688:28:::1;::::0;;10698:25:1;;;10754:2;10739:18;;10732:34;;;34688:28:0::1;::::0;10671:18:1;34688:28:0::1;;;;;;;34452:272:::0;;:::o;2551:103::-;1793:13;:11;:13::i;:::-;2616:30:::1;2643:1;2616:18;:30::i;:::-;2551:103::o:0;39680:82::-;1793:13;:11;:13::i;:::-;39734::::1;:20:::0;;-1:-1:-1;;39734:20:0::1;39750:4;39734:20;::::0;;39680:82::o;38981:222::-;1793:13;:11;:13::i;:::-;39063:9:::1;::::0;::::1;;39062:10;39054:36;;;::::0;-1:-1:-1;;;39054:36:0;;10979:2:1;39054:36:0::1;::::0;::::1;10961:21:1::0;11018:2;10998:18;;;10991:30;-1:-1:-1;;;11037:18:1;;;11030:43;11090:18;;39054:36:0::1;10777:337:1::0;39054:36:0::1;39106:6;39101:95;39122:9;:16;39118:1;:20;39101:95;;;39180:4;39160:3;:17;39164:9;39174:1;39164:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;39160:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39160:17:0;:24;;-1:-1:-1;;39160:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;39140:3:0::1;39101:95;;20196:164:::0;20273:46;20289:7;648:10;20312:6;20273:15;:46::i;:::-;20330:22;20336:7;20345:6;20330:5;:22::i;39483:188::-;39548:4;39590:7;1981:6;;-1:-1:-1;;;;;1981:6:0;;1908:87;39590:7;-1:-1:-1;;;;;39582:15:0;:4;-1:-1:-1;;;;;39582:15:0;;:32;;;-1:-1:-1;1981:6:0;;-1:-1:-1;;;;;39601:13:0;;;1981:6;;39601:13;39582:32;:57;;;-1:-1:-1;;;;;;39618:21:0;;39634:4;39618:21;39582:57;:80;;;-1:-1:-1;;;;;;39643:19:0;;39657:4;39643:19;39582:80;39574:89;39483:188;-1:-1:-1;;;39483:188:0:o;34733:274::-;1793:13;:11;:13::i;:::-;34839:15:::1;::::0;-1:-1:-1;;;;;34839:15:0;;::::1;34819:35:::0;;::::1;::::0;34811:88:::1;;;::::0;-1:-1:-1;;;34811:88:0;;11321:2:1;34811:88:0::1;::::0;::::1;11303:21:1::0;11360:2;11340:18;;;11333:30;11399:34;11379:18;;;11372:62;-1:-1:-1;;;11450:18:1;;;11443:38;11498:19;;34811:88:0::1;11119:404:1::0;34811:88:0::1;34910:15;:34:::0;;-1:-1:-1;;34910:34:0::1;-1:-1:-1::0;;;;;34910:34:0;::::1;::::0;;::::1;::::0;;;34960:39:::1;::::0;1845:74:1;;;34960:39:0::1;::::0;1833:2:1;1818:18;34960:39:0::1;;;;;;;34733:274:::0;:::o;8858:104::-;8914:13;8947:7;8940:14;;;;;:::i;33342:245::-;1793:13;:11;:13::i;:::-;33449::::1;::::0;-1:-1:-1;;;;;33449:13:0;;::::1;33441:21:::0;;::::1;::::0;33433:91:::1;;;::::0;-1:-1:-1;;;33433:91:0;;11730:2:1;33433:91:0::1;::::0;::::1;11712:21:1::0;11769:2;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11879:27;11859:18;;;11852:55;11924:19;;33433:91:0::1;11528:421:1::0;33433:91:0::1;33538:41;33567:4;33573:5;33538:28;:41::i;39890:106::-:0;1793:13;:11;:13::i;:::-;39964:10:::1;:24:::0;39890:106::o;40005:103::-;1793:13;:11;:13::i;:::-;-1:-1:-1;;;;;40078:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:22;;-1:-1:-1;;40078:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40005:103::o;13200:437::-;648:10;13293:4;10649:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;10649:27:0;;;;;;;;;;13293:4;;648:10;13440:15;13420:16;:35;;13412:85;;;;-1:-1:-1;;;13412:85:0;;12156:2:1;13412:85:0;;;12138:21:1;12195:2;12175:18;;;12168:30;12234:34;12214:18;;;12207:62;-1:-1:-1;;;12285:18:1;;;12278:35;12330:19;;13412:85:0;11954:401:1;13412:85:0;13533:60;13542:5;13549:7;13577:15;13558:16;:34;13533:8;:60::i;10276:193::-;10355:4;648:10;10411:28;648:10;10428:2;10432:6;10411:9;:28::i;37777:151::-;1793:13;:11;:13::i;:::-;37877:1:::1;37865:9;:13;37857:22;;;::::0;::::1;;37890:18;:30:::0;37777:151::o;39400:74::-;1793:13;:11;:13::i;:::-;39450:9:::1;:16:::0;;-1:-1:-1;;39450:16:0::1;39462:4;39450:16;::::0;;39400:74::o;33920:212::-;1793:13;:11;:13::i;:::-;-1:-1:-1;;;;;34001:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;34000:29;33992:43;;;::::0;-1:-1:-1;;;33992:43:0;;12562:2:1;33992:43:0::1;::::0;::::1;12544:21:1::0;12601:1;12581:18;;;12574:29;-1:-1:-1;;;12619:18:1;;;12612:31;12660:18;;33992:43:0::1;12360:324:1::0;33992:43:0::1;-1:-1:-1::0;;;;;34046:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:35;;-1:-1:-1;;34046:35:0::1;34077:4;34046:35;::::0;;34100:24;::::1;::::0;34046:28;34100:24:::1;33920:212:::0;:::o;39771:110::-;1793:13;:11;:13::i;:::-;39847:11:::1;:26:::0;39771:110::o;2810:201::-;1793:13;:11;:13::i;:::-;-1:-1:-1;;;;;2899:22:0;::::1;2891:73;;;::::0;-1:-1:-1;;;2891:73:0;;12891:2:1;2891:73:0::1;::::0;::::1;12873:21:1::0;12930:2;12910:18;;;12903:30;12969:34;12949:18;;;12942:62;-1:-1:-1;;;13020:18:1;;;13013:36;13066:19;;2891:73:0::1;12689:402:1::0;2891:73:0::1;2975:28;2994:8;2975:18;:28::i;32573:193::-:0;1793:13;:11;:13::i;:::-;32630:16:::1;::::0;::::1;;:25;32622:62;;;::::0;-1:-1:-1;;;32622:62:0;;13298:2:1;32622:62:0::1;::::0;::::1;13280:21:1::0;13337:2;13317:18;;;13310:30;13376:26;13356:18;;;13349:54;13420:18;;32622:62:0::1;13096:348:1::0;32622:62:0::1;32695:16;:23:::0;;-1:-1:-1;;32695:23:0::1;32714:4;32695:23;::::0;;32746:12:::1;32729:14;:29:::0;32573:193::o;2074:132::-;1981:6;;-1:-1:-1;;;;;1981:6:0;648:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;13651:2:1;2130:68:0;;;13633:21:1;;;13670:18;;;13663:30;13729:34;13709:18;;;13702:62;13781:18;;2130:68:0;13449:356:1;16907:347:0;-1:-1:-1;;;;;17009:19:0;;17001:68;;;;-1:-1:-1;;;17001:68:0;;14012:2:1;17001:68:0;;;13994:21:1;14051:2;14031:18;;;14024:30;14090:34;14070:18;;;14063:62;-1:-1:-1;;;14141:18:1;;;14134:34;14185:19;;17001:68:0;13810:400:1;17001:68:0;-1:-1:-1;;;;;17088:21:0;;17080:68;;;;-1:-1:-1;;;17080:68:0;;14417:2:1;17080:68:0;;;14399:21:1;14456:2;14436:18;;;14429:30;14495:34;14475:18;;;14468:62;-1:-1:-1;;;14546:18:1;;;14539:32;14588:19;;17080:68:0;14215:398:1;17080:68:0;-1:-1:-1;;;;;17162:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17214:32;;905:25:1;;;17214:32:0;;878:18:1;17214:32:0;;;;;;;16907:347;;;:::o;35016:2128::-;-1:-1:-1;;;;;35148:18:0;;35140:68;;;;-1:-1:-1;;;35140:68:0;;14820:2:1;35140:68:0;;;14802:21:1;14859:2;14839:18;;;14832:30;14898:34;14878:18;;;14871:62;-1:-1:-1;;;14949:18:1;;;14942:35;14994:19;;35140:68:0;14618:401:1;35140:68:0;-1:-1:-1;;;;;35227:16:0;;35219:64;;;;-1:-1:-1;;;35219:64:0;;15226:2:1;35219:64:0;;;15208:21:1;15265:2;15245:18;;;15238:30;15304:34;15284:18;;;15277:62;-1:-1:-1;;;15355:18:1;;;15348:33;15398:19;;35219:64:0;15024:399:1;35219:64:0;35302:8;;-1:-1:-1;;;35302:8:0;;;;35297:66;;35327:24;35334:4;35340:2;35344:6;35327;:24::i;:::-;-1:-1:-1;;;;;35381:14:0;;;;;;:8;:14;;;;;;;;35380:15;:32;;;;-1:-1:-1;;;;;;35400:12:0;;;;;;:8;:12;;;;;;;;35399:13;35380:32;35376:275;;;35437:16;;;;35429:46;;;;-1:-1:-1;;;35429:46:0;;15630:2:1;35429:46:0;;;15612:21:1;15669:2;15649:18;;;15642:30;15708:19;15688:18;;;15681:47;15745:18;;35429:46:0;15428:341:1;35429:46:0;35525:12;35511:11;;35494:14;;:28;;;;:::i;:::-;:43;35490:150;;;35566:9;-1:-1:-1;;;;;35566:15:0;;;;:48;;-1:-1:-1;;;;;;35585:29:0;;;;;;:25;:29;;;;;;;;35566:48;35558:66;;;;-1:-1:-1;;;35558:66:0;;15976:2:1;35558:66:0;;;15958:21:1;16015:1;15995:18;;;15988:29;-1:-1:-1;;;16033:18:1;;;16026:35;16078:18;;35558:66:0;15774:328:1;35558:66:0;35679:6;;35712:7;;35751:10;;35734:14;;35764:12;;35734:27;;;:::i;:::-;:42;35730:142;;;-1:-1:-1;35803:15:0;;-1:-1:-1;35844:16:0;35730:142;35889:6;35899:1;35889:11;35885:50;;35917:7;;35016:2128;;;:::o;35885:50::-;35964:8;;-1:-1:-1;;;;;35990:25:0;;35948:12;35990:25;;;:19;:25;;;;;;35964:8;-1:-1:-1;;;35964:8:0;;;;;35963:9;;35990:25;;:52;;-1:-1:-1;;;;;;36019:23:0;;;;;;:19;:23;;;;;;;;35990:52;35986:100;;;-1:-1:-1;36069:5:0;35986:100;36134:4;36099:14;10043:18;;;;;;;;;;;36099:41;;36154:12;36179:18;;36169:6;:28;;:42;;;;;36210:1;36201:6;:10;36169:42;:78;;;;-1:-1:-1;;;;;;36216:31:0;;;;;;:25;:31;;;;;;;;36215:32;36169:78;:89;;;;;36251:7;36169:89;36154:104;;36273:7;:33;;;;-1:-1:-1;36298:8:0;;-1:-1:-1;;;36298:8:0;;;;36297:9;36273:33;36269:361;;;36323:8;:15;;-1:-1:-1;;;;36323:15:0;;-1:-1:-1;;;36323:15:0;;;;-1:-1:-1;;;;;36385:13:0;-1:-1:-1;10043:18:0;;;;;;;;;;;36441:16;;36460:3;;36427:30;;10043:18;36427:30;:::i;:::-;:36;;;;:::i;:::-;36418:6;:45;36414:131;;;36526:3;36507:16;;36493:11;:30;;;;:::i;:::-;:36;;;;:::i;:::-;36484:45;;36414:131;36559:28;36580:6;36559:20;:28::i;:::-;-1:-1:-1;36602:8:0;:16;;-1:-1:-1;;;;36602:16:0;;;36269:361;36647:7;:30;;;;-1:-1:-1;36664:13:0;;-1:-1:-1;;;;;36658:19:0;;;36664:13;;36658:19;36647:30;:46;;;;;36692:1;36681:8;:12;36647:46;36643:447;;;36710:12;36747:3;36726:17;36735:8;36726:6;:17;:::i;:::-;36725:25;;;;:::i;:::-;36710:40;-1:-1:-1;36774:13:0;36710:40;36774:6;:13;:::i;:::-;36765:22;;36805:42;36821:4;36835;36842;36805:15;:42::i;:::-;36695:164;36643:447;;;36878:7;:32;;;;-1:-1:-1;36897:13:0;;-1:-1:-1;;;;;36889:21:0;;;36897:13;;36889:21;36878:32;:47;;;;;36924:1;36914:7;:11;36878:47;36874:216;;;36942:12;36978:3;36958:16;36967:7;36958:6;:16;:::i;:::-;36957:24;;;;:::i;:::-;36942:39;-1:-1:-1;37005:13:0;36942:39;37005:6;:13;:::i;:::-;36996:22;;37036:42;37052:4;37066;37073;37036:15;:42::i;:::-;36927:163;36874:216;37103:33;37119:4;37125:2;37129:6;37103:15;:33::i;:::-;35129:2015;;;;;35016:2128;;;:::o;17546:419::-;-1:-1:-1;;;;;10649:18:0;;;17647:24;10649:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;17714:37:0;;17710:248;;17796:6;17776:16;:26;;17768:68;;;;-1:-1:-1;;;17768:68:0;;16837:2:1;17768:68:0;;;16819:21:1;16876:2;16856:18;;;16849:30;16915:31;16895:18;;;16888:59;16964:18;;17768:68:0;16635:353:1;17768:68:0;17880:51;17889:5;17896:7;17924:6;17905:16;:25;17880:8;:51::i;15855:613::-;-1:-1:-1;;;;;15939:21:0;;15931:67;;;;-1:-1:-1;;;15931:67:0;;17195:2:1;15931:67:0;;;17177:21:1;17234:2;17214:18;;;17207:30;17273:34;17253:18;;;17246:62;-1:-1:-1;;;17324:18:1;;;17317:31;17365:19;;15931:67:0;16993:397:1;15931:67:0;-1:-1:-1;;;;;16100:18:0;;16075:22;16100:18;;;;;;;;;;;16137:24;;;;16129:71;;;;-1:-1:-1;;;16129:71:0;;17597:2:1;16129:71:0;;;17579:21:1;17636:2;17616:18;;;17609:30;17675:34;17655:18;;;17648:62;-1:-1:-1;;;17726:18:1;;;17719:32;17768:19;;16129:71:0;17395:398:1;16129:71:0;-1:-1:-1;;;;;16236:18:0;;:9;:18;;;;;;;;;;;16257:23;;;16236:44;;16309:12;:22;;;;;;;16361:37;905:25:1;;;16236:9:0;;:18;16361:37;;878:18:1;16361:37:0;;;;;;;40286:104:::1;40117:280:::0;;:::o;3172:191::-;3265:6;;;-1:-1:-1;;;;;3282:17:0;;;-1:-1:-1;;3282:17:0;;;;;;;3315:40;;3265:6;;;3282:17;3265:6;;3315:40;;3246:16;;3315:40;3235:128;3172:191;:::o;33596:309::-;-1:-1:-1;;;;;33687:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;33679:109;;;;-1:-1:-1;;;33679:109:0;;18000:2:1;33679:109:0;;;17982:21:1;18039:2;18019:18;;;18012:30;18078:34;18058:18;;;18051:62;18149:26;18129:18;;;18122:54;18193:19;;33679:109:0;17798:420:1;33679:109:0;-1:-1:-1;;;;;33799:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;33799:39:0;;;;;;;;;;33857:40;;33799:39;;:31;33857:40;;;33596:309;;:::o;38151:421::-;38278:13;;;;38273:292;;-1:-1:-1;;;;;38317:9:0;;;;;;:3;:9;;;;;;;;38316:10;:22;;;;-1:-1:-1;;;;;;38331:7:0;;;;;;:3;:7;;;;;;;;38330:8;38316:22;38308:38;;;;-1:-1:-1;;;38308:38:0;;18425:2:1;38308:38:0;;;18407:21:1;18464:1;18444:18;;;18437:29;-1:-1:-1;;;18482:18:1;;;18475:33;18525:18;;38308:38:0;18223:326:1;38308:38:0;38383:18;38392:4;38398:2;38383:8;:18::i;:::-;38382:19;:36;;;;-1:-1:-1;;;;;;38406:12:0;;;;;;:8;:12;;;;;;;;38405:13;38382:36;38378:176;;;38439:29;38457:2;38461:6;38439:17;:29::i;:::-;38505:33;38527:2;38531:6;38505:21;:33::i;37159:609::-;37256:16;;;37270:1;37256:16;;;;;;;;37232:21;;37256:16;;;;;;;;;;-1:-1:-1;37256:16:0;37232:40;;37301:4;37283;37288:1;37283:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37283:23:0;;;:7;;;;;;;;;;:23;;;;37327:15;;:22;;;-1:-1:-1;;;37327:22:0;;;;:15;;;;;:20;;:22;;;;;37283:7;;37327:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37317:4;37322:1;37317:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37317:32:0;;;:7;;;;;;;;;:32;37367:15;;:187;;-1:-1:-1;;;37367:187:0;;:15;;;:66;;:187;;37448:11;;37367:15;;37491:4;;37518;;37538:15;;37367:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37363:222;37667:15;;37619:21;;37651:45;;-1:-1:-1;;;;;37667:15:0;37619:21;37651:7;:45::i;:::-;37715;;;10698:25:1;;;10754:2;10739:18;;10732:34;;;37715:45:0;;10671:18:1;37715:45:0;;;;;;;37218:550;;37159:609;:::o;14108:673::-;-1:-1:-1;;;;;14205:18:0;;14197:68;;;;-1:-1:-1;;;14197:68:0;;14820:2:1;14197:68:0;;;14802:21:1;14859:2;14839:18;;;14832:30;14898:34;14878:18;;;14871:62;-1:-1:-1;;;14949:18:1;;;14942:35;14994:19;;14197:68:0;14618:401:1;14197:68:0;-1:-1:-1;;;;;14284:16:0;;14276:64;;;;-1:-1:-1;;;14276:64:0;;15226:2:1;14276:64:0;;;15208:21:1;15265:2;15245:18;;;15238:30;15304:34;15284:18;;;15277:62;-1:-1:-1;;;15355:18:1;;;15348:33;15398:19;;14276:64:0;15024:399:1;14276:64:0;-1:-1:-1;;;;;14428:15:0;;14406:19;14428:15;;;;;;;;;;;14462:21;;;;14454:72;;;;-1:-1:-1;;;14454:72:0;;20043:2:1;14454:72:0;;;20025:21:1;20082:2;20062:18;;;20055:30;20121:34;20101:18;;;20094:62;-1:-1:-1;;;20172:18:1;;;20165:36;20218:19;;14454:72:0;19841:402:1;14454:72:0;-1:-1:-1;;;;;14562:15:0;;;:9;:15;;;;;;;;;;;14580:20;;;14562:38;;14643:13;;;;;;;;;;:23;;;;;;14696:26;;905:25:1;;;14643:13:0;;14696:26;;878:18:1;14696:26:0;;;;;;;14736:37;40117:280;38581:143;38679:11;;38669:6;:21;;38661:52;;;;-1:-1:-1;;;38661:52:0;;20450:2:1;38661:52:0;;;20432:21:1;20489:2;20469:18;;;20462:30;20528:20;20508:18;;;20501:48;20566:18;;38661:52:0;20248:342:1;38733:239:0;38827:13;;-1:-1:-1;;;;;38827:13:0;;;38821:19;;;;38817:58;;38733:239;;:::o;38817:58::-;38922:10;;38912:6;38896:13;38906:2;-1:-1:-1;;;;;10043:18:0;10016:7;10043:18;;;;;;;;;;;;9942:127;38896:13;:22;;;;:::i;:::-;:36;;38888:73;;;;-1:-1:-1;;;38888:73:0;;20797:2:1;38888:73:0;;;20779:21:1;20836:2;20816:18;;;20809:30;20875:26;20855:18;;;20848:54;20919:18;;38888:73:0;20595:348:1;33191:142:0;33281:9;-1:-1:-1;;;;;33281:14:0;33301:4;33314:6;33281:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33191:142;;:::o;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;941:154::-;-1:-1:-1;;;;;1020:5:1;1016:54;1009:5;1006:65;996:93;;1085:1;1082;1075:12;1100:247;1159:6;1212:2;1200:9;1191:7;1187:23;1183:32;1180:52;;;1228:1;1225;1218:12;1180:52;1267:9;1254:23;1286:31;1311:5;1286:31;:::i;1352:315::-;1420:6;1428;1481:2;1469:9;1460:7;1456:23;1452:32;1449:52;;;1497:1;1494;1487:12;1449:52;1536:9;1523:23;1555:31;1580:5;1555:31;:::i;:::-;1605:5;1657:2;1642:18;;;;1629:32;;-1:-1:-1;;;1352:315:1:o;1930:127::-;1991:10;1986:3;1982:20;1979:1;1972:31;2022:4;2019:1;2012:15;2046:4;2043:1;2036:15;2062:275;2133:2;2127:9;2198:2;2179:13;;-1:-1:-1;;2175:27:1;2163:40;;2233:18;2218:34;;2254:22;;;2215:62;2212:88;;;2280:18;;:::i;:::-;2316:2;2309:22;2062:275;;-1:-1:-1;2062:275:1:o;2342:183::-;2402:4;2435:18;2427:6;2424:30;2421:56;;;2457:18;;:::i;:::-;-1:-1:-1;2502:1:1;2498:14;2514:4;2494:25;;2342:183::o;2530:743::-;2584:5;2637:3;2630:4;2622:6;2618:17;2614:27;2604:55;;2655:1;2652;2645:12;2604:55;2691:6;2678:20;2717:4;2741:60;2757:43;2797:2;2757:43;:::i;:::-;2741:60;:::i;:::-;2823:3;2847:2;2842:3;2835:15;2875:4;2870:3;2866:14;2859:21;;2932:4;2926:2;2923:1;2919:10;2911:6;2907:23;2903:34;2889:48;;2960:3;2952:6;2949:15;2946:35;;;2977:1;2974;2967:12;2946:35;3013:4;3005:6;3001:17;3027:217;3043:6;3038:3;3035:15;3027:217;;;3123:3;3110:17;3140:31;3165:5;3140:31;:::i;:::-;3184:18;;3222:12;;;;3060;;3027:217;;;-1:-1:-1;3262:5:1;2530:743;-1:-1:-1;;;;;;2530:743:1:o;3278:1138::-;3396:6;3404;3457:2;3445:9;3436:7;3432:23;3428:32;3425:52;;;3473:1;3470;3463:12;3425:52;3513:9;3500:23;3542:18;3583:2;3575:6;3572:14;3569:34;;;3599:1;3596;3589:12;3569:34;3622:61;3675:7;3666:6;3655:9;3651:22;3622:61;:::i;:::-;3612:71;;3702:2;3692:12;;3757:2;3746:9;3742:18;3729:32;3786:2;3776:8;3773:16;3770:36;;;3802:1;3799;3792:12;3770:36;3825:24;;;-1:-1:-1;3880:4:1;3872:13;;3868:27;-1:-1:-1;3858:55:1;;3909:1;3906;3899:12;3858:55;3945:2;3932:16;3968:60;3984:43;4024:2;3984:43;:::i;3968:60::-;4062:15;;;4144:1;4140:10;;;;4132:19;;4128:28;;;4093:12;;;;4168:19;;;4165:39;;;4200:1;4197;4190:12;4165:39;4224:11;;;;4244:142;4260:6;4255:3;4252:15;4244:142;;;4326:17;;4314:30;;4277:12;;;;4364;;;;4244:142;;;4405:5;4395:15;;;;;;;3278:1138;;;;;:::o;4421:180::-;4480:6;4533:2;4521:9;4512:7;4508:23;4504:32;4501:52;;;4549:1;4546;4539:12;4501:52;-1:-1:-1;4572:23:1;;4421:180;-1:-1:-1;4421:180:1:o;4606:456::-;4683:6;4691;4699;4752:2;4740:9;4731:7;4727:23;4723:32;4720:52;;;4768:1;4765;4758:12;4720:52;4807:9;4794:23;4826:31;4851:5;4826:31;:::i;:::-;4876:5;-1:-1:-1;4933:2:1;4918:18;;4905:32;4946:33;4905:32;4946:33;:::i;:::-;4606:456;;4998:7;;-1:-1:-1;;;5052:2:1;5037:18;;;;5024:32;;4606:456::o;5256:348::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:52;;;5409:1;5406;5399:12;5361:52;5449:9;5436:23;5482:18;5474:6;5471:30;5468:50;;;5514:1;5511;5504:12;5468:50;5537:61;5590:7;5581:6;5570:9;5566:22;5537:61;:::i;:::-;5527:71;5256:348;-1:-1:-1;;;;5256:348:1:o;5840:248::-;5908:6;5916;5969:2;5957:9;5948:7;5944:23;5940:32;5937:52;;;5985:1;5982;5975:12;5937:52;-1:-1:-1;;6008:23:1;;;6078:2;6063:18;;;6050:32;;-1:-1:-1;5840:248:1:o;6093:388::-;6161:6;6169;6222:2;6210:9;6201:7;6197:23;6193:32;6190:52;;;6238:1;6235;6228:12;6190:52;6277:9;6264:23;6296:31;6321:5;6296:31;:::i;:::-;6346:5;-1:-1:-1;6403:2:1;6388:18;;6375:32;6416:33;6375:32;6416:33;:::i;:::-;6468:7;6458:17;;;6093:388;;;;;:::o;6486:118::-;6572:5;6565:13;6558:21;6551:5;6548:32;6538:60;;6594:1;6591;6584:12;6609:382;6674:6;6682;6735:2;6723:9;6714:7;6710:23;6706:32;6703:52;;;6751:1;6748;6741:12;6703:52;6790:9;6777:23;6809:31;6834:5;6809:31;:::i;:::-;6859:5;-1:-1:-1;6916:2:1;6901:18;;6888:32;6929:30;6888:32;6929:30;:::i;6996:380::-;7075:1;7071:12;;;;7118;;;7139:61;;7193:4;7185:6;7181:17;7171:27;;7139:61;7246:2;7238:6;7235:14;7215:18;7212:38;7209:161;;7292:10;7287:3;7283:20;7280:1;7273:31;7327:4;7324:1;7317:15;7355:4;7352:1;7345:15;7209:161;;6996:380;;;:::o;7710:184::-;7780:6;7833:2;7821:9;7812:7;7808:23;7804:32;7801:52;;;7849:1;7846;7839:12;7801:52;-1:-1:-1;7872:16:1;;7710:184;-1:-1:-1;7710:184:1:o;8201:245::-;8268:6;8321:2;8309:9;8300:7;8296:23;8292:32;8289:52;;;8337:1;8334;8327:12;8289:52;8369:9;8363:16;8388:28;8410:5;8388:28;:::i;9124:127::-;9185:10;9180:3;9176:20;9173:1;9166:31;9216:4;9213:1;9206:15;9240:4;9237:1;9230:15;9927:127;9988:10;9983:3;9979:20;9976:1;9969:31;10019:4;10016:1;10009:15;10043:4;10040:1;10033:15;10059:125;10124:9;;;10145:10;;;10142:36;;;10158:18;;:::i;16107:168::-;16180:9;;;16211;;16228:15;;;16222:22;;16208:37;16198:71;;16249:18;;:::i;16280:217::-;16320:1;16346;16336:132;;16390:10;16385:3;16381:20;16378:1;16371:31;16425:4;16422:1;16415:15;16453:4;16450:1;16443:15;16336:132;-1:-1:-1;16482:9:1;;16280:217::o;16502:128::-;16569:9;;;16590:11;;;16587:37;;;16604:18;;:::i;18554:251::-;18624:6;18677:2;18665:9;18656:7;18652:23;18648:32;18645:52;;;18693:1;18690;18683:12;18645:52;18725:9;18719:16;18744:31;18769:5;18744:31;:::i;18810:1026::-;19072:4;19120:3;19109:9;19105:19;19151:6;19140:9;19133:25;19177:2;19215:6;19210:2;19199:9;19195:18;19188:34;19258:3;19253:2;19242:9;19238:18;19231:31;19282:6;19317;19311:13;19348:6;19340;19333:22;19386:3;19375:9;19371:19;19364:26;;19425:2;19417:6;19413:15;19399:29;;19446:1;19456:218;19470:6;19467:1;19464:13;19456:218;;;19535:13;;-1:-1:-1;;;;;19531:62:1;19519:75;;19649:15;;;;19614:12;;;;19492:1;19485:9;19456:218;;;-1:-1:-1;;;;;;;19730:55:1;;;;19725:2;19710:18;;19703:83;-1:-1:-1;;;19817:3:1;19802:19;19795:35;19691:3;18810:1026;-1:-1:-1;;;18810:1026:1:o

Swarm Source

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