ETH Price: $3,278.29 (-0.04%)
Gas: 12 Gwei

Token

Univel (VEL)
 

Overview

Max Total Supply

500,000,000 VEL

Holders

127

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
262,500 VEL

Value
$0.00
0xd4331b54FC2EB9c306340D604981AF95dD744A23
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:
VEL

Compiler Version
v0.8.17+commit.8df45f5f

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-30
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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


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

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

/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

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

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @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 subtraction 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 DexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

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

    function WETH() external pure returns (address);

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

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

contract VEL is ERC20, Ownable {
    struct Tax {
        uint256 marketingTax;
        uint256 liquidityTax;
    }

    uint256 private constant _totalSupply = 500_000_000 * 1e18;

    //Router
    DexRouter public uniswapRouter;
    address public pairAddress;

    //Taxes
    Tax public buyTaxes = Tax(4, 1);
    Tax public sellTaxes = Tax(4, 1);
    Tax public transferTaxes = Tax(0, 0);

    uint256 public totalBuyFees = 5;
    uint256 public totalSellFees = 5;
    uint256 public totalTransferFees = 0;

    //Whitelisting from taxes/maxwallet/txlimit/etc
    mapping(address => bool) private whitelisted;

    //Swapping
    uint256 public swapTokensAtAmount = _totalSupply / 100000; //after 0.001% of total supply, swap them
    bool public swapAndLiquifyEnabled = true;
    bool public isSwapping = false;

    //Wallets
    address public marketingWallet = 0x4DFA70E370E068088aac2f9ACfd56228E8Bb2791;

    //Events
    event SwapThresholdUpdated(uint256 indexed _newThreshold);
    event InternalSwapStatusUpdated(bool indexed _status);
    event Whitelist(address indexed _target, bool indexed _status);

    bool public initialized = false;

    constructor() ERC20("Univel", "VEL") {
    }

    function initialize() public onlyOwner {
        require(!initialized, "Can't initialize again!");
        address newOwner = 0x37737211331C98FdE68c67117Fca373aa80B0588;
        uniswapRouter = DexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pairAddress = DexFactory(uniswapRouter.factory()).createPair(address(this), uniswapRouter.WETH());
        whitelisted[address(uniswapRouter)] = true;
        whitelisted[address(this)] = true;
        whitelisted[newOwner] = true;
        _mint(newOwner, _totalSupply);
        transferOwnership(newOwner);
        initialized = true;
    }

    function setMarketingWallet(address _newmarketing) external onlyOwner {
        require(_newmarketing != address(0), "can not set marketing to dead wallet");
        marketingWallet = _newmarketing;
    }

    function setSwapTokensAtAmount(uint256 _newAmount) external onlyOwner {
        require(
            _newAmount > 0 && _newAmount <= (_totalSupply * 1) / 100,
            "VEL : Minimum swap amount must be greater than 0 and less than 1% of total supply!"
        );
        swapTokensAtAmount = _newAmount;
        emit SwapThresholdUpdated(swapTokensAtAmount);
    }

    function toggleSwapping() external onlyOwner {
        swapAndLiquifyEnabled = (swapAndLiquifyEnabled) ? false : true;
    }

    function setWhitelistStatus(address _wallet, bool _status) external onlyOwner {
        whitelisted[_wallet] = _status;
        emit Whitelist(_wallet, _status);
    }

    function checkWhitelist(address _wallet) external view returns (bool) {
        return whitelisted[_wallet];
    }

    function setBuyTaxes(uint256 _lpTax, uint256 _marketingTax) external onlyOwner {
        buyTaxes.marketingTax = _marketingTax;
        buyTaxes.liquidityTax = _lpTax;
        totalBuyFees = _lpTax + _marketingTax;
        require(totalBuyFees + totalSellFees <= 20, "Can not set buy fees higher than 25%");
    }

    function setSellTaxes(uint256 _lpTax, uint256 _marketingTax) external onlyOwner {
        sellTaxes.marketingTax = _marketingTax;
        sellTaxes.liquidityTax = _lpTax;
        totalSellFees = _lpTax + _marketingTax;
        require(totalBuyFees + totalSellFees <= 20, "Can not set buy fees higher than 25%");
    }

    function setTransferTaxes(uint256 _lpTax, uint256 _marketingTax) external onlyOwner {
        transferTaxes.marketingTax = _marketingTax;
        transferTaxes.liquidityTax = _lpTax;
        totalTransferFees = _lpTax + _marketingTax;
        require(totalTransferFees <= 10, "Can not set transfer tax higher than 10%");
    }

    function _takeTax(address _from, address _to, uint256 _amount) internal returns (uint256) {
        if (whitelisted[_from] || whitelisted[_to]) {
            return _amount;
        }
        uint256 totalTax = totalTransferFees;

        if (_to == pairAddress) {
            totalTax = totalSellFees;
        } else if (_from == pairAddress) {
            totalTax = totalBuyFees;
        }

        uint256 tax = 0;
        if (totalTax > 0) {
            tax = (_amount * totalTax) / 100;
            super._transfer(_from, address(this), tax);
        }
        return (_amount - tax);
    }

    function _transfer(address _from, address _to, uint256 _amount) internal virtual override {
        require(_from != address(0), "transfer from address zero");
        require(_to != address(0), "transfer to address zero");
        uint256 toTransfer = _takeTax(_from, _to, _amount);

        bool canSwap = balanceOf(address(this)) >= swapTokensAtAmount;
        if (
            swapAndLiquifyEnabled && pairAddress != _from && canSwap && !whitelisted[_from] && !whitelisted[_to]
                && !isSwapping
        ) {
            isSwapping = true;
            internalSwap();
            isSwapping = false;
        }
        super._transfer(_from, _to, toTransfer);
    }

    function internalSwap() internal {
        uint256 taxAmount = balanceOf(address(this));
        if (taxAmount == 0) {
            return;
        }
        //Getting total Fee Percentages And Caclculating Portinos for each tax type
        Tax memory bt = buyTaxes;
        Tax memory st = sellTaxes;
        Tax memory tt = transferTaxes;

        uint256 totalTaxes = totalBuyFees + totalSellFees + totalTransferFees;

        if (totalTaxes == 0) {
            return;
        }

        uint256 totalLPTax = bt.liquidityTax + st.liquidityTax + tt.liquidityTax;

        uint256 lpPortion = (taxAmount * totalLPTax) / totalTaxes;
        uint256 marketingPortion = taxAmount - lpPortion;

        if (lpPortion > 0) {
            swapAndLiquify(lpPortion);
        }

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

    function swapAndLiquify(uint256 _amount) internal {
        uint256 firstHalf = _amount / 2;
        uint256 otherHalf = _amount - firstHalf;
        uint256 initialETHBalance = address(this).balance;

        //Swapping first half to ETH
        swapToETH(firstHalf);
        uint256 received = address(this).balance - initialETHBalance;
        addLiquidity(otherHalf, received);
    }

    function swapToETH(uint256 _amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        _approve(address(this), address(uniswapRouter), _amount);
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _amount, 0, path, address(this), block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        _approve(address(this), address(uniswapRouter), tokenAmount);
        uniswapRouter.addLiquidityETH{value: ETHAmount}(
            address(this), tokenAmount, 0, 0, 0x000000000000000000000000000000000000dEaD, block.timestamp
        );
    }

    function withdrawStuckETH() external onlyOwner {
        (bool success,) = address(msg.sender).call{value: address(this).balance}("");
        require(success, "transferring ETH failed");
    }

    function withdrawStuckTokens(address erc20_token) external onlyOwner {
        bool success = IERC20(erc20_token).transfer(msg.sender, IERC20(erc20_token).balanceOf(address(this)));
        require(success, "trasfering tokens failed!");
    }

    receive() external payable {}
}

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":"bool","name":"_status","type":"bool"}],"name":"InternalSwapStatusUpdated","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":"uint256","name":"_newThreshold","type":"uint256"}],"name":"SwapThresholdUpdated","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":"_target","type":"address"},{"indexed":true,"internalType":"bool","name":"_status","type":"bool"}],"name":"Whitelist","type":"event"},{"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":"buyTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapping","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":"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":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTax","type":"uint256"},{"internalType":"uint256","name":"_marketingTax","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newmarketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTax","type":"uint256"},{"internalType":"uint256","name":"_marketingTax","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTax","type":"uint256"},{"internalType":"uint256","name":"_marketingTax","type":"uint256"}],"name":"setTransferTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","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":"toggleSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","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":"totalTransferFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract DexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60046080819052600160a08190526008829055600981905560c082905260e0819052600a91909155600b556101406040526000610100819052610120819052600c819055600d8190556005600e819055600f5560105562000070620186a06b019d971e4fe8401e740000006200017d565b601255601380546001600160b81b031916754dfa70e370e068088aac2f9acfd56228e8bb27910001179055348015620000a857600080fd5b5060405180604001604052806006815260200165155b9a5d995b60d21b8152506040518060400160405280600381526020016215915360ea1b8152508160039081620000f5919062000245565b50600462000104828262000245565b505050620001216200011b6200012760201b60201c565b6200012b565b62000311565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826200019b57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001cb57607f821691505b602082108103620001ec57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024057600081815260208120601f850160051c810160208610156200021b5750805b601f850160051c820191505b818110156200023c5782815560010162000227565b5050505b505050565b81516001600160401b03811115620002615762000261620001a0565b6200027981620002728454620001b6565b84620001f2565b602080601f831160018114620002b15760008415620002985750858301515b600019600386901b1c1916600185901b1785556200023c565b600085815260208120601f198616915b82811015620002e257888601518255948401946001909101908401620002c1565b5085821015620003015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611f4480620003216000396000f3fe6080604052600436106102295760003560e01c80638da5cb5b11610123578063b9e93700116100ab578063ecc8aeff1161006f578063ecc8aeff14610678578063ef586f7114610698578063f2fde38b146106ad578063f5648a4f146106cd578063f66895a3146106e257600080fd5b8063b9e93700146105f6578063cb9637281461060c578063d0a398141461062c578063dd62ed3e14610642578063e2f456051461066257600080fd5b8063a8b08982116100f2578063a8b0898214610557578063a9059cbb14610577578063aa35822c14610597578063afa4f3b2146105b7578063b8863115146105d757600080fd5b80638da5cb5b146104e457806395d89b4114610502578063a11a168214610517578063a457c2d71461053757600080fd5b806339509351116101b1578063715018a611610175578063715018a614610441578063735de9f71461045657806375f0a8741461048e5780638129fc1c146104b4578063864701a5146104c957600080fd5b806339509351146103815780634a74bb02146103a15780635331803c146103bb5780635d098b38146103eb57806370a082311461040b57600080fd5b8063158ef93e116101f8578063158ef93e146102d657806318160ddd146102f75780631950c2181461030c57806323b872dd14610345578063313ce5671461036557600080fd5b806306fdde0314610235578063095ea7b3146102605780630c424284146102905780630e5d0e45146102b257600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a6106fd565b6040516102579190611bba565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004611c1d565b61078f565b6040519015158152602001610257565b34801561029c57600080fd5b506102b06102ab366004611c57565b6107a9565b005b3480156102be57600080fd5b506102c860105481565b604051908152602001610257565b3480156102e257600080fd5b5060135461028090600160b01b900460ff1681565b34801561030357600080fd5b506002546102c8565b34801561031857600080fd5b50610280610327366004611c90565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561035157600080fd5b50610280610360366004611cad565b610805565b34801561037157600080fd5b5060405160128152602001610257565b34801561038d57600080fd5b5061028061039c366004611c1d565b61082b565b3480156103ad57600080fd5b506013546102809060ff1681565b3480156103c757600080fd5b50600c54600d546103d6919082565b60408051928352602083019190915201610257565b3480156103f757600080fd5b506102b0610406366004611c90565b61084d565b34801561041757600080fd5b506102c8610426366004611c90565b6001600160a01b031660009081526020819052604090205490565b34801561044d57600080fd5b506102b06108e6565b34801561046257600080fd5b50600654610476906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561049a57600080fd5b50601354610476906201000090046001600160a01b031681565b3480156104c057600080fd5b506102b06108fa565b3480156104d557600080fd5b506008546009546103d6919082565b3480156104f057600080fd5b506005546001600160a01b0316610476565b34801561050e57600080fd5b5061024a610b83565b34801561052357600080fd5b506102b0610532366004611cee565b610b92565b34801561054357600080fd5b50610280610552366004611c1d565b610c20565b34801561056357600080fd5b50600754610476906001600160a01b031681565b34801561058357600080fd5b50610280610592366004611c1d565b610ca6565b3480156105a357600080fd5b506102b06105b2366004611cee565b610cb4565b3480156105c357600080fd5b506102b06105d2366004611d10565b610ce5565b3480156105e357600080fd5b5060135461028090610100900460ff1681565b34801561060257600080fd5b506102c8600e5481565b34801561061857600080fd5b506102b0610627366004611c90565b610ddf565b34801561063857600080fd5b506102c8600f5481565b34801561064e57600080fd5b506102c861065d366004611d29565b610f1a565b34801561066e57600080fd5b506102c860125481565b34801561068457600080fd5b506102b0610693366004611cee565b610f45565b3480156106a457600080fd5b506102b0610fc7565b3480156106b957600080fd5b506102b06106c8366004611c90565b610ff6565b3480156106d957600080fd5b506102b061106f565b3480156106ee57600080fd5b50600a54600b546103d6919082565b60606003805461070c90611d57565b80601f016020809104026020016040519081016040528092919081815260200182805461073890611d57565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b60003361079d81858561110f565b60019150505b92915050565b6107b1611233565b6001600160a01b038216600081815260116020526040808220805460ff191685151590811790915590519092917f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d91a35050565b60003361081385828561128d565b61081e858585611307565b60019150505b9392505050565b60003361079d81858561083e8383610f1a565b6108489190611da7565b61110f565b610855611233565b6001600160a01b0381166108bc5760405162461bcd60e51b8152602060048201526024808201527f63616e206e6f7420736574206d61726b6574696e6720746f20646561642077616044820152631b1b195d60e21b60648201526084015b60405180910390fd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6108ee611233565b6108f8600061149a565b565b610902611233565b601354600160b01b900460ff161561095c5760405162461bcd60e51b815260206004820152601760248201527f43616e277420696e697469616c697a6520616761696e2100000000000000000060448201526064016108b3565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b815290517337737211331c98fde68c67117fca373aa80b0588929163c45a01559160048083019260209291908290030181865afa1580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fa9190611dba565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a809190611dba565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611dba565b600780546001600160a01b0319166001600160a01b039283161790556006548116600090815260116020526040808220805460ff1990811660019081179092553084528284208054821683179055938516835291208054909216179055610b64816b019d971e4fe8401e740000006114ec565b610b6d81610ff6565b506013805460ff60b01b1916600160b01b179055565b60606004805461070c90611d57565b610b9a611233565b600a819055600b829055610bae8183611da7565b600f819055600e54601491610bc291611da7565b1115610c1c5760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f742073657420627579206665657320686967686572207468616e6044820152632032352560e01b60648201526084016108b3565b5050565b60003381610c2e8286610f1a565b905083811015610c8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108b3565b610c9b828686840361110f565b506001949350505050565b60003361079d818585611307565b610cbc611233565b60088190556009829055610cd08183611da7565b600e819055600f54601491610bc29190611da7565b610ced611233565b600081118015610d1f57506064610d116b019d971e4fe8401e740000006001611dd7565b610d1b9190611dee565b8111155b610dac5760405162461bcd60e51b815260206004820152605260248201527f56454c203a204d696e696d756d207377617020616d6f756e74206d757374206260448201527f652067726561746572207468616e203020616e64206c657373207468616e203160648201527125206f6620746f74616c20737570706c792160701b608482015260a4016108b3565b601281905560405181907f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647690600090a250565b610de7611233565b6040516370a0823160e01b81523060048201526000906001600160a01b0383169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190611e10565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611e29565b905080610c1c5760405162461bcd60e51b815260206004820152601960248201527f74726173666572696e6720746f6b656e73206661696c6564210000000000000060448201526064016108b3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610f4d611233565b600c819055600d829055610f618183611da7565b6010819055600a1015610c1c5760405162461bcd60e51b815260206004820152602860248201527f43616e206e6f7420736574207472616e736665722074617820686967686572206044820152677468616e2031302560c01b60648201526084016108b3565b610fcf611233565b60135460ff16610fe0576001610fe3565b60005b6013805460ff1916911515919091179055565b610ffe611233565b6001600160a01b0381166110635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b3565b61106c8161149a565b50565b611077611233565b604051600090339047908381818185875af1925050503d80600081146110b9576040519150601f19603f3d011682016040523d82523d6000602084013e6110be565b606091505b505090508061106c5760405162461bcd60e51b815260206004820152601760248201527f7472616e7366657272696e6720455448206661696c656400000000000000000060448201526064016108b3565b6001600160a01b0383166111715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108b3565b6001600160a01b0382166111d25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108b3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146108f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b3565b60006112998484610f1a565b9050600019811461130157818110156112f45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108b3565b611301848484840361110f565b50505050565b6001600160a01b03831661135d5760405162461bcd60e51b815260206004820152601a60248201527f7472616e736665722066726f6d2061646472657373207a65726f00000000000060448201526064016108b3565b6001600160a01b0382166113b35760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220746f2061646472657373207a65726f000000000000000060448201526064016108b3565b60006113c08484846115ab565b6012543060009081526020819052604090205460135492935010159060ff1680156113f957506007546001600160a01b03868116911614155b80156114025750805b801561142757506001600160a01b03851660009081526011602052604090205460ff16155b801561144c57506001600160a01b03841660009081526011602052604090205460ff16155b80156114605750601354610100900460ff16155b15611488576013805461ff00191661010017905561147c611672565b6013805461ff00191690555b6114938585846117d2565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166115425760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108b3565b80600260008282546115549190611da7565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b03831660009081526011602052604081205460ff16806115ea57506001600160a01b03831660009081526011602052604090205460ff165b156115f6575080610824565b6010546007546001600160a01b03908116908516036116185750600f54611633565b6007546001600160a01b03908116908616036116335750600e545b6000811561165e5760646116478386611dd7565b6116519190611dee565b905061165e8630836117d2565b6116688185611e46565b9695505050505050565b306000908152602081905260408120549081900361168d5750565b604080518082018252600854815260095460208083019190915282518084018452600a548152600b54818301528351808501909452600c548452600d5491840191909152601054600f54600e5493949293600092916116eb91611da7565b6116f59190611da7565b905080600003611706575050505050565b60008260200151846020015186602001516117219190611da7565b61172b9190611da7565b905060008261173a8389611dd7565b6117449190611dee565b905060006117528289611e46565b905081156117635761176382611976565b61176c816119b5565b6013546040516000916201000090046001600160a01b03169047908381818185875af1925050503d80600081146117bf576040519150601f19603f3d011682016040523d82523d6000602084013e6117c4565b606091505b505050505050505050505050565b6001600160a01b0383166118365760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108b3565b6001600160a01b0382166118985760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108b3565b6001600160a01b038316600090815260208190526040902054818110156119105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108b3565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611301565b6000611983600283611dee565b905060006119918284611e46565b90504761199d836119b5565b60006119a98247611e46565b90506114938382611b0f565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119ea576119ea611e59565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190611dba565b81600181518110611a7a57611a7a611e59565b6001600160a01b039283166020918202929092010152600654611aa0913091168461110f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ad9908590600090869030904290600401611e6f565b600060405180830381600087803b158015611af357600080fd5b505af1158015611b07573d6000803e3d6000fd5b505050505050565b600654611b279030906001600160a01b03168461110f565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015611b95573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114939190611ee0565b600060208083528351808285015260005b81811015611be757858101830151858201604001528201611bcb565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461106c57600080fd5b60008060408385031215611c3057600080fd5b8235611c3b81611c08565b946020939093013593505050565b801515811461106c57600080fd5b60008060408385031215611c6a57600080fd5b8235611c7581611c08565b91506020830135611c8581611c49565b809150509250929050565b600060208284031215611ca257600080fd5b813561082481611c08565b600080600060608486031215611cc257600080fd5b8335611ccd81611c08565b92506020840135611cdd81611c08565b929592945050506040919091013590565b60008060408385031215611d0157600080fd5b50508035926020909101359150565b600060208284031215611d2257600080fd5b5035919050565b60008060408385031215611d3c57600080fd5b8235611d4781611c08565b91506020830135611c8581611c08565b600181811c90821680611d6b57607f821691505b602082108103611d8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107a3576107a3611d91565b600060208284031215611dcc57600080fd5b815161082481611c08565b80820281158282048414176107a3576107a3611d91565b600082611e0b57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611e2257600080fd5b5051919050565b600060208284031215611e3b57600080fd5b815161082481611c49565b818103818111156107a3576107a3611d91565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611ebf5784516001600160a01b031683529383019391830191600101611e9a565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611ef557600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220209f39af7074e167b3ee5c5503a72481a26d517c9cd3007099b7bfadc4d7b55264736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80638da5cb5b11610123578063b9e93700116100ab578063ecc8aeff1161006f578063ecc8aeff14610678578063ef586f7114610698578063f2fde38b146106ad578063f5648a4f146106cd578063f66895a3146106e257600080fd5b8063b9e93700146105f6578063cb9637281461060c578063d0a398141461062c578063dd62ed3e14610642578063e2f456051461066257600080fd5b8063a8b08982116100f2578063a8b0898214610557578063a9059cbb14610577578063aa35822c14610597578063afa4f3b2146105b7578063b8863115146105d757600080fd5b80638da5cb5b146104e457806395d89b4114610502578063a11a168214610517578063a457c2d71461053757600080fd5b806339509351116101b1578063715018a611610175578063715018a614610441578063735de9f71461045657806375f0a8741461048e5780638129fc1c146104b4578063864701a5146104c957600080fd5b806339509351146103815780634a74bb02146103a15780635331803c146103bb5780635d098b38146103eb57806370a082311461040b57600080fd5b8063158ef93e116101f8578063158ef93e146102d657806318160ddd146102f75780631950c2181461030c57806323b872dd14610345578063313ce5671461036557600080fd5b806306fdde0314610235578063095ea7b3146102605780630c424284146102905780630e5d0e45146102b257600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a6106fd565b6040516102579190611bba565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004611c1d565b61078f565b6040519015158152602001610257565b34801561029c57600080fd5b506102b06102ab366004611c57565b6107a9565b005b3480156102be57600080fd5b506102c860105481565b604051908152602001610257565b3480156102e257600080fd5b5060135461028090600160b01b900460ff1681565b34801561030357600080fd5b506002546102c8565b34801561031857600080fd5b50610280610327366004611c90565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561035157600080fd5b50610280610360366004611cad565b610805565b34801561037157600080fd5b5060405160128152602001610257565b34801561038d57600080fd5b5061028061039c366004611c1d565b61082b565b3480156103ad57600080fd5b506013546102809060ff1681565b3480156103c757600080fd5b50600c54600d546103d6919082565b60408051928352602083019190915201610257565b3480156103f757600080fd5b506102b0610406366004611c90565b61084d565b34801561041757600080fd5b506102c8610426366004611c90565b6001600160a01b031660009081526020819052604090205490565b34801561044d57600080fd5b506102b06108e6565b34801561046257600080fd5b50600654610476906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561049a57600080fd5b50601354610476906201000090046001600160a01b031681565b3480156104c057600080fd5b506102b06108fa565b3480156104d557600080fd5b506008546009546103d6919082565b3480156104f057600080fd5b506005546001600160a01b0316610476565b34801561050e57600080fd5b5061024a610b83565b34801561052357600080fd5b506102b0610532366004611cee565b610b92565b34801561054357600080fd5b50610280610552366004611c1d565b610c20565b34801561056357600080fd5b50600754610476906001600160a01b031681565b34801561058357600080fd5b50610280610592366004611c1d565b610ca6565b3480156105a357600080fd5b506102b06105b2366004611cee565b610cb4565b3480156105c357600080fd5b506102b06105d2366004611d10565b610ce5565b3480156105e357600080fd5b5060135461028090610100900460ff1681565b34801561060257600080fd5b506102c8600e5481565b34801561061857600080fd5b506102b0610627366004611c90565b610ddf565b34801561063857600080fd5b506102c8600f5481565b34801561064e57600080fd5b506102c861065d366004611d29565b610f1a565b34801561066e57600080fd5b506102c860125481565b34801561068457600080fd5b506102b0610693366004611cee565b610f45565b3480156106a457600080fd5b506102b0610fc7565b3480156106b957600080fd5b506102b06106c8366004611c90565b610ff6565b3480156106d957600080fd5b506102b061106f565b3480156106ee57600080fd5b50600a54600b546103d6919082565b60606003805461070c90611d57565b80601f016020809104026020016040519081016040528092919081815260200182805461073890611d57565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b60003361079d81858561110f565b60019150505b92915050565b6107b1611233565b6001600160a01b038216600081815260116020526040808220805460ff191685151590811790915590519092917f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d91a35050565b60003361081385828561128d565b61081e858585611307565b60019150505b9392505050565b60003361079d81858561083e8383610f1a565b6108489190611da7565b61110f565b610855611233565b6001600160a01b0381166108bc5760405162461bcd60e51b8152602060048201526024808201527f63616e206e6f7420736574206d61726b6574696e6720746f20646561642077616044820152631b1b195d60e21b60648201526084015b60405180910390fd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6108ee611233565b6108f8600061149a565b565b610902611233565b601354600160b01b900460ff161561095c5760405162461bcd60e51b815260206004820152601760248201527f43616e277420696e697469616c697a6520616761696e2100000000000000000060448201526064016108b3565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b815290517337737211331c98fde68c67117fca373aa80b0588929163c45a01559160048083019260209291908290030181865afa1580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fa9190611dba565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a809190611dba565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611dba565b600780546001600160a01b0319166001600160a01b039283161790556006548116600090815260116020526040808220805460ff1990811660019081179092553084528284208054821683179055938516835291208054909216179055610b64816b019d971e4fe8401e740000006114ec565b610b6d81610ff6565b506013805460ff60b01b1916600160b01b179055565b60606004805461070c90611d57565b610b9a611233565b600a819055600b829055610bae8183611da7565b600f819055600e54601491610bc291611da7565b1115610c1c5760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f742073657420627579206665657320686967686572207468616e6044820152632032352560e01b60648201526084016108b3565b5050565b60003381610c2e8286610f1a565b905083811015610c8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108b3565b610c9b828686840361110f565b506001949350505050565b60003361079d818585611307565b610cbc611233565b60088190556009829055610cd08183611da7565b600e819055600f54601491610bc29190611da7565b610ced611233565b600081118015610d1f57506064610d116b019d971e4fe8401e740000006001611dd7565b610d1b9190611dee565b8111155b610dac5760405162461bcd60e51b815260206004820152605260248201527f56454c203a204d696e696d756d207377617020616d6f756e74206d757374206260448201527f652067726561746572207468616e203020616e64206c657373207468616e203160648201527125206f6620746f74616c20737570706c792160701b608482015260a4016108b3565b601281905560405181907f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647690600090a250565b610de7611233565b6040516370a0823160e01b81523060048201526000906001600160a01b0383169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190611e10565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611e29565b905080610c1c5760405162461bcd60e51b815260206004820152601960248201527f74726173666572696e6720746f6b656e73206661696c6564210000000000000060448201526064016108b3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610f4d611233565b600c819055600d829055610f618183611da7565b6010819055600a1015610c1c5760405162461bcd60e51b815260206004820152602860248201527f43616e206e6f7420736574207472616e736665722074617820686967686572206044820152677468616e2031302560c01b60648201526084016108b3565b610fcf611233565b60135460ff16610fe0576001610fe3565b60005b6013805460ff1916911515919091179055565b610ffe611233565b6001600160a01b0381166110635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b3565b61106c8161149a565b50565b611077611233565b604051600090339047908381818185875af1925050503d80600081146110b9576040519150601f19603f3d011682016040523d82523d6000602084013e6110be565b606091505b505090508061106c5760405162461bcd60e51b815260206004820152601760248201527f7472616e7366657272696e6720455448206661696c656400000000000000000060448201526064016108b3565b6001600160a01b0383166111715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108b3565b6001600160a01b0382166111d25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108b3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146108f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b3565b60006112998484610f1a565b9050600019811461130157818110156112f45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108b3565b611301848484840361110f565b50505050565b6001600160a01b03831661135d5760405162461bcd60e51b815260206004820152601a60248201527f7472616e736665722066726f6d2061646472657373207a65726f00000000000060448201526064016108b3565b6001600160a01b0382166113b35760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220746f2061646472657373207a65726f000000000000000060448201526064016108b3565b60006113c08484846115ab565b6012543060009081526020819052604090205460135492935010159060ff1680156113f957506007546001600160a01b03868116911614155b80156114025750805b801561142757506001600160a01b03851660009081526011602052604090205460ff16155b801561144c57506001600160a01b03841660009081526011602052604090205460ff16155b80156114605750601354610100900460ff16155b15611488576013805461ff00191661010017905561147c611672565b6013805461ff00191690555b6114938585846117d2565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166115425760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108b3565b80600260008282546115549190611da7565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b03831660009081526011602052604081205460ff16806115ea57506001600160a01b03831660009081526011602052604090205460ff165b156115f6575080610824565b6010546007546001600160a01b03908116908516036116185750600f54611633565b6007546001600160a01b03908116908616036116335750600e545b6000811561165e5760646116478386611dd7565b6116519190611dee565b905061165e8630836117d2565b6116688185611e46565b9695505050505050565b306000908152602081905260408120549081900361168d5750565b604080518082018252600854815260095460208083019190915282518084018452600a548152600b54818301528351808501909452600c548452600d5491840191909152601054600f54600e5493949293600092916116eb91611da7565b6116f59190611da7565b905080600003611706575050505050565b60008260200151846020015186602001516117219190611da7565b61172b9190611da7565b905060008261173a8389611dd7565b6117449190611dee565b905060006117528289611e46565b905081156117635761176382611976565b61176c816119b5565b6013546040516000916201000090046001600160a01b03169047908381818185875af1925050503d80600081146117bf576040519150601f19603f3d011682016040523d82523d6000602084013e6117c4565b606091505b505050505050505050505050565b6001600160a01b0383166118365760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108b3565b6001600160a01b0382166118985760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108b3565b6001600160a01b038316600090815260208190526040902054818110156119105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108b3565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611301565b6000611983600283611dee565b905060006119918284611e46565b90504761199d836119b5565b60006119a98247611e46565b90506114938382611b0f565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106119ea576119ea611e59565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190611dba565b81600181518110611a7a57611a7a611e59565b6001600160a01b039283166020918202929092010152600654611aa0913091168461110f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611ad9908590600090869030904290600401611e6f565b600060405180830381600087803b158015611af357600080fd5b505af1158015611b07573d6000803e3d6000fd5b505050505050565b600654611b279030906001600160a01b03168461110f565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015611b95573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114939190611ee0565b600060208083528351808285015260005b81811015611be757858101830151858201604001528201611bcb565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461106c57600080fd5b60008060408385031215611c3057600080fd5b8235611c3b81611c08565b946020939093013593505050565b801515811461106c57600080fd5b60008060408385031215611c6a57600080fd5b8235611c7581611c08565b91506020830135611c8581611c49565b809150509250929050565b600060208284031215611ca257600080fd5b813561082481611c08565b600080600060608486031215611cc257600080fd5b8335611ccd81611c08565b92506020840135611cdd81611c08565b929592945050506040919091013590565b60008060408385031215611d0157600080fd5b50508035926020909101359150565b600060208284031215611d2257600080fd5b5035919050565b60008060408385031215611d3c57600080fd5b8235611d4781611c08565b91506020830135611c8581611c08565b600181811c90821680611d6b57607f821691505b602082108103611d8b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107a3576107a3611d91565b600060208284031215611dcc57600080fd5b815161082481611c08565b80820281158282048414176107a3576107a3611d91565b600082611e0b57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611e2257600080fd5b5051919050565b600060208284031215611e3b57600080fd5b815161082481611c49565b818103818111156107a3576107a3611d91565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611ebf5784516001600160a01b031683529383019391830191600101611e9a565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611ef557600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220209f39af7074e167b3ee5c5503a72481a26d517c9cd3007099b7bfadc4d7b55264736f6c63430008110033

Deployed Bytecode Sourcemap

26954:7793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6024:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8384:201;;;;;;;;;;-1:-1:-1;8384:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8384:201:0;1023:187:1;29555:170:0;;;;;;;;;;-1:-1:-1;29555:170:0;;;;;:::i;:::-;;:::i;:::-;;27446:36;;;;;;;;;;;;;;;;;;;1871:25:1;;;1859:2;1844:18;27446:36:0;1725:177:1;28113:31:0;;;;;;;;;;-1:-1:-1;28113:31:0;;;;-1:-1:-1;;;28113:31:0;;;;;;7153:108;;;;;;;;;;-1:-1:-1;7241:12:0;;7153:108;;29733:116;;;;;;;;;;-1:-1:-1;29733:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;29821:20:0;29797:4;29821:20;;;:11;:20;;;;;;;;;29733:116;9165:261;;;;;;;;;;-1:-1:-1;9165:261:0;;;;;:::i;:::-;;:::i;6995:93::-;;;;;;;;;;-1:-1:-1;6995:93:0;;7078:2;2762:36:1;;2750:2;2735:18;6995:93:0;2620:184:1;9835:238:0;;;;;;;;;;-1:-1:-1;9835:238:0;;;;;:::i;:::-;;:::i;27719:40::-;;;;;;;;;;-1:-1:-1;27719:40:0;;;;;;;;27324:36;;;;;;;;;;-1:-1:-1;27324:36:0;;;;;;;;;;;;;2983:25:1;;;3039:2;3024:18;;3017:34;;;;2956:18;27324:36:0;2809:248:1;28823:207:0;;;;;;;;;;-1:-1:-1;28823:207:0;;;;;:::i;:::-;;:::i;7324:127::-;;;;;;;;;;-1:-1:-1;7324:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7425:18:0;7398:7;7425:18;;;;;;;;;;;;7324:127;18735:103;;;;;;;;;;;;;:::i;27162:30::-;;;;;;;;;;-1:-1:-1;27162:30:0;;;;-1:-1:-1;;;;;27162:30:0;;;;;;-1:-1:-1;;;;;3244:32:1;;;3226:51;;3214:2;3199:18;27162:30:0;3062:221:1;27820:75:0;;;;;;;;;;-1:-1:-1;27820:75:0;;;;;;;-1:-1:-1;;;;;27820:75:0;;;28206:609;;;;;;;;;;;;;:::i;27247:31::-;;;;;;;;;;-1:-1:-1;27247:31:0;;;;;;;;;18094:87;;;;;;;;;;-1:-1:-1;18167:6:0;;-1:-1:-1;;;;;18167:6:0;18094:87;;6243:104;;;;;;;;;;;;;:::i;30183:322::-;;;;;;;;;;-1:-1:-1;30183:322:0;;;;;:::i;:::-;;:::i;10576:436::-;;;;;;;;;;-1:-1:-1;10576:436:0;;;;;:::i;:::-;;:::i;27199:26::-;;;;;;;;;;-1:-1:-1;27199:26:0;;;;-1:-1:-1;;;;;27199:26:0;;;7657:193;;;;;;;;;;-1:-1:-1;7657:193:0;;;;;:::i;:::-;;:::i;29857:318::-;;;;;;;;;;-1:-1:-1;29857:318:0;;;;;:::i;:::-;;:::i;29038:375::-;;;;;;;;;;-1:-1:-1;29038:375:0;;;;;:::i;:::-;;:::i;27766:30::-;;;;;;;;;;-1:-1:-1;27766:30:0;;;;;;;;;;;27369:31;;;;;;;;;;;;;;;;34462:245;;;;;;;;;;-1:-1:-1;34462:245:0;;;;;:::i;:::-;;:::i;27407:32::-;;;;;;;;;;;;;;;;7913:151;;;;;;;;;;-1:-1:-1;7913:151:0;;;;;:::i;:::-;;:::i;27613:57::-;;;;;;;;;;;;;;;;30513:331;;;;;;;;;;-1:-1:-1;30513:331:0;;;;;:::i;:::-;;:::i;29421:126::-;;;;;;;;;;;;;:::i;18993:201::-;;;;;;;;;;-1:-1:-1;18993:201:0;;;;;:::i;:::-;;:::i;34258:196::-;;;;;;;;;;;;;:::i;27285:32::-;;;;;;;;;;-1:-1:-1;27285:32:0;;;;;;;;;6024:100;6078:13;6111:5;6104:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6024:100;:::o;8384:201::-;8467:4;3910:10;8523:32;3910:10;8539:7;8548:6;8523:8;:32::i;:::-;8573:4;8566:11;;;8384:201;;;;;:::o;29555:170::-;17980:13;:11;:13::i;:::-;-1:-1:-1;;;;;29644:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:30;;-1:-1:-1;;29644:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29690:27;;29644:30;;:20;29690:27:::1;::::0;::::1;29555:170:::0;;:::o;9165:261::-;9262:4;3910:10;9320:38;9336:4;3910:10;9351:6;9320:15;:38::i;:::-;9369:27;9379:4;9385:2;9389:6;9369:9;:27::i;:::-;9414:4;9407:11;;;9165:261;;;;;;:::o;9835:238::-;9923:4;3910:10;9979:64;3910:10;9995:7;10032:10;10004:25;3910:10;9995:7;10004:9;:25::i;:::-;:38;;;;:::i;:::-;9979:8;:64::i;28823:207::-;17980:13;:11;:13::i;:::-;-1:-1:-1;;;;;28912:27:0;::::1;28904:76;;;::::0;-1:-1:-1;;;28904:76:0;;5176:2:1;28904:76:0::1;::::0;::::1;5158:21:1::0;5215:2;5195:18;;;5188:30;5254:34;5234:18;;;5227:62;-1:-1:-1;;;5305:18:1;;;5298:34;5349:19;;28904:76:0::1;;;;;;;;;28991:15;:31:::0;;-1:-1:-1;;;;;28991:31:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;28991:31:0;;::::1;::::0;;;::::1;::::0;;28823:207::o;18735:103::-;17980:13;:11;:13::i;:::-;18800:30:::1;18827:1;18800:18;:30::i;:::-;18735:103::o:0;28206:609::-;17980:13;:11;:13::i;:::-;28265:11:::1;::::0;-1:-1:-1;;;28265:11:0;::::1;;;28264:12;28256:48;;;::::0;-1:-1:-1;;;28256:48:0;;5581:2:1;28256:48:0::1;::::0;::::1;5563:21:1::0;5620:2;5600:18;;;5593:30;5659:25;5639:18;;;5632:53;5702:18;;28256:48:0::1;5379:347:1::0;28256:48:0::1;28387:13;:69:::0;;-1:-1:-1;;;;;;28387:69:0::1;28413:42;28387:69:::0;;::::1;::::0;;;28492:23:::1;::::0;;-1:-1:-1;;;28492:23:0;;;;28334:42:::1;::::0;28413;28492:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;28413:42;28492:23:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28481:46:0::1;;28536:4;28543:13;;;;;;;;;-1:-1:-1::0;;;;;28543:13:0::1;-1:-1:-1::0;;;;;28543:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28481:83;::::0;-1:-1:-1;;;;;;28481:83:0::1;::::0;;;;;;-1:-1:-1;;;;;6217:15:1;;;28481:83:0::1;::::0;::::1;6199:34:1::0;6269:15;;6249:18;;;6242:43;6134:18;;28481:83:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28467:11;:97:::0;;-1:-1:-1;;;;;;28467:97:0::1;-1:-1:-1::0;;;;;28467:97:0;;::::1;;::::0;;28595:13:::1;::::0;;::::1;-1:-1:-1::0;28575:35:0;;;:11:::1;:35;::::0;;;;;:42;;-1:-1:-1;;28575:42:0;;::::1;-1:-1:-1::0;28575:42:0;;::::1;::::0;;;28648:4:::1;28628:26:::0;;;;;:33;;;::::1;::::0;::::1;::::0;;28672:21;;::::1;::::0;;;;:28;;;;::::1;;::::0;;28711:29:::1;28672:21:::0;27121:18:::1;28711:5;:29::i;:::-;28751:27;28769:8;28751:17;:27::i;:::-;-1:-1:-1::0;28789:11:0::1;:18:::0;;-1:-1:-1;;;;28789:18:0::1;-1:-1:-1::0;;;28789:18:0::1;::::0;;28206:609::o;6243:104::-;6299:13;6332:7;6325:14;;;;;:::i;30183:322::-;17980:13;:11;:13::i;:::-;30274:9:::1;:38:::0;;;30323:22;:31;;;30381:22:::1;30299:13:::0;30348:6;30381:22:::1;:::i;:::-;30365:13;:38:::0;;;30422:12:::1;::::0;30454:2:::1;::::0;30422:28:::1;::::0;::::1;:::i;:::-;:34;;30414:83;;;::::0;-1:-1:-1;;;30414:83:0;;6498:2:1;30414:83:0::1;::::0;::::1;6480:21:1::0;6537:2;6517:18;;;6510:30;6576:34;6556:18;;;6549:62;-1:-1:-1;;;6627:18:1;;;6620:34;6671:19;;30414:83:0::1;6296:400:1::0;30414:83:0::1;30183:322:::0;;:::o;10576:436::-;10669:4;3910:10;10669:4;10752:25;3910:10;10769:7;10752:9;:25::i;:::-;10725:52;;10816:15;10796:16;:35;;10788:85;;;;-1:-1:-1;;;10788:85:0;;6903:2:1;10788:85:0;;;6885:21:1;6942:2;6922:18;;;6915:30;6981:34;6961:18;;;6954:62;-1:-1:-1;;;7032:18:1;;;7025:35;7077:19;;10788:85:0;6701:401:1;10788:85:0;10909:60;10918:5;10925:7;10953:15;10934:16;:34;10909:8;:60::i;:::-;-1:-1:-1;11000:4:0;;10576:436;-1:-1:-1;;;;10576:436:0:o;7657:193::-;7736:4;3910:10;7792:28;3910:10;7809:2;7813:6;7792:9;:28::i;29857:318::-;17980:13;:11;:13::i;:::-;29947:8:::1;:37:::0;;;29995:21;:30;;;30051:22:::1;29971:13:::0;30019:6;30051:22:::1;:::i;:::-;30036:12;:37:::0;;;30107:13:::1;::::0;30124:2:::1;::::0;30092:28:::1;::::0;30107:13;30092:28:::1;:::i;29038:375::-:0;17980:13;:11;:13::i;:::-;29154:1:::1;29141:10;:14;:56;;;;-1:-1:-1::0;29194:3:0::1;29174:16;27121:18;29189:1;29174:16;:::i;:::-;29173:24;;;;:::i;:::-;29159:10;:38;;29141:56;29119:188;;;::::0;-1:-1:-1;;;29119:188:0;;7704:2:1;29119:188:0::1;::::0;::::1;7686:21:1::0;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;7853:34;7833:18;;;7826:62;-1:-1:-1;;;7904:19:1;;;7897:49;7963:19;;29119:188:0::1;7502:486:1::0;29119:188:0::1;29318:18;:31:::0;;;29365:40:::1;::::0;29339:10;;29365:40:::1;::::0;;;::::1;29038:375:::0;:::o;34462:245::-;17980:13;:11;:13::i;:::-;34598:44:::1;::::0;-1:-1:-1;;;34598:44:0;;34636:4:::1;34598:44;::::0;::::1;3226:51:1::0;34542:12:0::1;::::0;-1:-1:-1;;;;;34557:28:0;::::1;::::0;::::1;::::0;34586:10:::1;::::0;34557:28;;34598:29:::1;::::0;3199:18:1;;34598:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34557:86;::::0;-1:-1:-1;;;;;;34557:86:0::1;::::0;;;;;;-1:-1:-1;;;;;8374:32:1;;;34557:86:0::1;::::0;::::1;8356:51:1::0;8423:18;;;8416:34;8329:18;;34557:86:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34542:101;;34662:7;34654:45;;;::::0;-1:-1:-1;;;34654:45:0;;8913:2:1;34654:45:0::1;::::0;::::1;8895:21:1::0;8952:2;8932:18;;;8925:30;8991:27;8971:18;;;8964:55;9036:18;;34654:45:0::1;8711:349:1::0;7913:151:0;-1:-1:-1;;;;;8029:18:0;;;8002:7;8029:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7913:151::o;30513:331::-;17980:13;:11;:13::i;:::-;30608::::1;:42:::0;;;30661:26;:35;;;30727:22:::1;30637:13:::0;30690:6;30727:22:::1;:::i;:::-;30707:17;:42:::0;;;30789:2:::1;-1:-1:-1::0;30768:23:0::1;30760:76;;;::::0;-1:-1:-1;;;30760:76:0;;9267:2:1;30760:76:0::1;::::0;::::1;9249:21:1::0;9306:2;9286:18;;;9279:30;9345:34;9325:18;;;9318:62;-1:-1:-1;;;9396:18:1;;;9389:38;9444:19;;30760:76:0::1;9065:404:1::0;29421:126:0;17980:13;:11;:13::i;:::-;29502:21:::1;::::0;::::1;;29501:38;;29535:4;29501:38;;;29527:5;29501:38;29477:21;:62:::0;;-1:-1:-1;;29477:62:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29421:126::o;18993:201::-;17980:13;:11;:13::i;:::-;-1:-1:-1;;;;;19082:22:0;::::1;19074:73;;;::::0;-1:-1:-1;;;19074:73:0;;9676:2:1;19074:73:0::1;::::0;::::1;9658:21:1::0;9715:2;9695:18;;;9688:30;9754:34;9734:18;;;9727:62;-1:-1:-1;;;9805:18:1;;;9798:36;9851:19;;19074:73:0::1;9474:402:1::0;19074:73:0::1;19158:28;19177:8;19158:18;:28::i;:::-;18993:201:::0;:::o;34258:196::-;17980:13;:11;:13::i;:::-;34334:58:::1;::::0;34317:12:::1;::::0;34342:10:::1;::::0;34366:21:::1;::::0;34317:12;34334:58;34317:12;34334:58;34366:21;34342:10;34334:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34316:76;;;34411:7;34403:43;;;::::0;-1:-1:-1;;;34403:43:0;;10293:2:1;34403:43:0::1;::::0;::::1;10275:21:1::0;10332:2;10312:18;;;10305:30;10371:25;10351:18;;;10344:53;10414:18;;34403:43:0::1;10091:347:1::0;14569:346:0;-1:-1:-1;;;;;14671:19:0;;14663:68;;;;-1:-1:-1;;;14663:68:0;;10645:2:1;14663:68:0;;;10627:21:1;10684:2;10664:18;;;10657:30;10723:34;10703:18;;;10696:62;-1:-1:-1;;;10774:18:1;;;10767:34;10818:19;;14663:68:0;10443:400:1;14663:68:0;-1:-1:-1;;;;;14750:21:0;;14742:68;;;;-1:-1:-1;;;14742:68:0;;11050:2:1;14742:68:0;;;11032:21:1;11089:2;11069:18;;;11062:30;11128:34;11108:18;;;11101:62;-1:-1:-1;;;11179:18:1;;;11172:32;11221:19;;14742:68:0;10848:398:1;14742:68:0;-1:-1:-1;;;;;14823:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14875:32;;1871:25:1;;;14875:32:0;;1844:18:1;14875:32:0;;;;;;;14569:346;;;:::o;18259:132::-;18167:6;;-1:-1:-1;;;;;18167:6:0;3910:10;18323:23;18315:68;;;;-1:-1:-1;;;18315:68:0;;11453:2:1;18315:68:0;;;11435:21:1;;;11472:18;;;11465:30;11531:34;11511:18;;;11504:62;11583:18;;18315:68:0;11251:356:1;15206:419:0;15307:24;15334:25;15344:5;15351:7;15334:9;:25::i;:::-;15307:52;;-1:-1:-1;;15374:16:0;:37;15370:248;;15456:6;15436:16;:26;;15428:68;;;;-1:-1:-1;;;15428:68:0;;11814:2:1;15428:68:0;;;11796:21:1;11853:2;11833:18;;;11826:30;11892:31;11872:18;;;11865:59;11941:18;;15428:68:0;11612:353:1;15428:68:0;15540:51;15549:5;15556:7;15584:6;15565:16;:25;15540:8;:51::i;:::-;15296:329;15206:419;;;:::o;31474:695::-;-1:-1:-1;;;;;31583:19:0;;31575:58;;;;-1:-1:-1;;;31575:58:0;;12172:2:1;31575:58:0;;;12154:21:1;12211:2;12191:18;;;12184:30;12250:28;12230:18;;;12223:56;12296:18;;31575:58:0;11970:350:1;31575:58:0;-1:-1:-1;;;;;31652:17:0;;31644:54;;;;-1:-1:-1;;;31644:54:0;;12527:2:1;31644:54:0;;;12509:21:1;12566:2;12546:18;;;12539:30;12605:26;12585:18;;;12578:54;12649:18;;31644:54:0;12325:348:1;31644:54:0;31709:18;31730:29;31739:5;31746:3;31751:7;31730:8;:29::i;:::-;31815:18;;31805:4;31772:12;7425:18;;;;;;;;;;;31862:21;;31709:50;;-1:-1:-1;;31787:46:0;;31862:21;;:45;;;;-1:-1:-1;31887:11:0;;-1:-1:-1;;;;;31887:20:0;;;:11;;:20;;31862:45;:56;;;;;31911:7;31862:56;:79;;;;-1:-1:-1;;;;;;31923:18:0;;;;;;:11;:18;;;;;;;;31922:19;31862:79;:100;;;;-1:-1:-1;;;;;;31946:16:0;;;;;;:11;:16;;;;;;;;31945:17;31862:100;:132;;;;-1:-1:-1;31984:10:0;;;;;;;31983:11;31862:132;31844:268;;;32021:10;:17;;-1:-1:-1;;32021:17:0;;;;;32053:14;:12;:14::i;:::-;32082:10;:18;;-1:-1:-1;;32082:18:0;;;31844:268;32122:39;32138:5;32145:3;32150:10;32122:15;:39::i;:::-;31564:605;;31474:695;;;:::o;19354:191::-;19447:6;;;-1:-1:-1;;;;;19464:17:0;;;-1:-1:-1;;;;;;19464:17:0;;;;;;;19497:40;;19447:6;;;19464:17;19447:6;;19497:40;;19428:16;;19497:40;19417:128;19354:191;:::o;12575:548::-;-1:-1:-1;;;;;12659:21:0;;12651:65;;;;-1:-1:-1;;;12651:65:0;;12880:2:1;12651:65:0;;;12862:21:1;12919:2;12899:18;;;12892:30;12958:33;12938:18;;;12931:61;13009:18;;12651:65:0;12678:355:1;12651:65:0;12807:6;12791:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;12962:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;13017:37;1871:25:1;;;13017:37:0;;1844:18:1;13017:37:0;;;;;;;30183:322;;:::o;30852:614::-;-1:-1:-1;;;;;30957:18:0;;30933:7;30957:18;;;:11;:18;;;;;;;;;:38;;-1:-1:-1;;;;;;30979:16:0;;;;;;:11;:16;;;;;;;;30957:38;30953:85;;;-1:-1:-1;31019:7:0;31012:14;;30953:85;31067:17;;31108:11;;-1:-1:-1;;;;;31108:11:0;;;31101:18;;;;31097:157;;-1:-1:-1;31147:13:0;;31097:157;;;31191:11;;-1:-1:-1;;;;;31191:11:0;;;31182:20;;;;31178:76;;-1:-1:-1;31230:12:0;;31178:76;31266:11;31296:12;;31292:134;;31354:3;31332:18;31342:8;31332:7;:18;:::i;:::-;31331:26;;;;:::i;:::-;31325:32;;31372:42;31388:5;31403:4;31410:3;31372:15;:42::i;:::-;31444:13;31454:3;31444:7;:13;:::i;:::-;31436:22;30852:614;-1:-1:-1;;;;;;30852:614:0:o;32177:932::-;32259:4;32221:17;7425:18;;;;;;;;;;;;32280:14;;;32276:53;;32311:7;32177:932::o;32276:53::-;32424:24;;;;;;;;32440:8;32424:24;;;;;;;;;;;;;32459:25;;;;;;;32475:9;32459:25;;;;;;;;;32495:29;;;;;;;;32511:13;32495:29;;;;;;;;;;;;32589:17;;32573:13;;32558:12;;32424:24;;32459:25;;32424:13;;32589:17;32558:28;;;:::i;:::-;:48;;;;:::i;:::-;32537:69;;32623:10;32637:1;32623:15;32619:54;;32655:7;;;;;32177:932::o;32619:54::-;32685:18;32742:2;:15;;;32724:2;:15;;;32706:2;:15;;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;32685:72;-1:-1:-1;32770:17:0;32817:10;32791:22;32685:72;32791:9;:22;:::i;:::-;32790:37;;;;:::i;:::-;32770:57;-1:-1:-1;32838:24:0;32865:21;32770:57;32865:9;:21;:::i;:::-;32838:48;-1:-1:-1;32903:13:0;;32899:71;;32933:25;32948:9;32933:14;:25::i;:::-;32982:27;32992:16;32982:9;:27::i;:::-;33046:15;;33038:63;;33021:12;;33046:15;;;-1:-1:-1;;;;;33046:15:0;;33075:21;;33021:12;33038:63;33021:12;33038:63;33075:21;33046:15;33038:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;32177:932:0:o;11482:806::-;-1:-1:-1;;;;;11579:18:0;;11571:68;;;;-1:-1:-1;;;11571:68:0;;13373:2:1;11571:68:0;;;13355:21:1;13412:2;13392:18;;;13385:30;13451:34;13431:18;;;13424:62;-1:-1:-1;;;13502:18:1;;;13495:35;13547:19;;11571:68:0;13171:401:1;11571:68:0;-1:-1:-1;;;;;11658:16:0;;11650:64;;;;-1:-1:-1;;;11650:64:0;;13779:2:1;11650:64:0;;;13761:21:1;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;-1:-1:-1;;;13908:18:1;;;13901:33;13951:19;;11650:64:0;13577:399:1;11650:64:0;-1:-1:-1;;;;;11800:15:0;;11778:19;11800:15;;;;;;;;;;;11834:21;;;;11826:72;;;;-1:-1:-1;;;11826:72:0;;14183:2:1;11826:72:0;;;14165:21:1;14222:2;14202:18;;;14195:30;14261:34;14241:18;;;14234:62;-1:-1:-1;;;14312:18:1;;;14305:36;14358:19;;11826:72:0;13981:402:1;11826:72:0;-1:-1:-1;;;;;11934:15:0;;;:9;:15;;;;;;;;;;;11952:20;;;11934:38;;12152:13;;;;;;;;;;:23;;;;;;12204:26;;1871:25:1;;;12152:13:0;;12204:26;;1844:18:1;12204:26:0;;;;;;;12243:37;16225:91;33117:396;33178:17;33198:11;33208:1;33198:7;:11;:::i;:::-;33178:31;-1:-1:-1;33220:17:0;33240:19;33178:31;33240:7;:19;:::i;:::-;33220:39;-1:-1:-1;33298:21:0;33370:20;33380:9;33370;:20::i;:::-;33401:16;33420:41;33444:17;33420:21;:41;:::i;:::-;33401:60;;33472:33;33485:9;33496:8;33472:12;:33::i;33521:395::-;33601:16;;;33615:1;33601:16;;;;;;;;33577:21;;33601:16;;;;;;;;;;-1:-1:-1;33601:16:0;33577:40;;33646:4;33628;33633:1;33628:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33628:23:0;;;:7;;;;;;;;;;:23;;;;33672:13;;:20;;;-1:-1:-1;;;33672:20:0;;;;:13;;;;;:18;;:20;;;;;33628:7;;33672:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33662:4;33667:1;33662:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33662:30:0;;;:7;;;;;;;;;:30;33735:13;;33703:56;;33720:4;;33735:13;33751:7;33703:8;:56::i;:::-;33770:13;;:138;;-1:-1:-1;;;33770:138:0;;-1:-1:-1;;;;;33770:13:0;;;;:64;;:138;;33849:7;;33770:13;;33861:4;;33875;;33882:15;;33770:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33566:350;33521:395;:::o;33924:326::-;34037:13;;34005:60;;34022:4;;-1:-1:-1;;;;;34037:13:0;34053:11;34005:8;:60::i;:::-;34076:13;;:166;;-1:-1:-1;;;34076:166:0;;34146:4;34076:166;;;15978:34:1;16028:18;;;16021:34;;;34076:13:0;16071:18:1;;;16064:34;;;16114:18;;;16107:34;34172:42:0;16157:19:1;;;16150:44;34216:15:0;16210:19:1;;;16203:35;-1:-1:-1;;;;;34076:13:0;;;;:29;;34113:9;;15912:19:1;;34076:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;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:118::-;1301:5;1294:13;1287:21;1280:5;1277:32;1267:60;;1323:1;1320;1313:12;1338:382;1403:6;1411;1464:2;1452:9;1443:7;1439:23;1435:32;1432:52;;;1480:1;1477;1470:12;1432:52;1519:9;1506:23;1538:31;1563:5;1538:31;:::i;:::-;1588:5;-1:-1:-1;1645:2:1;1630:18;;1617:32;1658:30;1617:32;1658:30;:::i;:::-;1707:7;1697:17;;;1338:382;;;;;:::o;1907:247::-;1966:6;2019:2;2007:9;1998:7;1994:23;1990:32;1987:52;;;2035:1;2032;2025:12;1987:52;2074:9;2061:23;2093:31;2118:5;2093:31;:::i;2159:456::-;2236:6;2244;2252;2305:2;2293:9;2284:7;2280:23;2276:32;2273:52;;;2321:1;2318;2311:12;2273:52;2360:9;2347:23;2379:31;2404:5;2379:31;:::i;:::-;2429:5;-1:-1:-1;2486:2:1;2471:18;;2458:32;2499:33;2458:32;2499:33;:::i;:::-;2159:456;;2551:7;;-1:-1:-1;;;2605:2:1;2590:18;;;;2577:32;;2159:456::o;3496:248::-;3564:6;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;-1:-1:-1;;3664:23:1;;;3734:2;3719:18;;;3706:32;;-1:-1:-1;3496:248:1:o;3749:180::-;3808:6;3861:2;3849:9;3840:7;3836:23;3832:32;3829:52;;;3877:1;3874;3867:12;3829:52;-1:-1:-1;3900:23:1;;3749:180;-1:-1:-1;3749:180:1:o;3934:388::-;4002:6;4010;4063:2;4051:9;4042:7;4038:23;4034:32;4031:52;;;4079:1;4076;4069:12;4031:52;4118:9;4105:23;4137:31;4162:5;4137:31;:::i;:::-;4187:5;-1:-1:-1;4244:2:1;4229:18;;4216:32;4257:33;4216:32;4257:33;:::i;4327:380::-;4406:1;4402:12;;;;4449;;;4470:61;;4524:4;4516:6;4512:17;4502:27;;4470:61;4577:2;4569:6;4566:14;4546:18;4543:38;4540:161;;4623:10;4618:3;4614:20;4611:1;4604:31;4658:4;4655:1;4648:15;4686:4;4683:1;4676:15;4540:161;;4327:380;;;:::o;4712:127::-;4773:10;4768:3;4764:20;4761:1;4754:31;4804:4;4801:1;4794:15;4828:4;4825:1;4818:15;4844:125;4909:9;;;4930:10;;;4927:36;;;4943:18;;:::i;5731:251::-;5801:6;5854:2;5842:9;5833:7;5829:23;5825:32;5822:52;;;5870:1;5867;5860:12;5822:52;5902:9;5896:16;5921:31;5946:5;5921:31;:::i;7107:168::-;7180:9;;;7211;;7228:15;;;7222:22;;7208:37;7198:71;;7249:18;;:::i;7280:217::-;7320:1;7346;7336:132;;7390:10;7385:3;7381:20;7378:1;7371:31;7425:4;7422:1;7415:15;7453:4;7450:1;7443:15;7336:132;-1:-1:-1;7482:9:1;;7280:217::o;7993:184::-;8063:6;8116:2;8104:9;8095:7;8091:23;8087:32;8084:52;;;8132:1;8129;8122:12;8084:52;-1:-1:-1;8155:16:1;;7993:184;-1:-1:-1;7993:184:1:o;8461:245::-;8528:6;8581:2;8569:9;8560:7;8556:23;8552:32;8549:52;;;8597:1;8594;8587:12;8549:52;8629:9;8623:16;8648:28;8670:5;8648:28;:::i;13038:128::-;13105:9;;;13126:11;;;13123:37;;;13140:18;;:::i;14520:127::-;14581:10;14576:3;14572:20;14569:1;14562:31;14612:4;14609:1;14602:15;14636:4;14633:1;14626:15;14652:980;14914:4;14962:3;14951:9;14947:19;14993:6;14982:9;14975:25;15019:2;15057:6;15052:2;15041:9;15037:18;15030:34;15100:3;15095:2;15084:9;15080:18;15073:31;15124:6;15159;15153:13;15190:6;15182;15175:22;15228:3;15217:9;15213:19;15206:26;;15267:2;15259:6;15255:15;15241:29;;15288:1;15298:195;15312:6;15309:1;15306:13;15298:195;;;15377:13;;-1:-1:-1;;;;;15373:39:1;15361:52;;15468:15;;;;15433:12;;;;15409:1;15327:9;15298:195;;;-1:-1:-1;;;;;;;15549:32:1;;;;15544:2;15529:18;;15522:60;-1:-1:-1;;;15613:3:1;15598:19;15591:35;15510:3;14652:980;-1:-1:-1;;;14652:980:1:o;16249:306::-;16337:6;16345;16353;16406:2;16394:9;16385:7;16381:23;16377:32;16374:52;;;16422:1;16419;16412:12;16374:52;16451:9;16445:16;16435:26;;16501:2;16490:9;16486:18;16480:25;16470:35;;16545:2;16534:9;16530:18;16524:25;16514:35;;16249:306;;;;;:::o

Swarm Source

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