ETH Price: $2,625.99 (-1.68%)
Gas: 1 Gwei

Token

EverBurn (EVERBURN)
 

Overview

Max Total Supply

1,000,000,000 EVERBURN

Holders

130

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000213347324 EVERBURN

Value
$0.00
0xc5c191652d16b2353d506955db3785d8cbf79d81
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EverBurn

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-28
*/

/**
"Some men just want to watch the world burn... or burn $EVERMOON." - Alfred Pennyworth

Telegram https://t.me/EVERBURNERC
Twitter https://twitter.com/EverBurnErc/
Website https://everburnerc.com
Medium https://medium.com/@EverBurn
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
pragma experimental ABIEncoderV2;

////// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

/* 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;
    }
}

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

/**
 * @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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

/**
 * @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);
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

/**
 * @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://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }


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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be 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 {}
}

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

    function WETH() external pure returns (address);

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

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

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

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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);
    address public evermoon = address(0x4ad434b8CDC3AA5AC97932D6BD18b5d313aB0f6f);

    bool private swapping;

    address public marketingWallet;

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

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

    uint256 public buyTotalFees;
    uint256 public buyBurnFee;
    uint256 public buyEvermoonBurnFee;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellBurnFee;
    uint256 public sellEvermoonBurnFee;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForBurn;
    uint256 public tokensForEvermoonBurn;
    uint256 public tokensForLiquidity;
    uint256 public tokensForMarketing;

    uint256 public evermoonSlippage;
    bool public evermoonBurnEnabled;
    uint256 public evermoonBurntAmount;

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

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


    event ExcludeFromFees(address indexed account, bool isExcluded);

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

    constructor() ERC20("EverBurn", "EVERBURN") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

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

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

        uint256 _buyBurnFee = 0;
        uint256 _buyEvermoonBurnFee = 0;
        uint256 _buyMarketingFee = 30;
        uint256 _buyLiquidityFee = 0;

        uint256 _sellBurnFee = 0;
        uint256 _sellEvermoonBurnFee = 0;
        uint256 _sellMarketingFee = 35;
        uint256 _sellLiquidityFee = 0;

        uint256 totalSupply = 1_000_000_000 * 1e18;

        maxTransactionAmount =  totalSupply * 2 / 100; // 2% from total supply maxTransactionAmountTxn
        maxWallet = totalSupply * 2 / 100; // 2% from total supply maxWallet
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        buyBurnFee = _buyBurnFee;
        buyEvermoonBurnFee = _buyEvermoonBurnFee;
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTotalFees = buyBurnFee + buyEvermoonBurnFee + buyMarketingFee + buyLiquidityFee;

        sellBurnFee = _sellBurnFee;
        sellEvermoonBurnFee = _sellEvermoonBurnFee;
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTotalFees = sellBurnFee + sellEvermoonBurnFee + sellMarketingFee + sellLiquidityFee;

        evermoonSlippage = 9500;
        evermoonBurnEnabled = true;

        marketingWallet = address(0xeD48ffcE8Ac3F333bFb0077A0CF4A8414DF27f5D); // set as marketing wallet

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

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

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

    receive() external payable {}

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

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

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

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

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

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

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

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function disableSwapEnabled() external {
        require(_msgSender() == marketingWallet, "Unauthorized call, only marketing address can call this function.");
        swapEnabled = false;
    }

    function setEvermoonSlippage(uint256 _slippage) external onlyOwner {
        require(evermoonSlippage <= 10000, "Slippage cannot be higher than 100%.");
        evermoonSlippage = _slippage;
    }

    // disable Evermoon Burn (emergency use only)
    function updateEvermoonBurnEnabled(bool enabled) external {
        require(_msgSender() == marketingWallet, "Unauthorized call, only marketing address can call this function.");
        evermoonBurnEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _burnFee,
        uint256 _evermoonBurnFee,
        uint256 _marketingFee,
        uint256 _liquidityFee
    ) external onlyOwner {
        buyBurnFee = _burnFee;
        buyEvermoonBurnFee = _evermoonBurnFee;
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyBurnFee + buyEvermoonBurnFee + buyMarketingFee + buyLiquidityFee;
        require(buyTotalFees <= 20, "Buy fees cannot be higher than 20%.");
    }

    function updateSellFees(
        uint256 _burnFee,
        uint256 _evermoonBurnFee,
        uint256 _marketingFee,
        uint256 _liquidityFee
    ) external onlyOwner {
        sellBurnFee = _burnFee;
        sellEvermoonBurnFee = _evermoonBurnFee;
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellBurnFee + sellEvermoonBurnFee + sellMarketingFee + sellLiquidityFee;
        require(sellTotalFees <= 20, "Sell fees cannot be higher than 20%.");
    }

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

    function updateMarketingWallet(address newMarketingWallet)
        external
        onlyOwner
    {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateEvermoonAddress(address newEvermoonAddress)
        external
        onlyOwner
    {
        evermoon = newEvermoonAddress;
    }

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

    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 (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

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

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                //when buy
                if (
                    from == uniswapV2Pair &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (to == uniswapV2Pair && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForBurn = (fees * sellBurnFee) / sellTotalFees;
                tokensForEvermoonBurn = (fees * sellEvermoonBurnFee) / sellTotalFees;
                tokensForLiquidity = (fees * sellLiquidityFee) / sellTotalFees;
                tokensForMarketing = (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (from == uniswapV2Pair && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForBurn = (fees * buyBurnFee) / sellTotalFees;
                tokensForEvermoonBurn = (fees * buyEvermoonBurnFee) / sellTotalFees;
                tokensForLiquidity = (fees * buyLiquidityFee) / buyTotalFees; 
                tokensForMarketing = (fees * buyMarketingFee) / buyTotalFees;
            }

            if (fees> 0) {
                super._transfer(from, address(this), fees);
            }
            if (tokensForBurn > 0) {
                super._transfer(address(this), deadAddress, tokensForBurn);
                tokensForBurn = 0;
            }
            if (tokensForLiquidity > 0) {
                super._transfer(address(this), uniswapV2Pair, tokensForLiquidity);
                tokensForLiquidity = 0;
            }

            amount -= fees;
        }

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

    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    function buyAndBurnEvermoon(uint256 amountETH) internal {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = evermoon;

        // approve the Uniswap Router to spend the contract's WETH
        IERC20(uniswapV2Router.WETH()).approve(address(uniswapV2Router), amountETH);

        // calculate the amount of Token B that will be received
        uint[] memory amounts = uniswapV2Router.getAmountsOut(amountETH, path);
        uint amountEvermoonMin = amounts[amounts.length - 1];

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountETH}(
            amountEvermoonMin.mul(evermoonSlippage).div(10000), // accept percentage of the expected amount to account for price volatility
            path,
            address(this),
            block.timestamp
        );

        uint256 evermoonBalance = IERC20(evermoon).balanceOf(address(this));
        IERC20(evermoon).transfer(deadAddress, evermoonBalance);
        evermoonBurntAmount += evermoonBalance;
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForEvermoonBurn + tokensForMarketing;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        swapTokensForETH(contractBalance);

        uint256 ethBalance = address(this).balance;

        uint256 ethForEvermoonBurn = ethBalance.mul(tokensForEvermoonBurn).div(
            totalTokensToSwap
        );

        if (evermoonBurnEnabled && ethForEvermoonBurn > 0) {
            buyAndBurnEvermoon(ethForEvermoonBurn);
        }

        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyEvermoonBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evermoon","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evermoonBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evermoonBurntAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evermoonSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellEvermoonBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"setEvermoonSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForEvermoonBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_evermoonBurnFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newEvermoonAddress","type":"address"}],"name":"updateEvermoonAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateEvermoonBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_evermoonBurnFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600680546001600160a01b031916734ad434b8cdc3aa5ac97932d6bd18b5d313ab0f6f179055600b805462ffffff1916600117905534801562000045575f80fd5b506040518060400160405280600881526020016722bb32b9213ab93760c11b8152506040518060400160405280600881526020016722ab22a9212aa92760c11b815250816003908162000099919062000706565b506004620000a8828262000706565b505050620000c5620000bf6200040b60201b60201c565b6200040f565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000e781600162000460565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000130573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001569190620007ce565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c89190620007ce565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000213573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002399190620007ce565b6001600160a01b031660a08190526200025490600162000460565b5f80601e8180806023816b033b2e3c9fd0803ce800000060646200027a82600262000811565b62000286919062000831565b60085560646200029882600262000811565b620002a4919062000831565b600a55612710620002b782600562000811565b620002c3919062000831565b600955600d899055600e889055600f87905560108690558587620002e88a8c62000851565b620002f4919062000851565b62000300919062000851565b600c556012859055601384905560148390556015829055818362000325868862000851565b62000331919062000851565b6200033d919062000851565b60115561251c601a55601b805460ff19166001179055600780546001600160a01b03191673ed48ffce8ac3f333bfb0077a0cf4a8414df27f5d17905562000398620003906005546001600160a01b031690565b6001620004d8565b620003a5306001620004d8565b620003b461dead6001620004d8565b620003d3620003cb6005546001600160a01b031690565b600162000460565b620003e030600162000460565b620003ef61dead600162000460565b620003fb338262000580565b5050505050505050505062000867565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b03163314620004ae5760405162461bcd60e51b815260206004820181905260248201525f80516020620033b683398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620005225760405162461bcd60e51b815260206004820181905260248201525f80516020620033b68339815191526044820152606401620004a5565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005d85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620004a5565b8060025f828254620005eb919062000851565b90915550506001600160a01b0382165f90815260208190526040812080548392906200061990849062000851565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200069057607f821691505b602082108103620006af57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000662575f81815260208120601f850160051c81016020861015620006dd5750805b601f850160051c820191505b81811015620006fe57828155600101620006e9565b505050505050565b81516001600160401b0381111562000722576200072262000667565b6200073a816200073384546200067b565b84620006b5565b602080601f83116001811462000770575f8415620007585750858301515b5f19600386901b1c1916600185901b178555620006fe565b5f85815260208120601f198616915b82811015620007a0578886015182559484019460019091019084016200077f565b5085821015620007be57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620007df575f80fd5b81516001600160a01b0381168114620007f6575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200082b576200082b620007fd565b92915050565b5f826200084c57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200082b576200082b620007fd565b60805160a051612ad2620008e45f395f81816105c9015281816116e4015281816118f0015281816119f701528181611ada0152611bec01525f818161042d01528181611f500152818161200701528181612043015281816120d3015281816121b60152818161224b015281816122e001526123860152612ad25ff3fe608060405260043610610369575f3560e01c806375f0a874116101c8578063c0246668116100fd578063dd62ed3e1161009d578063f11a24d31161006d578063f11a24d3146109a8578063f2fde38b146109bd578063f6374342146109dc578063f8b45b05146109f1575f80fd5b8063dd62ed3e1461091b578063e2f456051461095f578063e71dc3f514610974578063e7ad9fcd14610989575f80fd5b8063cbd92700116100d8578063cbd92700146108b9578063d257b34f146108ce578063d49cc31c146108ed578063d85ba06314610906575f80fd5b8063c024666814610866578063c18bc19514610885578063c8c8ebe4146108a4575f80fd5b806395d89b4111610168578063aacebbe311610143578063aacebbe3146107f5578063adb873bd14610814578063b80f981d14610829578063bbc0c74214610848575f80fd5b806395d89b41146107ad578063a199db07146107c1578063a9059cbb146107d6575f80fd5b80638a8c523c116101a35780638a8c523c146107485780638da5cb5b1461075c5780639213691314610779578063924de9b71461078e575f80fd5b806375f0a874146106ff578063770085091461071e5780637bce5a0414610733575f80fd5b8063313ce5671161029e578063573eab5e1161023e57806370a082311161021957806370a0823114610684578063715018a6146106b8578063751039fc146106cc5780637571336a146106e0575f80fd5b8063573eab5e1461063b5780636a486a8e146106505780636ddd171314610665575f80fd5b8063451c56e511610279578063451c56e51461059957806349bd5a5e146105b85780634a62bb65146105eb5780634fbee19314610604575f80fd5b8063313ce5671461054b5780633794d131146105665780633f0167ed14610585575f80fd5b80631d7778561161030957806323218fbb116102e457806323218fbb146104e357806323b872dd146104f857806327c8f835146105175780632e6ed7ef1461052c575f80fd5b80631d7778561461049a5780631f3fed8f146104af578063203e727e146104c4575f80fd5b806310d5de531161034457806310d5de53146103ee5780631694505e1461041c57806318160ddd146104675780631a8145bb14610485575f80fd5b806306fdde0314610374578063095ea7b31461039e5780630ed1e32a146103cd575f80fd5b3661037057005b5f80fd5b34801561037f575f80fd5b50610388610a06565b604051610395919061251e565b60405180910390f35b3480156103a9575f80fd5b506103bd6103b836600461257d565b610a96565b6040519015158152602001610395565b3480156103d8575f80fd5b506103ec6103e73660046125a7565b610aac565b005b3480156103f9575f80fd5b506103bd6104083660046125be565b601e6020525f908152604090205460ff1681565b348015610427575f80fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610395565b348015610472575f80fd5b506002545b604051908152602001610395565b348015610490575f80fd5b5061047760185481565b3480156104a5575f80fd5b5061047760165481565b3480156104ba575f80fd5b5061047760195481565b3480156104cf575f80fd5b506103ec6104de3660046125a7565b610b44565b3480156104ee575f80fd5b50610477601c5481565b348015610503575f80fd5b506103bd6105123660046125d9565b610c21565b348015610522575f80fd5b5061044f61dead81565b348015610537575f80fd5b506103ec610546366004612617565b610cc9565b348015610556575f80fd5b5060405160128152602001610395565b348015610571575f80fd5b5060065461044f906001600160a01b031681565b348015610590575f80fd5b506103ec610d8e565b3480156105a4575f80fd5b506103ec6105b33660046125be565b610dcf565b3480156105c3575f80fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f6575f80fd5b50600b546103bd9060ff1681565b34801561060f575f80fd5b506103bd61061e3660046125be565b6001600160a01b03165f908152601d602052604090205460ff1690565b348015610646575f80fd5b5061047760175481565b34801561065b575f80fd5b5061047760115481565b348015610670575f80fd5b50600b546103bd9062010000900460ff1681565b34801561068f575f80fd5b5061047761069e3660046125be565b6001600160a01b03165f9081526020819052604090205490565b3480156106c3575f80fd5b506103ec610e1b565b3480156106d7575f80fd5b506103bd610e50565b3480156106eb575f80fd5b506103ec6106fa366004612653565b610e8c565b34801561070a575f80fd5b5060075461044f906001600160a01b031681565b348015610729575f80fd5b50610477600e5481565b34801561073e575f80fd5b50610477600f5481565b348015610753575f80fd5b506103ec610ee0565b348015610767575f80fd5b506005546001600160a01b031661044f565b348015610784575f80fd5b5061047760145481565b348015610799575f80fd5b506103ec6107a836600461268a565b610f1d565b3480156107b8575f80fd5b50610388610f63565b3480156107cc575f80fd5b5061047760135481565b3480156107e1575f80fd5b506103bd6107f036600461257d565b610f72565b348015610800575f80fd5b506103ec61080f3660046125be565b610f7e565b34801561081f575f80fd5b5061047760125481565b348015610834575f80fd5b506103ec61084336600461268a565b611004565b348015610853575f80fd5b50600b546103bd90610100900460ff1681565b348015610871575f80fd5b506103ec610880366004612653565b61104a565b348015610890575f80fd5b506103ec61089f3660046125a7565b6110d2565b3480156108af575f80fd5b5061047760085481565b3480156108c4575f80fd5b50610477601a5481565b3480156108d9575f80fd5b506103bd6108e83660046125a7565b6111a3565b3480156108f8575f80fd5b50601b546103bd9060ff1681565b348015610911575f80fd5b50610477600c5481565b348015610926575f80fd5b506104776109353660046126a5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561096a575f80fd5b5061047760095481565b34801561097f575f80fd5b50610477600d5481565b348015610994575f80fd5b506103ec6109a3366004612617565b6112f4565b3480156109b3575f80fd5b5061047760105481565b3480156109c8575f80fd5b506103ec6109d73660046125be565b6113b3565b3480156109e7575f80fd5b5061047760155481565b3480156109fc575f80fd5b50610477600a5481565b606060038054610a15906126d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a41906126d1565b8015610a8c5780601f10610a6357610100808354040283529160200191610a8c565b820191905f5260205f20905b815481529060010190602001808311610a6f57829003601f168201915b5050505050905090565b5f610aa233848461144e565b5060015b92915050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b8152600401610ad690612709565b60405180910390fd5b612710601a541115610b3f5760405162461bcd60e51b8152602060048201526024808201527f536c6970706167652063616e6e6f7420626520686967686572207468616e20316044820152631818129760e11b6064820152608401610ad6565b601a55565b6005546001600160a01b03163314610b6e5760405162461bcd60e51b8152600401610ad690612709565b670de0b6b3a76400006103e8610b8360025490565b610b8e906001612752565b610b989190612769565b610ba29190612769565b811015610c095760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610ad6565b610c1b81670de0b6b3a7640000612752565b60085550565b5f610c2d848484611571565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610cb15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ad6565b610cbe853385840361144e565b506001949350505050565b6005546001600160a01b03163314610cf35760405162461bcd60e51b8152600401610ad690612709565b600d849055600e839055600f82905560108190558082610d138587612788565b610d1d9190612788565b610d279190612788565b600c81905560141015610d885760405162461bcd60e51b815260206004820152602360248201527f42757920666565732063616e6e6f7420626520686967686572207468616e203260448201526218129760e91b6064820152608401610ad6565b50505050565b6007546001600160a01b0316336001600160a01b031614610dc15760405162461bcd60e51b8152600401610ad69061279b565b600b805462ff000019169055565b6005546001600160a01b03163314610df95760405162461bcd60e51b8152600401610ad690612709565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e455760405162461bcd60e51b8152600401610ad690612709565b610e4e5f611c39565b565b6005545f906001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610ad690612709565b50600b805460ff19169055600190565b6005546001600160a01b03163314610eb65760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610f0a5760405162461bcd60e51b8152600401610ad690612709565b600b805462ffff00191662010100179055565b6005546001600160a01b03163314610f475760405162461bcd60e51b8152600401610ad690612709565b600b8054911515620100000262ff000019909216919091179055565b606060048054610a15906126d1565b5f610aa2338484611571565b6005546001600160a01b03163314610fa85760405162461bcd60e51b8152600401610ad690612709565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b0316336001600160a01b0316146110375760405162461bcd60e51b8152600401610ad69061279b565b601b805460ff1916911515919091179055565b6005546001600160a01b031633146110745760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146110fc5760405162461bcd60e51b8152600401610ad690612709565b670de0b6b3a76400006103e861111160025490565b61111c906005612752565b6111269190612769565b6111309190612769565b81101561118b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610ad6565b61119d81670de0b6b3a7640000612752565b600a5550565b6005545f906001600160a01b031633146111cf5760405162461bcd60e51b8152600401610ad690612709565b620186a06111dc60025490565b6111e7906001612752565b6111f19190612769565b82101561125e5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ad6565b6103e861126a60025490565b611275906005612752565b61127f9190612769565b8211156112eb5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610ad6565b50600955600190565b6005546001600160a01b0316331461131e5760405162461bcd60e51b8152600401610ad690612709565b6012849055601383905560148290556015819055808261133e8587612788565b6113489190612788565b6113529190612788565b601181905560141015610d885760405162461bcd60e51b8152602060048201526024808201527f53656c6c20666565732063616e6e6f7420626520686967686572207468616e206044820152631918129760e11b6064820152608401610ad6565b6005546001600160a01b031633146113dd5760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b0381166114425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad6565b61144b81611c39565b50565b6001600160a01b0383166114b05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad6565b6001600160a01b0382166115115760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ad6565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115975760405162461bcd60e51b8152600401610ad690612802565b6001600160a01b0382166115bd5760405162461bcd60e51b8152600401610ad690612847565b805f036115d4576115cf83835f611c8a565b505050565b600b5460ff16156118a6576005546001600160a01b0384811691161480159061160b57506005546001600160a01b03838116911614155b801561161f57506001600160a01b03821615155b801561163657506001600160a01b03821661dead14155b801561164c5750600654600160a01b900460ff16155b156118a657600b54610100900460ff166116e2576001600160a01b0383165f908152601d602052604090205460ff168061169d57506001600160a01b0382165f908152601d602052604090205460ff165b6116e25760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ad6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614801561173b57506001600160a01b0382165f908152601e602052604090205460ff16155b1561181e576008548111156117b05760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ad6565b600a546001600160a01b0383165f908152602081905260409020546117d59083612788565b11156118195760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ad6565b6118a6565b6001600160a01b0382165f908152601e602052604090205460ff166118a657600a546001600160a01b0383165f908152602081905260409020546118629083612788565b11156118a65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ad6565b305f90815260208190526040902054600954811080159081906118d15750600b5462010000900460ff165b80156118e75750600654600160a01b900460ff16155b801561192457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b801561194857506001600160a01b0385165f908152601d602052604090205460ff16155b801561196c57506001600160a01b0384165f908152601d602052604090205460ff16155b1561199a576006805460ff60a01b1916600160a01b17905561198c611ddc565b6006805460ff60a01b191690555b6006546001600160a01b0386165f908152601d602052604090205460ff600160a01b9092048216159116806119e657506001600160a01b0385165f908152601d602052604090205460ff165b156119ee57505f5b5f8115611c25577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316148015611a3757505f601154115b15611ad857611a5c6064611a5660115488611ede90919063ffffffff16565b90611ef0565b905060115460125482611a6f9190612752565b611a799190612769565b601655601154601354611a8c9083612752565b611a969190612769565b601755601154601554611aa99083612752565b611ab39190612769565b601855601154601454611ac69083612752565b611ad09190612769565b601955611bb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316148015611b1a57505f600c54115b15611bb157611b396064611a56600c5488611ede90919063ffffffff16565b9050601154600d5482611b4c9190612752565b611b569190612769565b601655601154600e54611b699083612752565b611b739190612769565b601755600c54601054611b869083612752565b611b909190612769565b601855600c54600f54611ba39083612752565b611bad9190612769565b6019555b8015611bc257611bc2873083611c8a565b60165415611bde57611bd93061dead601654611c8a565b5f6016555b60185415611c1857611c13307f0000000000000000000000000000000000000000000000000000000000000000601854611c8a565b5f6018555b611c22818661288a565b94505b611c30878787611c8a565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611cb05760405162461bcd60e51b8152600401610ad690612802565b6001600160a01b038216611cd65760405162461bcd60e51b8152600401610ad690612847565b6001600160a01b0383165f9081526020819052604090205481811015611d4d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ad6565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611d83908490612788565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dcf91815260200190565b60405180910390a3610d88565b305f9081526020819052604081205490505f601954601754611dfe9190612788565b90505f821580611e0c575081155b15611e1657505050565b600954611e24906014612752565b831115611e3c57600954611e39906014612752565b92505b611e4583611efb565b5f4790505f611e6384611a5660175485611ede90919063ffffffff16565b601b5490915060ff168015611e7757505f81115b15611e8557611e85816120b1565b6007546040516001600160a01b039091169047905f81818185875af1925050503d805f8114611ecf576040519150601f19603f3d011682016040523d82523d5f602084013e611ed4565b606091505b5050505050505050565b5f611ee98284612752565b9392505050565b5f611ee98284612769565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611f2e57611f2e6128b1565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906128c5565b81600181518110611fe157611fe16128b1565b60200260200101906001600160a01b031690816001600160a01b03168152505061202c307f00000000000000000000000000000000000000000000000000000000000000008461144e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906120809085905f90869030904290600401612922565b5f604051808303815f87803b158015612097575f80fd5b505af11580156120a9573d5f803e3d5ffd5b505050505050565b6040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215191906128c5565b815f81518110612163576121636128b1565b6001600160a01b039283166020918202929092010152600654825191169082906001908110612194576121946128b1565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223491906128c5565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201859052919091169063095ea7b3906044016020604051808303815f875af11580156122a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c6919061295d565b5060405163d06ca61f60e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f906123179086908690600401612978565b5f60405180830381865afa158015612331573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123589190810190612998565b90505f816001835161236a919061288a565b8151811061237a5761237a6128b1565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b6f9de95856123cf612710611a56601a5487611ede90919063ffffffff16565b8630426040518663ffffffff1660e01b81526004016123f19493929190612a51565b5f604051808303818588803b158015612408575f80fd5b505af115801561241a573d5f803e3d5ffd5b50506006546040516370a0823160e01b81523060048201525f94506001600160a01b0390911692506370a082319150602401602060405180830381865afa158015612467573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248b9190612a85565b60065460405163a9059cbb60e01b815261dead6004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156124dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612500919061295d565b5080601c5f8282546125129190612788565b90915550505050505050565b5f6020808352835180828501525f5b818110156125495785810183015185820160400152820161252d565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461144b575f80fd5b5f806040838503121561258e575f80fd5b823561259981612569565b946020939093013593505050565b5f602082840312156125b7575f80fd5b5035919050565b5f602082840312156125ce575f80fd5b8135611ee981612569565b5f805f606084860312156125eb575f80fd5b83356125f681612569565b9250602084013561260681612569565b929592945050506040919091013590565b5f805f806080858703121561262a575f80fd5b5050823594602084013594506040840135936060013592509050565b801515811461144b575f80fd5b5f8060408385031215612664575f80fd5b823561266f81612569565b9150602083013561267f81612646565b809150509250929050565b5f6020828403121561269a575f80fd5b8135611ee981612646565b5f80604083850312156126b6575f80fd5b82356126c181612569565b9150602083013561267f81612569565b600181811c908216806126e557607f821691505b60208210810361270357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610aa657610aa661273e565b5f8261278357634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610aa657610aa661273e565b60208082526041908201527f556e617574686f72697a65642063616c6c2c206f6e6c79206d61726b6574696e60408201527f6720616464726573732063616e2063616c6c20746869732066756e6374696f6e6060820152601760f91b608082015260a00190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610aa657610aa661273e565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156128d5575f80fd5b8151611ee981612569565b5f8151808452602080850194508084015f5b838110156129175781516001600160a01b0316875295820195908201906001016128f2565b509495945050505050565b85815284602082015260a060408201525f61294060a08301866128e0565b6001600160a01b0394909416606083015250608001529392505050565b5f6020828403121561296d575f80fd5b8151611ee981612646565b828152604060208201525f61299060408301846128e0565b949350505050565b5f60208083850312156129a9575f80fd5b825167ffffffffffffffff808211156129c0575f80fd5b818501915085601f8301126129d3575f80fd5b8151818111156129e5576129e561289d565b8060051b604051601f19603f83011681018181108582111715612a0a57612a0a61289d565b604052918252848201925083810185019188831115612a27575f80fd5b938501935b82851015612a4557845184529385019392850192612a2c565b98975050505050505050565b848152608060208201525f612a6960808301866128e0565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612a95575f80fd5b505191905056fea26469706673582212209813b007758615eb52ec42a58ab787d77a522d2f406a22a71a79513f2f03bc5764736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x608060405260043610610369575f3560e01c806375f0a874116101c8578063c0246668116100fd578063dd62ed3e1161009d578063f11a24d31161006d578063f11a24d3146109a8578063f2fde38b146109bd578063f6374342146109dc578063f8b45b05146109f1575f80fd5b8063dd62ed3e1461091b578063e2f456051461095f578063e71dc3f514610974578063e7ad9fcd14610989575f80fd5b8063cbd92700116100d8578063cbd92700146108b9578063d257b34f146108ce578063d49cc31c146108ed578063d85ba06314610906575f80fd5b8063c024666814610866578063c18bc19514610885578063c8c8ebe4146108a4575f80fd5b806395d89b4111610168578063aacebbe311610143578063aacebbe3146107f5578063adb873bd14610814578063b80f981d14610829578063bbc0c74214610848575f80fd5b806395d89b41146107ad578063a199db07146107c1578063a9059cbb146107d6575f80fd5b80638a8c523c116101a35780638a8c523c146107485780638da5cb5b1461075c5780639213691314610779578063924de9b71461078e575f80fd5b806375f0a874146106ff578063770085091461071e5780637bce5a0414610733575f80fd5b8063313ce5671161029e578063573eab5e1161023e57806370a082311161021957806370a0823114610684578063715018a6146106b8578063751039fc146106cc5780637571336a146106e0575f80fd5b8063573eab5e1461063b5780636a486a8e146106505780636ddd171314610665575f80fd5b8063451c56e511610279578063451c56e51461059957806349bd5a5e146105b85780634a62bb65146105eb5780634fbee19314610604575f80fd5b8063313ce5671461054b5780633794d131146105665780633f0167ed14610585575f80fd5b80631d7778561161030957806323218fbb116102e457806323218fbb146104e357806323b872dd146104f857806327c8f835146105175780632e6ed7ef1461052c575f80fd5b80631d7778561461049a5780631f3fed8f146104af578063203e727e146104c4575f80fd5b806310d5de531161034457806310d5de53146103ee5780631694505e1461041c57806318160ddd146104675780631a8145bb14610485575f80fd5b806306fdde0314610374578063095ea7b31461039e5780630ed1e32a146103cd575f80fd5b3661037057005b5f80fd5b34801561037f575f80fd5b50610388610a06565b604051610395919061251e565b60405180910390f35b3480156103a9575f80fd5b506103bd6103b836600461257d565b610a96565b6040519015158152602001610395565b3480156103d8575f80fd5b506103ec6103e73660046125a7565b610aac565b005b3480156103f9575f80fd5b506103bd6104083660046125be565b601e6020525f908152604090205460ff1681565b348015610427575f80fd5b5061044f7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610395565b348015610472575f80fd5b506002545b604051908152602001610395565b348015610490575f80fd5b5061047760185481565b3480156104a5575f80fd5b5061047760165481565b3480156104ba575f80fd5b5061047760195481565b3480156104cf575f80fd5b506103ec6104de3660046125a7565b610b44565b3480156104ee575f80fd5b50610477601c5481565b348015610503575f80fd5b506103bd6105123660046125d9565b610c21565b348015610522575f80fd5b5061044f61dead81565b348015610537575f80fd5b506103ec610546366004612617565b610cc9565b348015610556575f80fd5b5060405160128152602001610395565b348015610571575f80fd5b5060065461044f906001600160a01b031681565b348015610590575f80fd5b506103ec610d8e565b3480156105a4575f80fd5b506103ec6105b33660046125be565b610dcf565b3480156105c3575f80fd5b5061044f7f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a81565b3480156105f6575f80fd5b50600b546103bd9060ff1681565b34801561060f575f80fd5b506103bd61061e3660046125be565b6001600160a01b03165f908152601d602052604090205460ff1690565b348015610646575f80fd5b5061047760175481565b34801561065b575f80fd5b5061047760115481565b348015610670575f80fd5b50600b546103bd9062010000900460ff1681565b34801561068f575f80fd5b5061047761069e3660046125be565b6001600160a01b03165f9081526020819052604090205490565b3480156106c3575f80fd5b506103ec610e1b565b3480156106d7575f80fd5b506103bd610e50565b3480156106eb575f80fd5b506103ec6106fa366004612653565b610e8c565b34801561070a575f80fd5b5060075461044f906001600160a01b031681565b348015610729575f80fd5b50610477600e5481565b34801561073e575f80fd5b50610477600f5481565b348015610753575f80fd5b506103ec610ee0565b348015610767575f80fd5b506005546001600160a01b031661044f565b348015610784575f80fd5b5061047760145481565b348015610799575f80fd5b506103ec6107a836600461268a565b610f1d565b3480156107b8575f80fd5b50610388610f63565b3480156107cc575f80fd5b5061047760135481565b3480156107e1575f80fd5b506103bd6107f036600461257d565b610f72565b348015610800575f80fd5b506103ec61080f3660046125be565b610f7e565b34801561081f575f80fd5b5061047760125481565b348015610834575f80fd5b506103ec61084336600461268a565b611004565b348015610853575f80fd5b50600b546103bd90610100900460ff1681565b348015610871575f80fd5b506103ec610880366004612653565b61104a565b348015610890575f80fd5b506103ec61089f3660046125a7565b6110d2565b3480156108af575f80fd5b5061047760085481565b3480156108c4575f80fd5b50610477601a5481565b3480156108d9575f80fd5b506103bd6108e83660046125a7565b6111a3565b3480156108f8575f80fd5b50601b546103bd9060ff1681565b348015610911575f80fd5b50610477600c5481565b348015610926575f80fd5b506104776109353660046126a5565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561096a575f80fd5b5061047760095481565b34801561097f575f80fd5b50610477600d5481565b348015610994575f80fd5b506103ec6109a3366004612617565b6112f4565b3480156109b3575f80fd5b5061047760105481565b3480156109c8575f80fd5b506103ec6109d73660046125be565b6113b3565b3480156109e7575f80fd5b5061047760155481565b3480156109fc575f80fd5b50610477600a5481565b606060038054610a15906126d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a41906126d1565b8015610a8c5780601f10610a6357610100808354040283529160200191610a8c565b820191905f5260205f20905b815481529060010190602001808311610a6f57829003601f168201915b5050505050905090565b5f610aa233848461144e565b5060015b92915050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b8152600401610ad690612709565b60405180910390fd5b612710601a541115610b3f5760405162461bcd60e51b8152602060048201526024808201527f536c6970706167652063616e6e6f7420626520686967686572207468616e20316044820152631818129760e11b6064820152608401610ad6565b601a55565b6005546001600160a01b03163314610b6e5760405162461bcd60e51b8152600401610ad690612709565b670de0b6b3a76400006103e8610b8360025490565b610b8e906001612752565b610b989190612769565b610ba29190612769565b811015610c095760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610ad6565b610c1b81670de0b6b3a7640000612752565b60085550565b5f610c2d848484611571565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610cb15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ad6565b610cbe853385840361144e565b506001949350505050565b6005546001600160a01b03163314610cf35760405162461bcd60e51b8152600401610ad690612709565b600d849055600e839055600f82905560108190558082610d138587612788565b610d1d9190612788565b610d279190612788565b600c81905560141015610d885760405162461bcd60e51b815260206004820152602360248201527f42757920666565732063616e6e6f7420626520686967686572207468616e203260448201526218129760e91b6064820152608401610ad6565b50505050565b6007546001600160a01b0316336001600160a01b031614610dc15760405162461bcd60e51b8152600401610ad69061279b565b600b805462ff000019169055565b6005546001600160a01b03163314610df95760405162461bcd60e51b8152600401610ad690612709565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610e455760405162461bcd60e51b8152600401610ad690612709565b610e4e5f611c39565b565b6005545f906001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610ad690612709565b50600b805460ff19169055600190565b6005546001600160a01b03163314610eb65760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610f0a5760405162461bcd60e51b8152600401610ad690612709565b600b805462ffff00191662010100179055565b6005546001600160a01b03163314610f475760405162461bcd60e51b8152600401610ad690612709565b600b8054911515620100000262ff000019909216919091179055565b606060048054610a15906126d1565b5f610aa2338484611571565b6005546001600160a01b03163314610fa85760405162461bcd60e51b8152600401610ad690612709565b6007546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b0316336001600160a01b0316146110375760405162461bcd60e51b8152600401610ad69061279b565b601b805460ff1916911515919091179055565b6005546001600160a01b031633146110745760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146110fc5760405162461bcd60e51b8152600401610ad690612709565b670de0b6b3a76400006103e861111160025490565b61111c906005612752565b6111269190612769565b6111309190612769565b81101561118b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610ad6565b61119d81670de0b6b3a7640000612752565b600a5550565b6005545f906001600160a01b031633146111cf5760405162461bcd60e51b8152600401610ad690612709565b620186a06111dc60025490565b6111e7906001612752565b6111f19190612769565b82101561125e5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ad6565b6103e861126a60025490565b611275906005612752565b61127f9190612769565b8211156112eb5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610ad6565b50600955600190565b6005546001600160a01b0316331461131e5760405162461bcd60e51b8152600401610ad690612709565b6012849055601383905560148290556015819055808261133e8587612788565b6113489190612788565b6113529190612788565b601181905560141015610d885760405162461bcd60e51b8152602060048201526024808201527f53656c6c20666565732063616e6e6f7420626520686967686572207468616e206044820152631918129760e11b6064820152608401610ad6565b6005546001600160a01b031633146113dd5760405162461bcd60e51b8152600401610ad690612709565b6001600160a01b0381166114425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ad6565b61144b81611c39565b50565b6001600160a01b0383166114b05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ad6565b6001600160a01b0382166115115760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ad6565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115975760405162461bcd60e51b8152600401610ad690612802565b6001600160a01b0382166115bd5760405162461bcd60e51b8152600401610ad690612847565b805f036115d4576115cf83835f611c8a565b505050565b600b5460ff16156118a6576005546001600160a01b0384811691161480159061160b57506005546001600160a01b03838116911614155b801561161f57506001600160a01b03821615155b801561163657506001600160a01b03821661dead14155b801561164c5750600654600160a01b900460ff16155b156118a657600b54610100900460ff166116e2576001600160a01b0383165f908152601d602052604090205460ff168061169d57506001600160a01b0382165f908152601d602052604090205460ff165b6116e25760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ad6565b7f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a6001600160a01b0316836001600160a01b031614801561173b57506001600160a01b0382165f908152601e602052604090205460ff16155b1561181e576008548111156117b05760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ad6565b600a546001600160a01b0383165f908152602081905260409020546117d59083612788565b11156118195760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ad6565b6118a6565b6001600160a01b0382165f908152601e602052604090205460ff166118a657600a546001600160a01b0383165f908152602081905260409020546118629083612788565b11156118a65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ad6565b305f90815260208190526040902054600954811080159081906118d15750600b5462010000900460ff165b80156118e75750600654600160a01b900460ff16155b801561192457507f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a6001600160a01b0316846001600160a01b0316145b801561194857506001600160a01b0385165f908152601d602052604090205460ff16155b801561196c57506001600160a01b0384165f908152601d602052604090205460ff16155b1561199a576006805460ff60a01b1916600160a01b17905561198c611ddc565b6006805460ff60a01b191690555b6006546001600160a01b0386165f908152601d602052604090205460ff600160a01b9092048216159116806119e657506001600160a01b0385165f908152601d602052604090205460ff165b156119ee57505f5b5f8115611c25577f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a6001600160a01b0316866001600160a01b0316148015611a3757505f601154115b15611ad857611a5c6064611a5660115488611ede90919063ffffffff16565b90611ef0565b905060115460125482611a6f9190612752565b611a799190612769565b601655601154601354611a8c9083612752565b611a969190612769565b601755601154601554611aa99083612752565b611ab39190612769565b601855601154601454611ac69083612752565b611ad09190612769565b601955611bb1565b7f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a6001600160a01b0316876001600160a01b0316148015611b1a57505f600c54115b15611bb157611b396064611a56600c5488611ede90919063ffffffff16565b9050601154600d5482611b4c9190612752565b611b569190612769565b601655601154600e54611b699083612752565b611b739190612769565b601755600c54601054611b869083612752565b611b909190612769565b601855600c54600f54611ba39083612752565b611bad9190612769565b6019555b8015611bc257611bc2873083611c8a565b60165415611bde57611bd93061dead601654611c8a565b5f6016555b60185415611c1857611c13307f000000000000000000000000680e047d27e28951f37d2669b10b660490bf3d1a601854611c8a565b5f6018555b611c22818661288a565b94505b611c30878787611c8a565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611cb05760405162461bcd60e51b8152600401610ad690612802565b6001600160a01b038216611cd65760405162461bcd60e51b8152600401610ad690612847565b6001600160a01b0383165f9081526020819052604090205481811015611d4d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ad6565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611d83908490612788565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dcf91815260200190565b60405180910390a3610d88565b305f9081526020819052604081205490505f601954601754611dfe9190612788565b90505f821580611e0c575081155b15611e1657505050565b600954611e24906014612752565b831115611e3c57600954611e39906014612752565b92505b611e4583611efb565b5f4790505f611e6384611a5660175485611ede90919063ffffffff16565b601b5490915060ff168015611e7757505f81115b15611e8557611e85816120b1565b6007546040516001600160a01b039091169047905f81818185875af1925050503d805f8114611ecf576040519150601f19603f3d011682016040523d82523d5f602084013e611ed4565b606091505b5050505050505050565b5f611ee98284612752565b9392505050565b5f611ee98284612769565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611f2e57611f2e6128b1565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906128c5565b81600181518110611fe157611fe16128b1565b60200260200101906001600160a01b031690816001600160a01b03168152505061202c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461144e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906120809085905f90869030904290600401612922565b5f604051808303815f87803b158015612097575f80fd5b505af11580156120a9573d5f803e3d5ffd5b505050505050565b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215191906128c5565b815f81518110612163576121636128b1565b6001600160a01b039283166020918202929092010152600654825191169082906001908110612194576121946128b1565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223491906128c5565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8116600483015260248201859052919091169063095ea7b3906044016020604051808303815f875af11580156122a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c6919061295d565b5060405163d06ca61f60e01b81525f906001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f906123179086908690600401612978565b5f60405180830381865afa158015612331573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123589190810190612998565b90505f816001835161236a919061288a565b8151811061237a5761237a6128b1565b602002602001015190507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663b6f9de95856123cf612710611a56601a5487611ede90919063ffffffff16565b8630426040518663ffffffff1660e01b81526004016123f19493929190612a51565b5f604051808303818588803b158015612408575f80fd5b505af115801561241a573d5f803e3d5ffd5b50506006546040516370a0823160e01b81523060048201525f94506001600160a01b0390911692506370a082319150602401602060405180830381865afa158015612467573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248b9190612a85565b60065460405163a9059cbb60e01b815261dead6004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156124dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612500919061295d565b5080601c5f8282546125129190612788565b90915550505050505050565b5f6020808352835180828501525f5b818110156125495785810183015185820160400152820161252d565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461144b575f80fd5b5f806040838503121561258e575f80fd5b823561259981612569565b946020939093013593505050565b5f602082840312156125b7575f80fd5b5035919050565b5f602082840312156125ce575f80fd5b8135611ee981612569565b5f805f606084860312156125eb575f80fd5b83356125f681612569565b9250602084013561260681612569565b929592945050506040919091013590565b5f805f806080858703121561262a575f80fd5b5050823594602084013594506040840135936060013592509050565b801515811461144b575f80fd5b5f8060408385031215612664575f80fd5b823561266f81612569565b9150602083013561267f81612646565b809150509250929050565b5f6020828403121561269a575f80fd5b8135611ee981612646565b5f80604083850312156126b6575f80fd5b82356126c181612569565b9150602083013561267f81612569565b600181811c908216806126e557607f821691505b60208210810361270357634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610aa657610aa661273e565b5f8261278357634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610aa657610aa661273e565b60208082526041908201527f556e617574686f72697a65642063616c6c2c206f6e6c79206d61726b6574696e60408201527f6720616464726573732063616e2063616c6c20746869732066756e6374696f6e6060820152601760f91b608082015260a00190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610aa657610aa661273e565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156128d5575f80fd5b8151611ee981612569565b5f8151808452602080850194508084015f5b838110156129175781516001600160a01b0316875295820195908201906001016128f2565b509495945050505050565b85815284602082015260a060408201525f61294060a08301866128e0565b6001600160a01b0394909416606083015250608001529392505050565b5f6020828403121561296d575f80fd5b8151611ee981612646565b828152604060208201525f61299060408301846128e0565b949350505050565b5f60208083850312156129a9575f80fd5b825167ffffffffffffffff808211156129c0575f80fd5b818501915085601f8301126129d3575f80fd5b8151818111156129e5576129e561289d565b8060051b604051601f19603f83011681018181108582111715612a0a57612a0a61289d565b604052918252848201925083810185019188831115612a27575f80fd5b938501935b82851015612a4557845184529385019392850192612a2c565b98975050505050505050565b848152608060208201525f612a6960808301866128e0565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612a95575f80fd5b505191905056fea26469706673582212209813b007758615eb52ec42a58ab787d77a522d2f406a22a71a79513f2f03bc5764736f6c63430008140033

Deployed Bytecode Sourcemap

25292:15305:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9779:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11946:169;;;;;;;;;;-1:-1:-1;11946:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;11946:169:0;1023:187:1;31587:199:0;;;;;;;;;;-1:-1:-1;31587:199:0;;;;;:::i;:::-;;:::i;:::-;;26711:63;;;;;;;;;;-1:-1:-1;26711:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25370:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1843:32:1;;;1825:51;;1813:2;1798:18;25370:51:0;1652:230:1;10899:108:0;;;;;;;;;;-1:-1:-1;10987:12:0;;10899:108;;;2033:25:1;;;2021:2;2006:18;10899:108:0;1887:177:1;26370:33:0;;;;;;;;;;;;;;;;26292:28;;;;;;;;;;;;;;;;26410:33;;;;;;;;;;;;;;;;30376:275;;;;;;;;;;-1:-1:-1;30376:275:0;;;;;:::i;:::-;;:::i;26528:34::-;;;;;;;;;;;;;;;;12597:492;;;;;;;;;;-1:-1:-1;12597:492:0;;;;;:::i;:::-;;:::i;25473:53::-;;;;;;;;;;;;25519:6;25473:53;;32079:517;;;;;;;;;;-1:-1:-1;32079:517:0;;;;;:::i;:::-;;:::i;10741:93::-;;;;;;;;;;-1:-1:-1;10741:93:0;;10824:2;3270:36:1;;3258:2;3243:18;10741:93:0;3128:184:1;25533:77:0;;;;;;;;;;-1:-1:-1;25533:77:0;;;;-1:-1:-1;;;;;25533:77:0;;;31382:197;;;;;;;;;;;;;:::i;33570:149::-;;;;;;;;;;-1:-1:-1;33570:149:0;;;;;:::i;:::-;;:::i;25428:38::-;;;;;;;;;;;;;;;25803:33;;;;;;;;;;-1:-1:-1;25803:33:0;;;;;;;;33727:126;;;;;;;;;;-1:-1:-1;33727:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;33817:28:0;33793:4;33817:28;;;:19;:28;;;;;;;;;33727:126;26327:36;;;;;;;;;;;;;;;;26105:28;;;;;;;;;;;;;;;;25883:31;;;;;;;;;;-1:-1:-1;25883:31:0;;;;;;;;;;;11070:127;;;;;;;;;;-1:-1:-1;11070:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;11171:18:0;11144:7;11171:18;;;;;;;;;;;;11070:127;3014:103;;;;;;;;;;;;;:::i;29680:121::-;;;;;;;;;;;;;:::i;30923:167::-;;;;;;;;;;-1:-1:-1;30923:167:0;;;;;:::i;:::-;;:::i;25649:30::-;;;;;;;;;;-1:-1:-1;25649:30:0;;;;-1:-1:-1;;;;;25649:30:0;;;25989:33;;;;;;;;;;;;;;;;26029:30;;;;;;;;;;;;;;;;29516:112;;;;;;;;;;;;;:::i;2363:87::-;;;;;;;;;;-1:-1:-1;2436:6:0;;-1:-1:-1;;;;;2436:6:0;2363:87;;26214:31;;;;;;;;;;;;;;;;31186:100;;;;;;;;;;-1:-1:-1;31186:100:0;;;;;:::i;:::-;;:::i;9998:104::-;;;;;;;;;;;;;:::i;26173:34::-;;;;;;;;;;;;;;;;11410:175;;;;;;;;;;-1:-1:-1;11410:175:0;;;;;:::i;:::-;;:::i;33331:231::-;;;;;;;;;;-1:-1:-1;33331:231:0;;;;;:::i;:::-;;:::i;26140:26::-;;;;;;;;;;;;;;;;31845:226;;;;;;;;;;-1:-1:-1;31845:226:0;;;;;:::i;:::-;;:::i;25843:33::-;;;;;;;;;;-1:-1:-1;25843:33:0;;;;;;;;;;;33141:182;;;;;;;;;;-1:-1:-1;33141:182:0;;;;;:::i;:::-;;:::i;30659:256::-;;;;;;;;;;-1:-1:-1;30659:256:0;;;;;:::i;:::-;;:::i;25688:35::-;;;;;;;;;;;;;;;;26452:31;;;;;;;;;;;;;;;;29871:497;;;;;;;;;;-1:-1:-1;29871:497:0;;;;;:::i;:::-;;:::i;26490:31::-;;;;;;;;;;-1:-1:-1;26490:31:0;;;;;;;;25923:27;;;;;;;;;;;;;;;;11648:151;;;;;;;;;;-1:-1:-1;11648:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11764:18:0;;;11737:7;11764:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11648:151;25730:33;;;;;;;;;;;;;;;;25957:25;;;;;;;;;;;;;;;;32604:529;;;;;;;;;;-1:-1:-1;32604:529:0;;;;;:::i;:::-;;:::i;26066:30::-;;;;;;;;;;;;;;;;3272:201;;;;;;;;;;-1:-1:-1;3272:201:0;;;;;:::i;:::-;;:::i;26252:31::-;;;;;;;;;;;;;;;;25770:24;;;;;;;;;;;;;;;;9779:100;9833:13;9866:5;9859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9779:100;:::o;11946:169::-;12029:4;12046:39;1116:10;12069:7;12078:6;12046:8;:39::i;:::-;-1:-1:-1;12103:4:0;11946:169;;;;;:::o;31587:199::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;;;;;;;;;31693:5:::1;31673:16;;:25;;31665:74;;;::::0;-1:-1:-1;;;31665:74:0;;5414:2:1;31665:74:0::1;::::0;::::1;5396:21:1::0;5453:2;5433:18;;;5426:30;5492:34;5472:18;;;5465:62;-1:-1:-1;;;5543:18:1;;;5536:34;5587:19;;31665:74:0::1;5212:400:1::0;31665:74:0::1;31750:16;:28:::0;31587:199::o;30376:275::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;30513:4:::1;30505;30484:13;10987:12:::0;;;10899:108;30484:13:::1;:17;::::0;30500:1:::1;30484:17;:::i;:::-;30483:26;;;;:::i;:::-;30482:35;;;;:::i;:::-;30472:6;:45;;30450:142;;;::::0;-1:-1:-1;;;30450:142:0;;6346:2:1;30450:142:0::1;::::0;::::1;6328:21:1::0;6385:2;6365:18;;;6358:30;6424:34;6404:18;;;6397:62;-1:-1:-1;;;6475:18:1;;;6468:45;6530:19;;30450:142:0::1;6144:411:1::0;30450:142:0::1;30626:17;:6:::0;30636::::1;30626:17;:::i;:::-;30603:20;:40:::0;-1:-1:-1;30376:275:0:o;12597:492::-;12737:4;12754:36;12764:6;12772:9;12783:6;12754:9;:36::i;:::-;-1:-1:-1;;;;;12830:19:0;;12803:24;12830:19;;;:11;:19;;;;;;;;1116:10;12830:33;;;;;;;;12882:26;;;;12874:79;;;;-1:-1:-1;;;12874:79:0;;6762:2:1;12874:79:0;;;6744:21:1;6801:2;6781:18;;;6774:30;6840:34;6820:18;;;6813:62;-1:-1:-1;;;6891:18:1;;;6884:38;6939:19;;12874:79:0;6560:404:1;12874:79:0;12989:57;12998:6;1116:10;13039:6;13020:16;:25;12989:8;:57::i;:::-;-1:-1:-1;13077:4:0;;12597:492;-1:-1:-1;;;;12597:492:0:o;32079:517::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;32265:10:::1;:21:::0;;;32297:18:::1;:37:::0;;;32345:15:::1;:31:::0;;;32387:15:::1;:31:::0;;;32405:13;32363;32444:31:::1;32318:16:::0;32278:8;32444:31:::1;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;32429:12;:82:::0;;;32546:2:::1;-1:-1:-1::0;32530:18:0::1;32522:66;;;::::0;-1:-1:-1;;;32522:66:0;;7301:2:1;32522:66:0::1;::::0;::::1;7283:21:1::0;7340:2;7320:18;;;7313:30;7379:34;7359:18;;;7352:62;-1:-1:-1;;;7430:18:1;;;7423:33;7473:19;;32522:66:0::1;7099:399:1::0;32522:66:0::1;32079:517:::0;;;;:::o;31382:197::-;31456:15;;-1:-1:-1;;;;;31456:15:0;1116:10;-1:-1:-1;;;;;31440:31:0;;31432:109;;;;-1:-1:-1;;;31432:109:0;;;;;;;:::i;:::-;31552:11;:19;;-1:-1:-1;;31552:19:0;;;31382:197::o;33570:149::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;33682:8:::1;:29:::0;;-1:-1:-1;;;;;;33682:29:0::1;-1:-1:-1::0;;;;;33682:29:0;;;::::1;::::0;;;::::1;::::0;;33570:149::o;3014:103::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;3079:30:::1;3106:1;3079:18;:30::i;:::-;3014:103::o:0;29680:121::-;2436:6;;29732:4;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;-1:-1:-1;29749:14:0::1;:22:::0;;-1:-1:-1;;29749:22:0::1;::::0;;;29680:121;:::o;30923:167::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31036:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;31036:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30923:167::o;29516:112::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;29571:13:::1;:20:::0;;-1:-1:-1;;29602:18:0;;;;;29516:112::o;31186:100::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;31257:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31257:21:0;;::::1;::::0;;;::::1;::::0;;31186:100::o;9998:104::-;10054:13;10087:7;10080:14;;;;;:::i;11410:175::-;11496:4;11513:42;1116:10;11537:9;11548:6;11513:9;:42::i;33331:231::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;33491:15:::1;::::0;33448:59:::1;::::0;-1:-1:-1;;;;;33491:15:0;;::::1;::::0;33448:59;::::1;::::0;::::1;::::0;33491:15:::1;::::0;33448:59:::1;33518:15;:36:::0;;-1:-1:-1;;;;;;33518:36:0::1;-1:-1:-1::0;;;;;33518:36:0;;;::::1;::::0;;;::::1;::::0;;33331:231::o;31845:226::-;31938:15;;-1:-1:-1;;;;;31938:15:0;1116:10;-1:-1:-1;;;;;31922:31:0;;31914:109;;;;-1:-1:-1;;;31914:109:0;;;;;;;:::i;:::-;32034:19;:29;;-1:-1:-1;;32034:29:0;;;;;;;;;;31845:226::o;33141:182::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33226:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;33226:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33281:34;;1163:41:1;;;33281:34:0::1;::::0;1136:18:1;33281:34:0::1;;;;;;;33141:182:::0;;:::o;30659:256::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;30799:4:::1;30791;30770:13;10987:12:::0;;;10899:108;30770:13:::1;:17;::::0;30786:1:::1;30770:17;:::i;:::-;30769:26;;;;:::i;:::-;30768:35;;;;:::i;:::-;30758:6;:45;;30736:131;;;::::0;-1:-1:-1;;;30736:131:0;;8179:2:1;30736:131:0::1;::::0;::::1;8161:21:1::0;8218:2;8198:18;;;8191:30;8257:34;8237:18;;;8230:62;-1:-1:-1;;;8308:18:1;;;8301:34;8352:19;;30736:131:0::1;7977:400:1::0;30736:131:0::1;30890:17;:6:::0;30900::::1;30890:17;:::i;:::-;30878:9;:29:::0;-1:-1:-1;30659:256:0:o;29871:497::-;2436:6;;29979:4;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;30058:6:::1;30037:13;10987:12:::0;;;10899:108;30037:13:::1;:17;::::0;30053:1:::1;30037:17;:::i;:::-;30036:28;;;;:::i;:::-;30023:9;:41;;30001:144;;;::::0;-1:-1:-1;;;30001:144:0;;8584:2:1;30001:144:0::1;::::0;::::1;8566:21:1::0;8623:2;8603:18;;;8596:30;8662:34;8642:18;;;8635:62;-1:-1:-1;;;8713:18:1;;;8706:51;8774:19;;30001:144:0::1;8382:417:1::0;30001:144:0::1;30213:4;30192:13;10987:12:::0;;;10899:108;30192:13:::1;:17;::::0;30208:1:::1;30192:17;:::i;:::-;30191:26;;;;:::i;:::-;30178:9;:39;;30156:141;;;::::0;-1:-1:-1;;;30156:141:0;;9006:2:1;30156:141:0::1;::::0;::::1;8988:21:1::0;9045:2;9025:18;;;9018:30;9084:34;9064:18;;;9057:62;-1:-1:-1;;;9135:18:1;;;9128:50;9195:19;;30156:141:0::1;8804:416:1::0;30156:141:0::1;-1:-1:-1::0;30308:18:0::1;:30:::0;30356:4:::1;::::0;29871:497::o;32604:529::-;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;32791:11:::1;:22:::0;;;32824:19:::1;:38:::0;;;32873:16:::1;:32:::0;;;32916:16:::1;:32:::0;;;32935:13;32892;32975:33:::1;32846:16:::0;32805:8;32975:33:::1;:::i;:::-;:52;;;;:::i;:::-;:71;;;;:::i;:::-;32959:13;:87:::0;;;33082:2:::1;-1:-1:-1::0;33065:19:0::1;33057:68;;;::::0;-1:-1:-1;;;33057:68:0;;9427:2:1;33057:68:0::1;::::0;::::1;9409:21:1::0;9466:2;9446:18;;;9439:30;9505:34;9485:18;;;9478:62;-1:-1:-1;;;9556:18:1;;;9549:34;9600:19;;33057:68:0::1;9225:400:1::0;3272:201:0;2436:6;;-1:-1:-1;;;;;2436:6:0;1116:10;2583:23;2575:68;;;;-1:-1:-1;;;2575:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3361:22:0;::::1;3353:73;;;::::0;-1:-1:-1;;;3353:73:0;;9832:2:1;3353:73:0::1;::::0;::::1;9814:21:1::0;9871:2;9851:18;;;9844:30;9910:34;9890:18;;;9883:62;-1:-1:-1;;;9961:18:1;;;9954:36;10007:19;;3353:73:0::1;9630:402:1::0;3353:73:0::1;3437:28;3456:8;3437:18;:28::i;:::-;3272:201:::0;:::o;15438:380::-;-1:-1:-1;;;;;15574:19:0;;15566:68;;;;-1:-1:-1;;;15566:68:0;;10239:2:1;15566:68:0;;;10221:21:1;10278:2;10258:18;;;10251:30;10317:34;10297:18;;;10290:62;-1:-1:-1;;;10368:18:1;;;10361:34;10412:19;;15566:68:0;10037:400:1;15566:68:0;-1:-1:-1;;;;;15653:21:0;;15645:68;;;;-1:-1:-1;;;15645:68:0;;10644:2:1;15645:68:0;;;10626:21:1;10683:2;10663:18;;;10656:30;10722:34;10702:18;;;10695:62;-1:-1:-1;;;10773:18:1;;;10766:32;10815:19;;15645:68:0;10442:398:1;15645:68:0;-1:-1:-1;;;;;15726:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15778:32;;2033:25:1;;;15778:32:0;;2006:18:1;15778:32:0;;;;;;;15438:380;;;:::o;33861:4148::-;-1:-1:-1;;;;;33993:18:0;;33985:68;;;;-1:-1:-1;;;33985:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34072:16:0;;34064:64;;;;-1:-1:-1;;;34064:64:0;;;;;;;:::i;:::-;34145:6;34155:1;34145:11;34141:93;;34173:28;34189:4;34195:2;34199:1;34173:15;:28::i;:::-;33861:4148;;;:::o;34141:93::-;34250:14;;;;34246:1430;;;2436:6;;-1:-1:-1;;;;;34303:15:0;;;2436:6;;34303:15;;;;:49;;-1:-1:-1;2436:6:0;;-1:-1:-1;;;;;34339:13:0;;;2436:6;;34339:13;;34303:49;:86;;;;-1:-1:-1;;;;;;34373:16:0;;;;34303:86;:128;;;;-1:-1:-1;;;;;;34410:21:0;;34424:6;34410:21;;34303:128;:158;;;;-1:-1:-1;34453:8:0;;-1:-1:-1;;;34453:8:0;;;;34452:9;34303:158;34281:1384;;;34501:13;;;;;;;34496:223;;-1:-1:-1;;;;;34573:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;34602:23:0;;;;;;:19;:23;;;;;;;;34573:52;34539:160;;;;-1:-1:-1;;;34539:160:0;;11857:2:1;34539:160:0;;;11839:21:1;11896:2;11876:18;;;11869:30;-1:-1:-1;;;11915:18:1;;;11908:52;11977:18;;34539:160:0;11655:346:1;34539:160:0;34933:13;-1:-1:-1;;;;;34925:21:0;:4;-1:-1:-1;;;;;34925:21:0;;:82;;;;-1:-1:-1;;;;;;34972:35:0;;;;;;:31;:35;;;;;;;;34971:36;34925:82;34899:751;;;35094:20;;35084:6;:30;;35050:169;;;;-1:-1:-1;;;35050:169:0;;12208:2:1;35050:169:0;;;12190:21:1;12247:2;12227:18;;;12220:30;12286:34;12266:18;;;12259:62;-1:-1:-1;;;12337:18:1;;;12330:51;12398:19;;35050:169:0;12006:417:1;35050:169:0;35302:9;;-1:-1:-1;;;;;11171:18:0;;11144:7;11171:18;;;;;;;;;;;35276:22;;:6;:22;:::i;:::-;:35;;35242:140;;;;-1:-1:-1;;;35242:140:0;;12630:2:1;35242:140:0;;;12612:21:1;12669:2;12649:18;;;12642:30;-1:-1:-1;;;12688:18:1;;;12681:49;12747:18;;35242:140:0;12428:343:1;35242:140:0;34899:751;;;-1:-1:-1;;;;;35430:35:0;;;;;;:31;:35;;;;;;;;35425:225;;35550:9;;-1:-1:-1;;;;;11171:18:0;;11144:7;11171:18;;;;;;;;;;;35524:22;;:6;:22;:::i;:::-;:35;;35490:140;;;;-1:-1:-1;;;35490:140:0;;12630:2:1;35490:140:0;;;12612:21:1;12669:2;12649:18;;;12642:30;-1:-1:-1;;;12688:18:1;;;12681:49;12747:18;;35490:140:0;12428:343:1;35490:140:0;35737:4;35688:28;11171:18;;;;;;;;;;;35795;;35771:42;;;;;;;35844:35;;-1:-1:-1;35868:11:0;;;;;;;35844:35;:61;;;;-1:-1:-1;35897:8:0;;-1:-1:-1;;;35897:8:0;;;;35896:9;35844:61;:97;;;;;35928:13;-1:-1:-1;;;;;35922:19:0;:2;-1:-1:-1;;;;;35922:19:0;;35844:97;:140;;;;-1:-1:-1;;;;;;35959:25:0;;;;;;:19;:25;;;;;;;;35958:26;35844:140;:181;;;;-1:-1:-1;;;;;;36002:23:0;;;;;;:19;:23;;;;;;;;36001:24;35844:181;35826:313;;;36052:8;:15;;-1:-1:-1;;;;36052:15:0;-1:-1:-1;;;36052:15:0;;;36084:10;:8;:10::i;:::-;36111:8;:16;;-1:-1:-1;;;;36111:16:0;;;35826:313;36167:8;;-1:-1:-1;;;;;36277:25:0;;36151:12;36277:25;;;:19;:25;;;;;;36167:8;-1:-1:-1;;;36167:8:0;;;;;36166:9;;36277:25;;:52;;-1:-1:-1;;;;;;36306:23:0;;;;;;:19;:23;;;;;;;;36277:52;36273:100;;;-1:-1:-1;36356:5:0;36273:100;36385:12;36490:7;36486:1470;;;36548:13;-1:-1:-1;;;;;36542:19:0;:2;-1:-1:-1;;;;;36542:19:0;;:40;;;;;36581:1;36565:13;;:17;36542:40;36538:921;;;36610:34;36640:3;36610:25;36621:13;;36610:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;36603:41;;36702:13;;36687:11;;36680:4;:18;;;;:::i;:::-;36679:36;;;;:::i;:::-;36663:13;:52;36789:13;;36766:19;;36759:26;;:4;:26;:::i;:::-;36758:44;;;;:::i;:::-;36734:21;:68;36870:13;;36850:16;;36843:23;;:4;:23;:::i;:::-;36842:41;;;;:::i;:::-;36821:18;:62;36951:13;;36931:16;;36924:23;;:4;:23;:::i;:::-;36923:41;;;;:::i;:::-;36902:18;:62;36538:921;;;37034:13;-1:-1:-1;;;;;37026:21:0;:4;-1:-1:-1;;;;;37026:21:0;;:41;;;;;37066:1;37051:12;;:16;37026:41;37022:437;;;37095:33;37124:3;37095:24;37106:12;;37095:6;:10;;:24;;;;:::i;:33::-;37088:40;;37185:13;;37171:10;;37164:4;:17;;;;:::i;:::-;37163:35;;;;:::i;:::-;37147:13;:51;37271:13;;37249:18;;37242:25;;:4;:25;:::i;:::-;37241:43;;;;:::i;:::-;37217:21;:67;37351:12;;37332:15;;37325:22;;:4;:22;:::i;:::-;37324:39;;;;:::i;:::-;37303:18;:60;37431:12;;37412:15;;37405:22;;:4;:22;:::i;:::-;37404:39;;;;:::i;:::-;37383:18;:60;37022:437;37479:7;;37475:90;;37507:42;37523:4;37537;37544;37507:15;:42::i;:::-;37583:13;;:17;37579:152;;37621:58;37645:4;25519:6;37665:13;;37621:15;:58::i;:::-;37714:1;37698:13;:17;37579:152;37749:18;;:22;37745:169;;37792:65;37816:4;37823:13;37838:18;;37792:15;:65::i;:::-;37897:1;37876:18;:22;37745:169;37930:14;37940:4;37930:14;;:::i;:::-;;;36486:1470;37968:33;37984:4;37990:2;37994:6;37968:15;:33::i;:::-;33974:4035;;;;33861:4148;;;:::o;3633:191::-;3726:6;;;-1:-1:-1;;;;;3743:17:0;;;-1:-1:-1;;;;;;3743:17:0;;;;;;;3776:40;;3726:6;;;3743:17;3726:6;;3776:40;;3707:16;;3776:40;3696:128;3633:191;:::o;13579:733::-;-1:-1:-1;;;;;13719:20:0;;13711:70;;;;-1:-1:-1;;;13711:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13800:23:0;;13792:71;;;;-1:-1:-1;;;13792:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13960:17:0;;13936:21;13960:17;;;;;;;;;;;13996:23;;;;13988:74;;;;-1:-1:-1;;;13988:74:0;;13111:2:1;13988:74:0;;;13093:21:1;13150:2;13130:18;;;13123:30;13189:34;13169:18;;;13162:62;-1:-1:-1;;;13240:18:1;;;13233:36;13286:19;;13988:74:0;12909:402:1;13988:74:0;-1:-1:-1;;;;;14098:17:0;;;:9;:17;;;;;;;;;;;14118:22;;;14098:42;;14162:20;;;;;;;;:30;;14134:6;;14098:9;14162:30;;14134:6;;14162:30;:::i;:::-;;;;;;;;14227:9;-1:-1:-1;;;;;14210:35:0;14219:6;-1:-1:-1;;;;;14210:35:0;;14238:6;14210:35;;;;2033:25:1;;2021:2;2006:18;;1887:177;14210:35:0;;;;;;;;14258:46;33861:4148;39698:894;39781:4;39737:23;11171:18;;;;;;;;;;;39737:50;;39798:25;39850:18;;39826:21;;:42;;;;:::i;:::-;39798:70;-1:-1:-1;39879:12:0;39908:20;;;:46;;-1:-1:-1;39932:22:0;;39908:46;39904:85;;;39971:7;;;39698:894::o;39904:85::-;40023:18;;:23;;40044:2;40023:23;:::i;:::-;40005:15;:41;40001:115;;;40081:18;;:23;;40102:2;40081:23;:::i;:::-;40063:41;;40001:115;40128:33;40145:15;40128:16;:33::i;:::-;40174:18;40195:21;40174:42;;40229:26;40258:84;40314:17;40258:37;40273:21;;40258:10;:14;;:37;;;;:::i;:84::-;40359:19;;40229:113;;-1:-1:-1;40359:19:0;;:45;;;;;40403:1;40382:18;:22;40359:45;40355:116;;;40421:38;40440:18;40421;:38::i;:::-;40505:15;;40497:87;;-1:-1:-1;;;;;40505:15:0;;;;40548:21;;40497:87;;;;40548:21;40505:15;40497:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;39698:894:0:o;20891:98::-;20949:7;20976:5;20980:1;20976;:5;:::i;:::-;20969:12;20891:98;-1:-1:-1;;;20891:98:0:o;21290:::-;21348:7;21375:5;21379:1;21375;:5;:::i;38017:589::-;38167:16;;;38181:1;38167:16;;;;;;;;38143:21;;38167:16;;;;;;;;;;-1:-1:-1;38167:16:0;38143:40;;38212:4;38194;38199:1;38194:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;38194:23:0;;;-1:-1:-1;;;;;38194:23:0;;;;;38238:15;-1:-1:-1;;;;;38238:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38228:4;38233:1;38228:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;38228:32:0;;;-1:-1:-1;;;;;38228:32:0;;;;;38273:62;38290:4;38305:15;38323:11;38273:8;:62::i;:::-;38374:224;;-1:-1:-1;;;38374:224:0;;-1:-1:-1;;;;;38374:15:0;:66;;;;:224;;38455:11;;38481:1;;38525:4;;38552;;38572:15;;38374:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38072:534;38017:589;:::o;38614:1076::-;38705:16;;;38719:1;38705:16;;;;;;;;38681:21;;38705:16;;;;;;;;;;-1:-1:-1;38705:16:0;38681:40;;38742:15;-1:-1:-1;;;;;38742:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38732:4;38737:1;38732:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38732:32:0;;;:7;;;;;;;;;:32;38785:8;;38775:7;;38785:8;;;38775:4;;38785:8;;38775:7;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;38775:18:0;;;-1:-1:-1;;;;;38775:18:0;;;;;38881:15;-1:-1:-1;;;;;38881:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38874:75;;-1:-1:-1;;;38874:75:0;;-1:-1:-1;;;;;38921:15:0;15291:32:1;;38874:75:0;;;15273:51:1;15340:18;;;15333:34;;;38874:38:0;;;;;;;15246:18:1;;38874:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39052:46:0;;-1:-1:-1;;;39052:46:0;;39028:21;;-1:-1:-1;;;;;39052:15:0;:29;;;;:46;;39082:9;;39093:4;;39052:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39052:46:0;;;;;;;;;;;;:::i;:::-;39028:70;;39109:22;39134:7;39159:1;39142:7;:14;:18;;;;:::i;:::-;39134:27;;;;;;;;:::i;:::-;;;;;;;39109:52;;39174:15;-1:-1:-1;;;;;39174:66:0;;39248:9;39273:50;39317:5;39273:39;39295:16;;39273:17;:21;;:39;;;;:::i;:50::-;39414:4;39441;39461:15;39174:313;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39533:8:0;;39526:41;;-1:-1:-1;;;39526:41:0;;39561:4;39526:41;;;1825:51:1;39500:23:0;;-1:-1:-1;;;;;;39533:8:0;;;;-1:-1:-1;39526:26:0;;-1:-1:-1;1798:18:1;;39526:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39585:8;;39578:55;;-1:-1:-1;;;39578:55:0;;25519:6;39578:55;;;15273:51:1;15340:18;;;15333:34;;;39500:67:0;;-1:-1:-1;;;;;;39585:8:0;;39578:25;;15246:18:1;;39578:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39667:15;39644:19;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;38614:1076:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1400:247::-;1459:6;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1567:9;1554:23;1586:31;1611:5;1586:31;:::i;2069:456::-;2146:6;2154;2162;2215:2;2203:9;2194:7;2190:23;2186:32;2183:52;;;2231:1;2228;2221:12;2183:52;2270:9;2257:23;2289:31;2314:5;2289:31;:::i;:::-;2339:5;-1:-1:-1;2396:2:1;2381:18;;2368:32;2409:33;2368:32;2409:33;:::i;:::-;2069:456;;2461:7;;-1:-1:-1;;;2515:2:1;2500:18;;;;2487:32;;2069:456::o;2738:385::-;2824:6;2832;2840;2848;2901:3;2889:9;2880:7;2876:23;2872:33;2869:53;;;2918:1;2915;2908:12;2869:53;-1:-1:-1;;2941:23:1;;;3011:2;2996:18;;2983:32;;-1:-1:-1;3062:2:1;3047:18;;3034:32;;3113:2;3098:18;3085:32;;-1:-1:-1;2738:385:1;-1:-1:-1;2738:385:1:o;3317:118::-;3403:5;3396:13;3389:21;3382:5;3379:32;3369:60;;3425:1;3422;3415:12;3440:382;3505:6;3513;3566:2;3554:9;3545:7;3541:23;3537:32;3534:52;;;3582:1;3579;3572:12;3534:52;3621:9;3608:23;3640:31;3665:5;3640:31;:::i;:::-;3690:5;-1:-1:-1;3747:2:1;3732:18;;3719:32;3760:30;3719:32;3760:30;:::i;:::-;3809:7;3799:17;;;3440:382;;;;;:::o;3827:241::-;3883:6;3936:2;3924:9;3915:7;3911:23;3907:32;3904:52;;;3952:1;3949;3942:12;3904:52;3991:9;3978:23;4010:28;4032:5;4010:28;:::i;4073:388::-;4141:6;4149;4202:2;4190:9;4181:7;4177:23;4173:32;4170:52;;;4218:1;4215;4208:12;4170:52;4257:9;4244:23;4276:31;4301:5;4276:31;:::i;:::-;4326:5;-1:-1:-1;4383:2:1;4368:18;;4355:32;4396:33;4355:32;4396:33;:::i;4466:380::-;4545:1;4541:12;;;;4588;;;4609:61;;4663:4;4655:6;4651:17;4641:27;;4609:61;4716:2;4708:6;4705:14;4685:18;4682:38;4679:161;;4762:10;4757:3;4753:20;4750:1;4743:31;4797:4;4794:1;4787:15;4825:4;4822:1;4815:15;4679:161;;4466:380;;;:::o;4851:356::-;5053:2;5035:21;;;5072:18;;;5065:30;5131:34;5126:2;5111:18;;5104:62;5198:2;5183:18;;4851:356::o;5617:127::-;5678:10;5673:3;5669:20;5666:1;5659:31;5709:4;5706:1;5699:15;5733:4;5730:1;5723:15;5749:168;5822:9;;;5853;;5870:15;;;5864:22;;5850:37;5840:71;;5891:18;;:::i;5922:217::-;5962:1;5988;5978:132;;6032:10;6027:3;6023:20;6020:1;6013:31;6067:4;6064:1;6057:15;6095:4;6092:1;6085:15;5978:132;-1:-1:-1;6124:9:1;;5922:217::o;6969:125::-;7034:9;;;7055:10;;;7052:36;;;7068:18;;:::i;7503:469::-;7705:2;7687:21;;;7744:2;7724:18;;;7717:30;7783:34;7778:2;7763:18;;7756:62;7854:34;7849:2;7834:18;;7827:62;-1:-1:-1;;;7920:3:1;7905:19;;7898:32;7962:3;7947:19;;7503:469::o;10845:401::-;11047:2;11029:21;;;11086:2;11066:18;;;11059:30;11125:34;11120:2;11105:18;;11098:62;-1:-1:-1;;;11191:2:1;11176:18;;11169:35;11236:3;11221:19;;10845:401::o;11251:399::-;11453:2;11435:21;;;11492:2;11472:18;;;11465:30;11531:34;11526:2;11511:18;;11504:62;-1:-1:-1;;;11597:2:1;11582:18;;11575:33;11640:3;11625:19;;11251:399::o;12776:128::-;12843:9;;;12864:11;;;12861:37;;;12878:18;;:::i;13526:127::-;13587:10;13582:3;13578:20;13575:1;13568:31;13618:4;13615:1;13608:15;13642:4;13639:1;13632:15;13658:127;13719:10;13714:3;13710:20;13707:1;13700:31;13750:4;13747:1;13740:15;13774:4;13771:1;13764:15;13790:251;13860:6;13913:2;13901:9;13892:7;13888:23;13884:32;13881:52;;;13929:1;13926;13919:12;13881:52;13961:9;13955:16;13980:31;14005:5;13980:31;:::i;14046:461::-;14099:3;14137:5;14131:12;14164:6;14159:3;14152:19;14190:4;14219:2;14214:3;14210:12;14203:19;;14256:2;14249:5;14245:14;14277:1;14287:195;14301:6;14298:1;14295:13;14287:195;;;14366:13;;-1:-1:-1;;;;;14362:39:1;14350:52;;14422:12;;;;14457:15;;;;14398:1;14316:9;14287:195;;;-1:-1:-1;14498:3:1;;14046:461;-1:-1:-1;;;;;14046:461:1:o;14512:582::-;14811:6;14800:9;14793:25;14854:6;14849:2;14838:9;14834:18;14827:34;14897:3;14892:2;14881:9;14877:18;14870:31;14774:4;14918:57;14970:3;14959:9;14955:19;14947:6;14918:57;:::i;:::-;-1:-1:-1;;;;;15011:32:1;;;;15006:2;14991:18;;14984:60;-1:-1:-1;15075:3:1;15060:19;15053:35;14910:65;14512:582;-1:-1:-1;;;14512:582:1:o;15378:245::-;15445:6;15498:2;15486:9;15477:7;15473:23;15469:32;15466:52;;;15514:1;15511;15504:12;15466:52;15546:9;15540:16;15565:28;15587:5;15565:28;:::i;15628:332::-;15835:6;15824:9;15817:25;15878:2;15873;15862:9;15858:18;15851:30;15798:4;15898:56;15950:2;15939:9;15935:18;15927:6;15898:56;:::i;:::-;15890:64;15628:332;-1:-1:-1;;;;15628:332:1:o;15965:1105::-;16060:6;16091:2;16134;16122:9;16113:7;16109:23;16105:32;16102:52;;;16150:1;16147;16140:12;16102:52;16183:9;16177:16;16212:18;16253:2;16245:6;16242:14;16239:34;;;16269:1;16266;16259:12;16239:34;16307:6;16296:9;16292:22;16282:32;;16352:7;16345:4;16341:2;16337:13;16333:27;16323:55;;16374:1;16371;16364:12;16323:55;16403:2;16397:9;16425:2;16421;16418:10;16415:36;;;16431:18;;:::i;:::-;16477:2;16474:1;16470:10;16509:2;16503:9;16572:2;16568:7;16563:2;16559;16555:11;16551:25;16543:6;16539:38;16627:6;16615:10;16612:22;16607:2;16595:10;16592:18;16589:46;16586:72;;;16638:18;;:::i;:::-;16674:2;16667:22;16724:18;;;16758:15;;;;-1:-1:-1;16800:11:1;;;16796:20;;;16828:19;;;16825:39;;;16860:1;16857;16850:12;16825:39;16884:11;;;;16904:135;16920:6;16915:3;16912:15;16904:135;;;16986:10;;16974:23;;16937:12;;;;17017;;;;16904:135;;;17058:6;15965:1105;-1:-1:-1;;;;;;;;15965:1105:1:o;17075:502::-;17338:6;17327:9;17320:25;17381:3;17376:2;17365:9;17361:18;17354:31;17301:4;17402:57;17454:3;17443:9;17439:19;17431:6;17402:57;:::i;:::-;-1:-1:-1;;;;;17495:32:1;;;;17490:2;17475:18;;17468:60;-1:-1:-1;17559:2:1;17544:18;17537:34;17394:65;17075:502;-1:-1:-1;;17075:502:1:o;17582:184::-;17652:6;17705:2;17693:9;17684:7;17680:23;17676:32;17673:52;;;17721:1;17718;17711:12;17673:52;-1:-1:-1;17744:16:1;;17582:184;-1:-1:-1;17582:184:1:o

Swarm Source

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