ETH Price: $2,650.23 (+1.72%)

Token

Doomer (DMR)
 

Overview

Max Total Supply

69,690,000,000 DMR

Holders

66

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
DoomerToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol


pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

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

// File: contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts/interfaces/IUniswapV2Router02.sol



pragma solidity >=0.6.2;


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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://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 {}
}

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.7;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.7;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```solidity
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 *
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts.
     *
     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
     * constructor.
     *
     * Emits an {Initialized} event.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * A reinitializer may be used after the original initialization step. This is essential to configure modules that
     * are added through upgrades and that require initialization.
     *
     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
     * cannot be nested. If one is invoked in the context of another, execution will revert.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     *
     * WARNING: setting the version to 255 will prevent any future reinitialization.
     *
     * Emits an {Initialized} event.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     *
     * Emits an {Initialized} event the first time it is successfully executed.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized != type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }

    /**
     * @dev Returns the highest version that has been initialized. See {reinitializer}.
     */
    function _getInitializedVersion() internal view returns (uint8) {
        return _initialized;
    }

    /**
     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
     */
    function _isInitializing() internal view returns (bool) {
        return _initializing;
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.7;


/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.7;



/**
 * @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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _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 This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.7;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @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);
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
    /**
     * @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);
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.7;





/**
 * @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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    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.
     */
    function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {
        __ERC20_init_unchained(name_, symbol_);
    }

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
        _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 This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[45] private __gap;
}

// File: contracts/Doomer.sol


pragma solidity ^0.8.7;










// import "@openzeppelin/contracts/interfaces/IUniswapV2Pair.sol";


// contract DoomerToken is ERC20, Ownable {
    contract DoomerToken is Initializable, ERC20Upgradeable, OwnableUpgradeable {
    uint256 private constant _decimals = 18;
    uint256 private constant _initialSupply = 69690000000 * (10**_decimals);//(10**_decimals);
    uint256 private _buyTax = 15; // Initial buy tax of 15%
    uint256 private _sellTax = 15; // Initial sell tax of 15%
    uint256 private _buyLimitPercent = 1;
    address private _devAddress;
    IUniswapV2Router02 private _uniswapRouter;
    address private _uniswapPair;
   // constructor() ERC20("Doomer", "DMR"){
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

   constructor() initializer  {
    __ERC20_init("Doomer", "DMR");
    __Ownable_init();
    //constructor() initializer {
    ERC20Upgradeable.__ERC20_init("Doomer", "DMR");
    OwnableUpgradeable.__Ownable_init();
        _uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Replace with the actual address of the Uniswap router
        _mint(msg.sender, _initialSupply);
        _approve(address(this), address(_uniswapRouter), type(uint256).max);
    }

    function decimals() public view virtual override returns (uint8) {
        return uint8(_decimals);
    }
    
    function setBuyTax(uint256 tax) external onlyOwner {
        require(tax <= 100, "Invalid tax percentage");
        _buyTax = tax;
    }

    function setSellTax(uint256 tax) external onlyOwner {
        require(tax <= 100, "Invalid tax percentage");
        _sellTax = tax;
    }
    function burn(uint256 amount) external onlyOwner {
        _burn(msg.sender, amount);
    }
    function setBuyLimitPercent(uint256 percent) external onlyOwner {
        require(percent <= 100, "Invalid percentage");
        _buyLimitPercent = percent;
    }
     function setDevAddress(address devAddress) external onlyOwner {
        _devAddress = devAddress;
    }
    function buyTokens() external payable {
        require(msg.value > 0, "Invalid amount");
        require(msg.value <= calculateBuyLimit(), "Exceeded buy limit");
        uint256 amountToTransfer = calculateTransferAmount(msg.value, _buyTax);
        _transfer(address(this), _devAddress, amountToTransfer);
        _transfer(address(this),  msg.sender, amountToTransfer);
        _balances[address(this)] -= amountToTransfer;
    _balances[_devAddress] += amountToTransfer;
    _balances[msg.sender] += amountToTransfer;
    }

     function calculateBuyLimit() public view returns (uint256) {
    uint256 ethToTokenRatio = (_initialSupply * _buyLimitPercent) / 100;
    return ethToTokenRatio;
}
function sellTokens(uint256 amount) external {
        require(amount > 0, "Invalid amount");
        uint256 taxAmount = calculateTransferAmount(amount, _sellTax);
        _balances[_devAddress] += taxAmount; // Send the tax amount to the dev address
    _balances[address(this)] += amount - taxAmount;
    _transfer(msg.sender, address(this), amount - taxAmount);
    payable(msg.sender).transfer(amount - taxAmount);
    }

    function calculateTransferAmount(uint256 amount, uint256 tax) internal pure returns (uint256) {
        uint256 taxAmount = (amount * tax) / 100;
        return amount - taxAmount;
    }

    function setUniswapPair(address pair) external onlyOwner {
        _uniswapPair = pair;
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) external onlyOwner {
        _approve(address(this), address(_uniswapRouter), tokenAmount);
        _uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
   
}    function renounceOwnership() public virtual override onlyOwner {
        revert("Ownership cannot be renounced for this contract");
    }

    function withdrawETH() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

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

        _approve(address(this), address(_uniswapRouter), tokenAmount);
        _uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
}

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":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"calculateBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setBuyLimitPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"setUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"swapTokensForEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600f609755600f60985560016099553480156200002057600080fd5b5060008060019054906101000a900460ff16159050808015620000535750600160008054906101000a900460ff1660ff16105b806200008f575062000070306200037160201b6200134d1760201c565b1580156200008e5750600160008054906101000a900460ff1660ff16145b5b620000d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c89062000b4a565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156200010f576001600060016101000a81548160ff0219169083151502179055505b6200018b6040518060400160405280600681526020017f446f6f6d657200000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f444d5200000000000000000000000000000000000000000000000000000000008152506200039460201b60201c565b6200019b620003fc60201b60201c565b6200021c6040518060400160405280600681526020017f446f6f6d657200000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f444d5200000000000000000000000000000000000000000000000000000000008152506200039460201b620013701760201c565b62000231620003fc60201b620013cd1760201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d609b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002b9336012600a6200029b919062000cb8565b641039d90280620002ad919062000df5565b6200046060201b60201c565b6200030e30609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620005cf60201b60201c565b80156200036a5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405162000361919062000b0b565b60405180910390a15b5062001087565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16620003e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003dd9062000b8e565b60405180910390fd5b620003f88282620007a260201b60201c565b5050565b600060019054906101000a900460ff166200044e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004459062000b8e565b60405180910390fd5b6200045e6200082a60201b60201c565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ca9062000bb0565b60405180910390fd5b620004e7600083836200089e60201b60201c565b8060356000828254620004fb919062000c00565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005af919062000bd2565b60405180910390a3620005cb60008383620008a360201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006399062000b6c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ac9062000b28565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000795919062000bd2565b60405180910390a3505050565b600060019054906101000a900460ff16620007f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007eb9062000b8e565b60405180910390fd5b81603690805190602001906200080c92919062000976565b5080603790805190602001906200082592919062000976565b505050565b600060019054906101000a900460ff166200087c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008739062000b8e565b60405180910390fd5b6200089c62000890620008a860201b60201c565b620008b060201b60201c565b565b505050565b505050565b600033905090565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620009849062000e81565b90600052602060002090601f016020900481019282620009a85760008555620009f4565b82601f10620009c357805160ff1916838001178555620009f4565b82800160010185558215620009f4579182015b82811115620009f3578251825591602001919060010190620009d6565b5b50905062000a03919062000a07565b5090565b5b8082111562000a2257600081600090555060010162000a08565b5090565b62000a318162000e6d565b82525050565b600062000a4660228362000bef565b915062000a538262000f22565b604082019050919050565b600062000a6d602e8362000bef565b915062000a7a8262000f71565b604082019050919050565b600062000a9460248362000bef565b915062000aa18262000fc0565b604082019050919050565b600062000abb602b8362000bef565b915062000ac8826200100f565b604082019050919050565b600062000ae2601f8362000bef565b915062000aef826200105e565b602082019050919050565b62000b058162000e56565b82525050565b600060208201905062000b22600083018462000a26565b92915050565b6000602082019050818103600083015262000b438162000a37565b9050919050565b6000602082019050818103600083015262000b658162000a5e565b9050919050565b6000602082019050818103600083015262000b878162000a85565b9050919050565b6000602082019050818103600083015262000ba98162000aac565b9050919050565b6000602082019050818103600083015262000bcb8162000ad3565b9050919050565b600060208201905062000be9600083018462000afa565b92915050565b600082825260208201905092915050565b600062000c0d8262000e56565b915062000c1a8362000e56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c525762000c5162000eb7565b5b828201905092915050565b6000808291508390505b600185111562000caf5780860481111562000c875762000c8662000eb7565b5b600185161562000c975780820291505b808102905062000ca78562000f15565b945062000c67565b94509492505050565b600062000cc58262000e56565b915062000cd28362000e56565b925062000d017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000d09565b905092915050565b60008262000d1b576001905062000dee565b8162000d2b576000905062000dee565b816001811462000d44576002811462000d4f5762000d85565b600191505062000dee565b60ff84111562000d645762000d6362000eb7565b5b8360020a91508482111562000d7e5762000d7d62000eb7565b5b5062000dee565b5060208310610133831016604e8410600b841016171562000dbf5782820a90508381111562000db95762000db862000eb7565b5b62000dee565b62000dce848484600162000c5d565b9250905081840481111562000de85762000de762000eb7565b5b81810290505b9392505050565b600062000e028262000e56565b915062000e0f8362000e56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000e4b5762000e4a62000eb7565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600062000e7a8262000e60565b9050919050565b6000600282049050600182168062000e9a57607f821691505b6020821081141562000eb15762000eb062000ee6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61304f80620010976000396000f3fe6080604052600436106101815760003560e01c806395d89b41116100d1578063d0febe4c1161008a578063dd62ed3e11610064578063dd62ed3e1461055f578063dd8a53f51461059c578063e086e5ec146105c5578063f2fde38b146105dc57610181565b8063d0febe4c14610503578063d5aed6bf1461050d578063dc1052e21461053657610181565b806395d89b41146103e35780639cd441da1461040e578063a457c2d714610437578063a9059cbb14610474578063b28805f4146104b1578063d0d41fe1146104da57610181565b8063395093511161013e57806370a082311161011857806370a082311461033b578063715018a6146103785780638cd09d501461038f5780638da5cb5b146103b857610181565b806339509351146102ac57806342966c68146102e95780636c11bcd31461031257610181565b806306fdde0314610186578063095ea7b3146101b157806318160ddd146101ee57806323b872dd14610219578063313ce5671461025657806334384f7414610281575b600080fd5b34801561019257600080fd5b5061019b610605565b6040516101a89190612409565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611f16565b610697565b6040516101e591906123ee565b60405180910390f35b3480156101fa57600080fd5b506102036106ba565b604051610210919061264b565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190611ec3565b6106c4565b60405161024d91906123ee565b60405180910390f35b34801561026257600080fd5b5061026b6106f3565b60405161027891906126c0565b60405180910390f35b34801561028d57600080fd5b506102966106fc565b6040516102a3919061264b565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190611f16565b61073f565b6040516102e091906123ee565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190611f56565b610776565b005b34801561031e57600080fd5b5061033960048036038101906103349190611f56565b61078b565b005b34801561034757600080fd5b50610362600480360381019061035d9190611e29565b610923565b60405161036f919061264b565b60405180910390f35b34801561038457600080fd5b5061038d61096c565b005b34801561039b57600080fd5b506103b660048036038101906103b19190611f56565b6109af565b005b3480156103c457600080fd5b506103cd610a05565b6040516103da9190612372565b60405180910390f35b3480156103ef57600080fd5b506103f8610a2f565b6040516104059190612409565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190611f83565b610ac1565b005b34801561044357600080fd5b5061045e60048036038101906104599190611f16565b610bbd565b60405161046b91906123ee565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190611f16565b610c34565b6040516104a891906123ee565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190611f56565b610c57565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190611e29565b610eb1565b005b61050b610efd565b005b34801561051957600080fd5b50610534600480360381019061052f9190611e29565b6110f9565b005b34801561054257600080fd5b5061055d60048036038101906105589190611f56565b611145565b005b34801561056b57600080fd5b5061058660048036038101906105819190611e83565b61119b565b604051610593919061264b565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190611f56565b611222565b005b3480156105d157600080fd5b506105da611278565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190611e29565b6112c9565b005b60606036805461061490612a50565b80601f016020809104026020016040519081016040528092919081815260200182805461064090612a50565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b6000806106a2611426565b90506106af81858561142e565b600191505092915050565b6000603554905090565b6000806106cf611426565b90506106dc8582856115f9565b6106e7858585611685565b60019150509392505050565b60006012905090565b60008060646099546012600a610712919061280a565b641039d902806107229190612928565b61072c9190612928565b6107369190612786565b90508091505090565b60008061074a611426565b905061076b81858561075c858961119b565b6107669190612730565b61142e565b600191505092915050565b61077e611900565b610788338261197e565b50565b600081116107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c5906124ab565b60405180910390fd5b60006107dc82609854611b4e565b905080609d6000609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461084f9190612730565b9250508190555080826108629190612982565b609d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108b09190612730565b925050819055506108cd333083856108c89190612982565b611685565b3373ffffffffffffffffffffffffffffffffffffffff166108fc82846108f39190612982565b9081150290604051600060405180830381858888f1935050505015801561091e573d6000803e3d6000fd5b505050565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610974611900565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061252b565b60405180910390fd5b6109b7611900565b60648111156109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f29061260b565b60405180910390fd5b8060988190555050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610a3e90612a50565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a90612a50565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b610ac9611900565b610af630609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461142e565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080610b42610a05565b426040518863ffffffff1660e01b8152600401610b649695949392919061238d565b6060604051808303818588803b158015610b7d57600080fd5b505af1158015610b91573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bb69190611fc3565b5050505050565b600080610bc8611426565b90506000610bd6828661119b565b905083811015610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c129061262b565b60405180910390fd5b610c28828686840361142e565b60019250505092915050565b600080610c3f611426565b9050610c4c818585611685565b600191505092915050565b610c5f611900565b6000600267ffffffffffffffff811115610c7c57610c7b612b3e565b5b604051908082528060200260200182016040528015610caa5781602001602082028036833780820191505090505b5090503081600081518110610cc257610cc1612b0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6457600080fd5b505afa158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190611e56565b81600181518110610db057610daf612b0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610e1730609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461142e565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401610e7b959493929190612666565b600060405180830381600087803b158015610e9557600080fd5b505af1158015610ea9573d6000803e3d6000fd5b505050505050565b610eb9611900565b80609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003411610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f37906124ab565b60405180910390fd5b610f486106fc565b341115610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f819061254b565b60405180910390fd5b6000610f9834609754611b4e565b9050610fc730609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611685565b610fd2303383611685565b80609d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110219190612982565b9250508190555080609d6000609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110999190612730565b9250508190555080609d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ef9190612730565b9250508190555050565b611101611900565b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61114d611900565b6064811115611191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111889061260b565b60405180910390fd5b8060978190555050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61122a611900565b606481111561126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906124cb565b60405180910390fd5b8060998190555050565b611280611900565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112c6573d6000803e3d6000fd5b50565b6112d1611900565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113389061246b565b60405180910390fd5b61134a81611b80565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b6906125eb565b60405180910390fd5b6113c98282611c46565b5050565b600060019054906101000a900460ff1661141c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611413906125eb565b60405180910390fd5b611424611cc7565b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906125cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115059061248b565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115ec919061264b565b60405180910390a3505050565b6000611605848461119b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461167f5781811015611671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611668906124eb565b60405180910390fd5b61167e848484840361142e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec906125ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c9061242b565b60405180910390fd5b611770838383611d28565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee9061250b565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e7919061264b565b60405180910390a36118fa848484611d2d565b50505050565b611908611426565b73ffffffffffffffffffffffffffffffffffffffff16611926610a05565b73ffffffffffffffffffffffffffffffffffffffff161461197c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119739061256b565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061258b565b60405180910390fd5b6119fa82600083611d28565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061244b565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b35919061264b565b60405180910390a3611b4983600084611d2d565b505050565b60008060648385611b5f9190612928565b611b699190612786565b90508084611b779190612982565b91505092915050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060019054906101000a900460ff16611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c906125eb565b60405180910390fd5b8160369080519060200190611cab929190611d32565b508060379080519060200190611cc2929190611d32565b505050565b600060019054906101000a900460ff16611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906125eb565b60405180910390fd5b611d26611d21611426565b611b80565b565b505050565b505050565b828054611d3e90612a50565b90600052602060002090601f016020900481019282611d605760008555611da7565b82601f10611d7957805160ff1916838001178555611da7565b82800160010185558215611da7579182015b82811115611da6578251825591602001919060010190611d8b565b5b509050611db49190611db8565b5090565b5b80821115611dd1576000816000905550600101611db9565b5090565b600081359050611de481612feb565b92915050565b600081519050611df981612feb565b92915050565b600081359050611e0e81613002565b92915050565b600081519050611e2381613002565b92915050565b600060208284031215611e3f57611e3e612b6d565b5b6000611e4d84828501611dd5565b91505092915050565b600060208284031215611e6c57611e6b612b6d565b5b6000611e7a84828501611dea565b91505092915050565b60008060408385031215611e9a57611e99612b6d565b5b6000611ea885828601611dd5565b9250506020611eb985828601611dd5565b9150509250929050565b600080600060608486031215611edc57611edb612b6d565b5b6000611eea86828701611dd5565b9350506020611efb86828701611dd5565b9250506040611f0c86828701611dff565b9150509250925092565b60008060408385031215611f2d57611f2c612b6d565b5b6000611f3b85828601611dd5565b9250506020611f4c85828601611dff565b9150509250929050565b600060208284031215611f6c57611f6b612b6d565b5b6000611f7a84828501611dff565b91505092915050565b60008060408385031215611f9a57611f99612b6d565b5b6000611fa885828601611dff565b9250506020611fb985828601611dff565b9150509250929050565b600080600060608486031215611fdc57611fdb612b6d565b5b6000611fea86828701611e14565b9350506020611ffb86828701611e14565b925050604061200c86828701611e14565b9150509250925092565b6000612022838361202e565b60208301905092915050565b612037816129b6565b82525050565b612046816129b6565b82525050565b6000612057826126eb565b612061818561270e565b935061206c836126db565b8060005b8381101561209d5781516120848882612016565b975061208f83612701565b925050600181019050612070565b5085935050505092915050565b6120b3816129c8565b82525050565b6120c281612a0b565b82525050565b60006120d3826126f6565b6120dd818561271f565b93506120ed818560208601612a1d565b6120f681612b72565b840191505092915050565b600061210e60238361271f565b915061211982612b90565b604082019050919050565b600061213160228361271f565b915061213c82612bdf565b604082019050919050565b600061215460268361271f565b915061215f82612c2e565b604082019050919050565b600061217760228361271f565b915061218282612c7d565b604082019050919050565b600061219a600e8361271f565b91506121a582612ccc565b602082019050919050565b60006121bd60128361271f565b91506121c882612cf5565b602082019050919050565b60006121e0601d8361271f565b91506121eb82612d1e565b602082019050919050565b600061220360268361271f565b915061220e82612d47565b604082019050919050565b6000612226602f8361271f565b915061223182612d96565b604082019050919050565b600061224960128361271f565b915061225482612de5565b602082019050919050565b600061226c60208361271f565b915061227782612e0e565b602082019050919050565b600061228f60218361271f565b915061229a82612e37565b604082019050919050565b60006122b260258361271f565b91506122bd82612e86565b604082019050919050565b60006122d560248361271f565b91506122e082612ed5565b604082019050919050565b60006122f8602b8361271f565b915061230382612f24565b604082019050919050565b600061231b60168361271f565b915061232682612f73565b602082019050919050565b600061233e60258361271f565b915061234982612f9c565b604082019050919050565b61235d816129f4565b82525050565b61236c816129fe565b82525050565b6000602082019050612387600083018461203d565b92915050565b600060c0820190506123a2600083018961203d565b6123af6020830188612354565b6123bc60408301876120b9565b6123c960608301866120b9565b6123d6608083018561203d565b6123e360a0830184612354565b979650505050505050565b600060208201905061240360008301846120aa565b92915050565b6000602082019050818103600083015261242381846120c8565b905092915050565b6000602082019050818103600083015261244481612101565b9050919050565b6000602082019050818103600083015261246481612124565b9050919050565b6000602082019050818103600083015261248481612147565b9050919050565b600060208201905081810360008301526124a48161216a565b9050919050565b600060208201905081810360008301526124c48161218d565b9050919050565b600060208201905081810360008301526124e4816121b0565b9050919050565b60006020820190508181036000830152612504816121d3565b9050919050565b60006020820190508181036000830152612524816121f6565b9050919050565b6000602082019050818103600083015261254481612219565b9050919050565b600060208201905081810360008301526125648161223c565b9050919050565b600060208201905081810360008301526125848161225f565b9050919050565b600060208201905081810360008301526125a481612282565b9050919050565b600060208201905081810360008301526125c4816122a5565b9050919050565b600060208201905081810360008301526125e4816122c8565b9050919050565b60006020820190508181036000830152612604816122eb565b9050919050565b600060208201905081810360008301526126248161230e565b9050919050565b6000602082019050818103600083015261264481612331565b9050919050565b60006020820190506126606000830184612354565b92915050565b600060a08201905061267b6000830188612354565b61268860208301876120b9565b818103604083015261269a818661204c565b90506126a9606083018561203d565b6126b66080830184612354565b9695505050505050565b60006020820190506126d56000830184612363565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061273b826129f4565b9150612746836129f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561277b5761277a612a82565b5b828201905092915050565b6000612791826129f4565b915061279c836129f4565b9250826127ac576127ab612ab1565b5b828204905092915050565b6000808291508390505b6001851115612801578086048111156127dd576127dc612a82565b5b60018516156127ec5780820291505b80810290506127fa85612b83565b94506127c1565b94509492505050565b6000612815826129f4565b9150612820836129f4565b925061284d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612855565b905092915050565b6000826128655760019050612921565b816128735760009050612921565b81600181146128895760028114612893576128c2565b6001915050612921565b60ff8411156128a5576128a4612a82565b5b8360020a9150848211156128bc576128bb612a82565b5b50612921565b5060208310610133831016604e8410600b84101617156128f75782820a9050838111156128f2576128f1612a82565b5b612921565b61290484848460016127b7565b9250905081840481111561291b5761291a612a82565b5b81810290505b9392505050565b6000612933826129f4565b915061293e836129f4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561297757612976612a82565b5b828202905092915050565b600061298d826129f4565b9150612998836129f4565b9250828210156129ab576129aa612a82565b5b828203905092915050565b60006129c1826129d4565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612a16826129f4565b9050919050565b60005b83811015612a3b578082015181840152602081019050612a20565b83811115612a4a576000848401525b50505050565b60006002820490506001821680612a6857607f821691505b60208210811415612a7c57612a7b612ae0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e76616c69642070657263656e746167650000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f776e6572736869702063616e6e6f742062652072656e6f756e63656420666f60008201527f72207468697320636f6e74726163740000000000000000000000000000000000602082015250565b7f457863656564656420627579206c696d69740000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207461782070657263656e7461676500000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b612ff4816129b6565b8114612fff57600080fd5b50565b61300b816129f4565b811461301657600080fd5b5056fea2646970667358221220eff585e1b6525f22ba326dd06f74109549e6574576ac1581febc669c0c950bfb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101815760003560e01c806395d89b41116100d1578063d0febe4c1161008a578063dd62ed3e11610064578063dd62ed3e1461055f578063dd8a53f51461059c578063e086e5ec146105c5578063f2fde38b146105dc57610181565b8063d0febe4c14610503578063d5aed6bf1461050d578063dc1052e21461053657610181565b806395d89b41146103e35780639cd441da1461040e578063a457c2d714610437578063a9059cbb14610474578063b28805f4146104b1578063d0d41fe1146104da57610181565b8063395093511161013e57806370a082311161011857806370a082311461033b578063715018a6146103785780638cd09d501461038f5780638da5cb5b146103b857610181565b806339509351146102ac57806342966c68146102e95780636c11bcd31461031257610181565b806306fdde0314610186578063095ea7b3146101b157806318160ddd146101ee57806323b872dd14610219578063313ce5671461025657806334384f7414610281575b600080fd5b34801561019257600080fd5b5061019b610605565b6040516101a89190612409565b60405180910390f35b3480156101bd57600080fd5b506101d860048036038101906101d39190611f16565b610697565b6040516101e591906123ee565b60405180910390f35b3480156101fa57600080fd5b506102036106ba565b604051610210919061264b565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190611ec3565b6106c4565b60405161024d91906123ee565b60405180910390f35b34801561026257600080fd5b5061026b6106f3565b60405161027891906126c0565b60405180910390f35b34801561028d57600080fd5b506102966106fc565b6040516102a3919061264b565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190611f16565b61073f565b6040516102e091906123ee565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190611f56565b610776565b005b34801561031e57600080fd5b5061033960048036038101906103349190611f56565b61078b565b005b34801561034757600080fd5b50610362600480360381019061035d9190611e29565b610923565b60405161036f919061264b565b60405180910390f35b34801561038457600080fd5b5061038d61096c565b005b34801561039b57600080fd5b506103b660048036038101906103b19190611f56565b6109af565b005b3480156103c457600080fd5b506103cd610a05565b6040516103da9190612372565b60405180910390f35b3480156103ef57600080fd5b506103f8610a2f565b6040516104059190612409565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190611f83565b610ac1565b005b34801561044357600080fd5b5061045e60048036038101906104599190611f16565b610bbd565b60405161046b91906123ee565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190611f16565b610c34565b6040516104a891906123ee565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190611f56565b610c57565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190611e29565b610eb1565b005b61050b610efd565b005b34801561051957600080fd5b50610534600480360381019061052f9190611e29565b6110f9565b005b34801561054257600080fd5b5061055d60048036038101906105589190611f56565b611145565b005b34801561056b57600080fd5b5061058660048036038101906105819190611e83565b61119b565b604051610593919061264b565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190611f56565b611222565b005b3480156105d157600080fd5b506105da611278565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190611e29565b6112c9565b005b60606036805461061490612a50565b80601f016020809104026020016040519081016040528092919081815260200182805461064090612a50565b801561068d5780601f106106625761010080835404028352916020019161068d565b820191906000526020600020905b81548152906001019060200180831161067057829003601f168201915b5050505050905090565b6000806106a2611426565b90506106af81858561142e565b600191505092915050565b6000603554905090565b6000806106cf611426565b90506106dc8582856115f9565b6106e7858585611685565b60019150509392505050565b60006012905090565b60008060646099546012600a610712919061280a565b641039d902806107229190612928565b61072c9190612928565b6107369190612786565b90508091505090565b60008061074a611426565b905061076b81858561075c858961119b565b6107669190612730565b61142e565b600191505092915050565b61077e611900565b610788338261197e565b50565b600081116107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c5906124ab565b60405180910390fd5b60006107dc82609854611b4e565b905080609d6000609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461084f9190612730565b9250508190555080826108629190612982565b609d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108b09190612730565b925050819055506108cd333083856108c89190612982565b611685565b3373ffffffffffffffffffffffffffffffffffffffff166108fc82846108f39190612982565b9081150290604051600060405180830381858888f1935050505015801561091e573d6000803e3d6000fd5b505050565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610974611900565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061252b565b60405180910390fd5b6109b7611900565b60648111156109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f29061260b565b60405180910390fd5b8060988190555050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610a3e90612a50565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a90612a50565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b610ac9611900565b610af630609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461142e565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080610b42610a05565b426040518863ffffffff1660e01b8152600401610b649695949392919061238d565b6060604051808303818588803b158015610b7d57600080fd5b505af1158015610b91573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bb69190611fc3565b5050505050565b600080610bc8611426565b90506000610bd6828661119b565b905083811015610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c129061262b565b60405180910390fd5b610c28828686840361142e565b60019250505092915050565b600080610c3f611426565b9050610c4c818585611685565b600191505092915050565b610c5f611900565b6000600267ffffffffffffffff811115610c7c57610c7b612b3e565b5b604051908082528060200260200182016040528015610caa5781602001602082028036833780820191505090505b5090503081600081518110610cc257610cc1612b0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6457600080fd5b505afa158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190611e56565b81600181518110610db057610daf612b0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610e1730609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461142e565b609b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401610e7b959493929190612666565b600060405180830381600087803b158015610e9557600080fd5b505af1158015610ea9573d6000803e3d6000fd5b505050505050565b610eb9611900565b80609a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003411610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f37906124ab565b60405180910390fd5b610f486106fc565b341115610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f819061254b565b60405180910390fd5b6000610f9834609754611b4e565b9050610fc730609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611685565b610fd2303383611685565b80609d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110219190612982565b9250508190555080609d6000609a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110999190612730565b9250508190555080609d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110ef9190612730565b9250508190555050565b611101611900565b80609c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61114d611900565b6064811115611191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111889061260b565b60405180910390fd5b8060978190555050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61122a611900565b606481111561126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906124cb565b60405180910390fd5b8060998190555050565b611280611900565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112c6573d6000803e3d6000fd5b50565b6112d1611900565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113389061246b565b60405180910390fd5b61134a81611b80565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b6906125eb565b60405180910390fd5b6113c98282611c46565b5050565b600060019054906101000a900460ff1661141c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611413906125eb565b60405180910390fd5b611424611cc7565b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906125cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115059061248b565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115ec919061264b565b60405180910390a3505050565b6000611605848461119b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461167f5781811015611671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611668906124eb565b60405180910390fd5b61167e848484840361142e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec906125ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c9061242b565b60405180910390fd5b611770838383611d28565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee9061250b565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e7919061264b565b60405180910390a36118fa848484611d2d565b50505050565b611908611426565b73ffffffffffffffffffffffffffffffffffffffff16611926610a05565b73ffffffffffffffffffffffffffffffffffffffff161461197c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119739061256b565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061258b565b60405180910390fd5b6119fa82600083611d28565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061244b565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b35919061264b565b60405180910390a3611b4983600084611d2d565b505050565b60008060648385611b5f9190612928565b611b699190612786565b90508084611b779190612982565b91505092915050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060019054906101000a900460ff16611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c906125eb565b60405180910390fd5b8160369080519060200190611cab929190611d32565b508060379080519060200190611cc2929190611d32565b505050565b600060019054906101000a900460ff16611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906125eb565b60405180910390fd5b611d26611d21611426565b611b80565b565b505050565b505050565b828054611d3e90612a50565b90600052602060002090601f016020900481019282611d605760008555611da7565b82601f10611d7957805160ff1916838001178555611da7565b82800160010185558215611da7579182015b82811115611da6578251825591602001919060010190611d8b565b5b509050611db49190611db8565b5090565b5b80821115611dd1576000816000905550600101611db9565b5090565b600081359050611de481612feb565b92915050565b600081519050611df981612feb565b92915050565b600081359050611e0e81613002565b92915050565b600081519050611e2381613002565b92915050565b600060208284031215611e3f57611e3e612b6d565b5b6000611e4d84828501611dd5565b91505092915050565b600060208284031215611e6c57611e6b612b6d565b5b6000611e7a84828501611dea565b91505092915050565b60008060408385031215611e9a57611e99612b6d565b5b6000611ea885828601611dd5565b9250506020611eb985828601611dd5565b9150509250929050565b600080600060608486031215611edc57611edb612b6d565b5b6000611eea86828701611dd5565b9350506020611efb86828701611dd5565b9250506040611f0c86828701611dff565b9150509250925092565b60008060408385031215611f2d57611f2c612b6d565b5b6000611f3b85828601611dd5565b9250506020611f4c85828601611dff565b9150509250929050565b600060208284031215611f6c57611f6b612b6d565b5b6000611f7a84828501611dff565b91505092915050565b60008060408385031215611f9a57611f99612b6d565b5b6000611fa885828601611dff565b9250506020611fb985828601611dff565b9150509250929050565b600080600060608486031215611fdc57611fdb612b6d565b5b6000611fea86828701611e14565b9350506020611ffb86828701611e14565b925050604061200c86828701611e14565b9150509250925092565b6000612022838361202e565b60208301905092915050565b612037816129b6565b82525050565b612046816129b6565b82525050565b6000612057826126eb565b612061818561270e565b935061206c836126db565b8060005b8381101561209d5781516120848882612016565b975061208f83612701565b925050600181019050612070565b5085935050505092915050565b6120b3816129c8565b82525050565b6120c281612a0b565b82525050565b60006120d3826126f6565b6120dd818561271f565b93506120ed818560208601612a1d565b6120f681612b72565b840191505092915050565b600061210e60238361271f565b915061211982612b90565b604082019050919050565b600061213160228361271f565b915061213c82612bdf565b604082019050919050565b600061215460268361271f565b915061215f82612c2e565b604082019050919050565b600061217760228361271f565b915061218282612c7d565b604082019050919050565b600061219a600e8361271f565b91506121a582612ccc565b602082019050919050565b60006121bd60128361271f565b91506121c882612cf5565b602082019050919050565b60006121e0601d8361271f565b91506121eb82612d1e565b602082019050919050565b600061220360268361271f565b915061220e82612d47565b604082019050919050565b6000612226602f8361271f565b915061223182612d96565b604082019050919050565b600061224960128361271f565b915061225482612de5565b602082019050919050565b600061226c60208361271f565b915061227782612e0e565b602082019050919050565b600061228f60218361271f565b915061229a82612e37565b604082019050919050565b60006122b260258361271f565b91506122bd82612e86565b604082019050919050565b60006122d560248361271f565b91506122e082612ed5565b604082019050919050565b60006122f8602b8361271f565b915061230382612f24565b604082019050919050565b600061231b60168361271f565b915061232682612f73565b602082019050919050565b600061233e60258361271f565b915061234982612f9c565b604082019050919050565b61235d816129f4565b82525050565b61236c816129fe565b82525050565b6000602082019050612387600083018461203d565b92915050565b600060c0820190506123a2600083018961203d565b6123af6020830188612354565b6123bc60408301876120b9565b6123c960608301866120b9565b6123d6608083018561203d565b6123e360a0830184612354565b979650505050505050565b600060208201905061240360008301846120aa565b92915050565b6000602082019050818103600083015261242381846120c8565b905092915050565b6000602082019050818103600083015261244481612101565b9050919050565b6000602082019050818103600083015261246481612124565b9050919050565b6000602082019050818103600083015261248481612147565b9050919050565b600060208201905081810360008301526124a48161216a565b9050919050565b600060208201905081810360008301526124c48161218d565b9050919050565b600060208201905081810360008301526124e4816121b0565b9050919050565b60006020820190508181036000830152612504816121d3565b9050919050565b60006020820190508181036000830152612524816121f6565b9050919050565b6000602082019050818103600083015261254481612219565b9050919050565b600060208201905081810360008301526125648161223c565b9050919050565b600060208201905081810360008301526125848161225f565b9050919050565b600060208201905081810360008301526125a481612282565b9050919050565b600060208201905081810360008301526125c4816122a5565b9050919050565b600060208201905081810360008301526125e4816122c8565b9050919050565b60006020820190508181036000830152612604816122eb565b9050919050565b600060208201905081810360008301526126248161230e565b9050919050565b6000602082019050818103600083015261264481612331565b9050919050565b60006020820190506126606000830184612354565b92915050565b600060a08201905061267b6000830188612354565b61268860208301876120b9565b818103604083015261269a818661204c565b90506126a9606083018561203d565b6126b66080830184612354565b9695505050505050565b60006020820190506126d56000830184612363565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061273b826129f4565b9150612746836129f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561277b5761277a612a82565b5b828201905092915050565b6000612791826129f4565b915061279c836129f4565b9250826127ac576127ab612ab1565b5b828204905092915050565b6000808291508390505b6001851115612801578086048111156127dd576127dc612a82565b5b60018516156127ec5780820291505b80810290506127fa85612b83565b94506127c1565b94509492505050565b6000612815826129f4565b9150612820836129f4565b925061284d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612855565b905092915050565b6000826128655760019050612921565b816128735760009050612921565b81600181146128895760028114612893576128c2565b6001915050612921565b60ff8411156128a5576128a4612a82565b5b8360020a9150848211156128bc576128bb612a82565b5b50612921565b5060208310610133831016604e8410600b84101617156128f75782820a9050838111156128f2576128f1612a82565b5b612921565b61290484848460016127b7565b9250905081840481111561291b5761291a612a82565b5b81810290505b9392505050565b6000612933826129f4565b915061293e836129f4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561297757612976612a82565b5b828202905092915050565b600061298d826129f4565b9150612998836129f4565b9250828210156129ab576129aa612a82565b5b828203905092915050565b60006129c1826129d4565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612a16826129f4565b9050919050565b60005b83811015612a3b578082015181840152602081019050612a20565b83811115612a4a576000848401525b50505050565b60006002820490506001821680612a6857607f821691505b60208210811415612a7c57612a7b612ae0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e76616c69642070657263656e746167650000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f776e6572736869702063616e6e6f742062652072656e6f756e63656420666f60008201527f72207468697320636f6e74726163740000000000000000000000000000000000602082015250565b7f457863656564656420627579206c696d69740000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207461782070657263656e7461676500000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b612ff4816129b6565b8114612fff57600080fd5b50565b61300b816129f4565b811461301657600080fd5b5056fea2646970667358221220eff585e1b6525f22ba326dd06f74109549e6574576ac1581febc669c0c950bfb64736f6c63430008070033

Deployed Bytecode Sourcemap

64751:4555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53259:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55619:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54388:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56400:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65933:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67273:166;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57070:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66346:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67441:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54559:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68555:139;;;;;;;;;;;;;:::i;:::-;;66199:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45409:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53478:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68181:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57811:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54892:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68822:481;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66617:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66728:536;;;:::i;:::-;;68078:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66052:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55148:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66445:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68702:112;;;;;;;;;;;;;:::i;:::-;;46308:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53259:100;53313:13;53346:5;53339:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53259:100;:::o;55619:201::-;55702:4;55719:13;55735:12;:10;:12::i;:::-;55719:28;;55758:32;55767:5;55774:7;55783:6;55758:8;:32::i;:::-;55808:4;55801:11;;;55619:201;;;;:::o;54388:108::-;54449:7;54476:12;;54469:19;;54388:108;:::o;56400:261::-;56497:4;56514:15;56532:12;:10;:12::i;:::-;56514:30;;56555:38;56571:4;56577:7;56586:6;56555:15;:38::i;:::-;56604:27;56614:4;56620:2;56624:6;56604:9;:27::i;:::-;56649:4;56642:11;;;56400:261;;;;;:::o;65933:107::-;65991:5;64871:2;66009:23;;65933:107;:::o;67273:166::-;67323:7;67339:23;67403:3;67383:16;;64871:2;64937;:13;;;;:::i;:::-;64922:11;:29;;;;:::i;:::-;67366:33;;;;:::i;:::-;67365:41;;;;:::i;:::-;67339:67;;67420:15;67413:22;;;67273:166;:::o;57070:238::-;57158:4;57175:13;57191:12;:10;:12::i;:::-;57175:28;;57214:64;57223:5;57230:7;57267:10;57239:25;57249:5;57256:7;57239:9;:25::i;:::-;:38;;;;:::i;:::-;57214:8;:64::i;:::-;57296:4;57289:11;;;57070:238;;;;:::o;66346:93::-;45295:13;:11;:13::i;:::-;66406:25:::1;66412:10;66424:6;66406:5;:25::i;:::-;66346:93:::0;:::o;67441:432::-;67514:1;67505:6;:10;67497:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;67545:17;67565:41;67589:6;67597:8;;67565:23;:41::i;:::-;67545:61;;67643:9;67617;:22;67627:11;;;;;;;;;;;67617:22;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;67738:9;67729:6;:18;;;;:::i;:::-;67701:9;:24;67719:4;67701:24;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;67754:56;67764:10;67784:4;67800:9;67791:6;:18;;;;:::i;:::-;67754:9;:56::i;:::-;67825:10;67817:28;;:48;67855:9;67846:6;:18;;;;:::i;:::-;67817:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67486:387;67441:432;:::o;54559:127::-;54633:7;54660:9;:18;54670:7;54660:18;;;;;;;;;;;;;;;;54653:25;;54559:127;;;:::o;68555:139::-;45295:13;:11;:13::i;:::-;68629:57:::1;;;;;;;;;;:::i;:::-;;;;;;;;66199:141:::0;45295:13;:11;:13::i;:::-;66277:3:::1;66270;:10;;66262:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;66329:3;66318:8;:14;;;;66199:141:::0;:::o;45409:87::-;45455:7;45482:6;;;;;;;;;;;45475:13;;45409:87;:::o;53478:104::-;53534:13;53567:7;53560:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53478:104;:::o;68181:370::-;45295:13;:11;:13::i;:::-;68273:61:::1;68290:4;68305:14;;;;;;;;;;;68322:11;68273:8;:61::i;:::-;68345:14;;;;;;;;;;;:30;;;68383:9;68416:4;68436:11;68462:1;68478::::0;68494:7:::1;:5;:7::i;:::-;68516:15;68345:197;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;68181:370:::0;;:::o;57811:436::-;57904:4;57921:13;57937:12;:10;:12::i;:::-;57921:28;;57960:24;57987:25;57997:5;58004:7;57987:9;:25::i;:::-;57960:52;;58051:15;58031:16;:35;;58023:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58144:60;58153:5;58160:7;58188:15;58169:16;:34;58144:8;:60::i;:::-;58235:4;58228:11;;;;57811:436;;;;:::o;54892:193::-;54971:4;54988:13;55004:12;:10;:12::i;:::-;54988:28;;55027;55037:5;55044:2;55048:6;55027:9;:28::i;:::-;55073:4;55066:11;;;54892:193;;;;:::o;68822:481::-;45295:13;:11;:13::i;:::-;68899:21:::1;68937:1;68923:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68899:40;;68968:4;68950;68955:1;68950:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;68994:14;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68984:4;68989:1;68984:7;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;::::0;::::1;69028:61;69045:4;69060:14;;;;;;;;;;;69077:11;69028:8;:61::i;:::-;69100:14;;;;;;;;;;;:65;;;69180:11;69206:1;69222:4;69249;69269:15;69100:195;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68888:415;68822:481:::0;:::o;66617:105::-;45295:13;:11;:13::i;:::-;66704:10:::1;66690:11;;:24;;;;;;;;;;;;;;;;;;66617:105:::0;:::o;66728:536::-;66797:1;66785:9;:13;66777:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;66849:19;:17;:19::i;:::-;66836:9;:32;;66828:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;66902:24;66929:43;66953:9;66964:7;;66929:23;:43::i;:::-;66902:70;;66983:55;67001:4;67008:11;;;;;;;;;;;67021:16;66983:9;:55::i;:::-;67049;67067:4;67075:10;67087:16;67049:9;:55::i;:::-;67143:16;67115:9;:24;67133:4;67115:24;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;67192:16;67166:9;:22;67176:11;;;;;;;;;;;67166:22;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;67240:16;67215:9;:21;67225:10;67215:21;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;66766:498;66728:536::o;68078:95::-;45295:13;:11;:13::i;:::-;68161:4:::1;68146:12;;:19;;;;;;;;;;;;;;;;;;68078:95:::0;:::o;66052:139::-;45295:13;:11;:13::i;:::-;66129:3:::1;66122;:10;;66114:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;66180:3;66170:7;:13;;;;66052:139:::0;:::o;55148:151::-;55237:7;55264:11;:18;55276:5;55264:18;;;;;;;;;;;;;;;:27;55283:7;55264:27;;;;;;;;;;;;;;;;55257:34;;55148:151;;;;:::o;66445:165::-;45295:13;:11;:13::i;:::-;66539:3:::1;66528:7;:14;;66520:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;66595:7;66576:16;:26;;;;66445:165:::0;:::o;68702:112::-;45295:13;:11;:13::i;:::-;68763:10:::1;68755:28;;:51;68784:21;68755:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68702:112::o:0;46308:201::-;45295:13;:11;:13::i;:::-;46417:1:::1;46397:22;;:8;:22;;;;46389:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46473:28;46492:8;46473:18;:28::i;:::-;46308:201:::0;:::o;27602:326::-;27662:4;27919:1;27897:7;:19;;;:23;27890:30;;27602:326;;;:::o;52870:149::-;41268:13;;;;;;;;;;;41260:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52973:38:::1;52996:5;53003:7;52973:22;:38::i;:::-;52870:149:::0;;:::o;44952:97::-;41268:13;;;;;;;;;;;41260:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45015:26:::1;:24;:26::i;:::-;44952:97::o:0;43447:98::-;43500:7;43527:10;43520:17;;43447:98;:::o;61804:346::-;61923:1;61906:19;;:5;:19;;;;61898:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62004:1;61985:21;;:7;:21;;;;61977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62088:6;62058:11;:18;62070:5;62058:18;;;;;;;;;;;;;;;:27;62077:7;62058:27;;;;;;;;;;;;;;;:36;;;;62126:7;62110:32;;62119:5;62110:32;;;62135:6;62110:32;;;;;;:::i;:::-;;;;;;;;61804:346;;;:::o;62441:419::-;62542:24;62569:25;62579:5;62586:7;62569:9;:25::i;:::-;62542:52;;62629:17;62609:16;:37;62605:248;;62691:6;62671:16;:26;;62663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62775:51;62784:5;62791:7;62819:6;62800:16;:25;62775:8;:51::i;:::-;62605:248;62531:329;62441:419;;;:::o;58717:806::-;58830:1;58814:18;;:4;:18;;;;58806:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58907:1;58893:16;;:2;:16;;;;58885:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58962:38;58983:4;58989:2;58993:6;58962:20;:38::i;:::-;59013:19;59035:9;:15;59045:4;59035:15;;;;;;;;;;;;;;;;59013:37;;59084:6;59069:11;:21;;59061:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59201:6;59187:11;:20;59169:9;:15;59179:4;59169:15;;;;;;;;;;;;;;;:38;;;;59404:6;59387:9;:13;59397:2;59387:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;59454:2;59439:26;;59448:4;59439:26;;;59458:6;59439:26;;;;;;:::i;:::-;;;;;;;;59478:37;59498:4;59504:2;59508:6;59478:19;:37::i;:::-;58795:728;58717:806;;;:::o;45574:132::-;45649:12;:10;:12::i;:::-;45638:23;;:7;:5;:7::i;:::-;:23;;;45630:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45574:132::o;60691:675::-;60794:1;60775:21;;:7;:21;;;;60767:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60847:49;60868:7;60885:1;60889:6;60847:20;:49::i;:::-;60909:22;60934:9;:18;60944:7;60934:18;;;;;;;;;;;;;;;;60909:43;;60989:6;60971:14;:24;;60963:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61108:6;61091:14;:23;61070:9;:18;61080:7;61070:18;;;;;;;;;;;;;;;:44;;;;61225:6;61209:12;;:22;;;;;;;;;;;61286:1;61260:37;;61269:7;61260:37;;;61290:6;61260:37;;;;;;:::i;:::-;;;;;;;;61310:48;61330:7;61347:1;61351:6;61310:19;:48::i;:::-;60756:610;60691:675;;:::o;67881:189::-;67966:7;67986:17;68023:3;68016;68007:6;:12;;;;:::i;:::-;68006:20;;;;:::i;:::-;67986:40;;68053:9;68044:6;:18;;;;:::i;:::-;68037:25;;;67881:189;;;;:::o;46669:191::-;46743:16;46762:6;;;;;;;;;;;46743:25;;46788:8;46779:6;;:17;;;;;;;;;;;;;;;;;;46843:8;46812:40;;46833:8;46812:40;;;;;;;;;;;;46732:128;46669:191;:::o;53027:162::-;41268:13;;;;;;;;;;;41260:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53148:5:::1;53140;:13;;;;;;;;;;;;:::i;:::-;;53174:7;53164;:17;;;;;;;;;;;;:::i;:::-;;53027:162:::0;;:::o;45057:113::-;41268:13;;;;;;;;;;;41260:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45130:32:::1;45149:12;:10;:12::i;:::-;45130:18;:32::i;:::-;45057:113::o:0;63460:91::-;;;;:::o;64155:90::-;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;301:139::-;347:5;385:6;372:20;363:29;;401:33;428:5;401:33;:::i;:::-;301:139;;;;:::o;446:143::-;503:5;534:6;528:13;519:22;;550:33;577:5;550:33;:::i;:::-;446:143;;;;:::o;595:329::-;654:6;703:2;691:9;682:7;678:23;674:32;671:119;;;709:79;;:::i;:::-;671:119;829:1;854:53;899:7;890:6;879:9;875:22;854:53;:::i;:::-;844:63;;800:117;595:329;;;;:::o;930:351::-;1000:6;1049:2;1037:9;1028:7;1024:23;1020:32;1017:119;;;1055:79;;:::i;:::-;1017:119;1175:1;1200:64;1256:7;1247:6;1236:9;1232:22;1200:64;:::i;:::-;1190:74;;1146:128;930:351;;;;:::o;1287:474::-;1355:6;1363;1412:2;1400:9;1391:7;1387:23;1383:32;1380:119;;;1418:79;;:::i;:::-;1380:119;1538:1;1563:53;1608:7;1599:6;1588:9;1584:22;1563:53;:::i;:::-;1553:63;;1509:117;1665:2;1691:53;1736:7;1727:6;1716:9;1712:22;1691:53;:::i;:::-;1681:63;;1636:118;1287:474;;;;;:::o;1767:619::-;1844:6;1852;1860;1909:2;1897:9;1888:7;1884:23;1880:32;1877:119;;;1915:79;;:::i;:::-;1877:119;2035:1;2060:53;2105:7;2096:6;2085:9;2081:22;2060:53;:::i;:::-;2050:63;;2006:117;2162:2;2188:53;2233:7;2224:6;2213:9;2209:22;2188:53;:::i;:::-;2178:63;;2133:118;2290:2;2316:53;2361:7;2352:6;2341:9;2337:22;2316:53;:::i;:::-;2306:63;;2261:118;1767:619;;;;;:::o;2392:474::-;2460:6;2468;2517:2;2505:9;2496:7;2492:23;2488:32;2485:119;;;2523:79;;:::i;:::-;2485:119;2643:1;2668:53;2713:7;2704:6;2693:9;2689:22;2668:53;:::i;:::-;2658:63;;2614:117;2770:2;2796:53;2841:7;2832:6;2821:9;2817:22;2796:53;:::i;:::-;2786:63;;2741:118;2392:474;;;;;:::o;2872:329::-;2931:6;2980:2;2968:9;2959:7;2955:23;2951:32;2948:119;;;2986:79;;:::i;:::-;2948:119;3106:1;3131:53;3176:7;3167:6;3156:9;3152:22;3131:53;:::i;:::-;3121:63;;3077:117;2872:329;;;;:::o;3207:474::-;3275:6;3283;3332:2;3320:9;3311:7;3307:23;3303:32;3300:119;;;3338:79;;:::i;:::-;3300:119;3458:1;3483:53;3528:7;3519:6;3508:9;3504:22;3483:53;:::i;:::-;3473:63;;3429:117;3585:2;3611:53;3656:7;3647:6;3636:9;3632:22;3611:53;:::i;:::-;3601:63;;3556:118;3207:474;;;;;:::o;3687:663::-;3775:6;3783;3791;3840:2;3828:9;3819:7;3815:23;3811:32;3808:119;;;3846:79;;:::i;:::-;3808:119;3966:1;3991:64;4047:7;4038:6;4027:9;4023:22;3991:64;:::i;:::-;3981:74;;3937:128;4104:2;4130:64;4186:7;4177:6;4166:9;4162:22;4130:64;:::i;:::-;4120:74;;4075:129;4243:2;4269:64;4325:7;4316:6;4305:9;4301:22;4269:64;:::i;:::-;4259:74;;4214:129;3687:663;;;;;:::o;4356:179::-;4425:10;4446:46;4488:3;4480:6;4446:46;:::i;:::-;4524:4;4519:3;4515:14;4501:28;;4356:179;;;;:::o;4541:108::-;4618:24;4636:5;4618:24;:::i;:::-;4613:3;4606:37;4541:108;;:::o;4655:118::-;4742:24;4760:5;4742:24;:::i;:::-;4737:3;4730:37;4655:118;;:::o;4809:732::-;4928:3;4957:54;5005:5;4957:54;:::i;:::-;5027:86;5106:6;5101:3;5027:86;:::i;:::-;5020:93;;5137:56;5187:5;5137:56;:::i;:::-;5216:7;5247:1;5232:284;5257:6;5254:1;5251:13;5232:284;;;5333:6;5327:13;5360:63;5419:3;5404:13;5360:63;:::i;:::-;5353:70;;5446:60;5499:6;5446:60;:::i;:::-;5436:70;;5292:224;5279:1;5276;5272:9;5267:14;;5232:284;;;5236:14;5532:3;5525:10;;4933:608;;;4809:732;;;;:::o;5547:109::-;5628:21;5643:5;5628:21;:::i;:::-;5623:3;5616:34;5547:109;;:::o;5662:147::-;5757:45;5796:5;5757:45;:::i;:::-;5752:3;5745:58;5662:147;;:::o;5815:364::-;5903:3;5931:39;5964:5;5931:39;:::i;:::-;5986:71;6050:6;6045:3;5986:71;:::i;:::-;5979:78;;6066:52;6111:6;6106:3;6099:4;6092:5;6088:16;6066:52;:::i;:::-;6143:29;6165:6;6143:29;:::i;:::-;6138:3;6134:39;6127:46;;5907:272;5815:364;;;;:::o;6185:366::-;6327:3;6348:67;6412:2;6407:3;6348:67;:::i;:::-;6341:74;;6424:93;6513:3;6424:93;:::i;:::-;6542:2;6537:3;6533:12;6526:19;;6185:366;;;:::o;6557:::-;6699:3;6720:67;6784:2;6779:3;6720:67;:::i;:::-;6713:74;;6796:93;6885:3;6796:93;:::i;:::-;6914:2;6909:3;6905:12;6898:19;;6557:366;;;:::o;6929:::-;7071:3;7092:67;7156:2;7151:3;7092:67;:::i;:::-;7085:74;;7168:93;7257:3;7168:93;:::i;:::-;7286:2;7281:3;7277:12;7270:19;;6929:366;;;:::o;7301:::-;7443:3;7464:67;7528:2;7523:3;7464:67;:::i;:::-;7457:74;;7540:93;7629:3;7540:93;:::i;:::-;7658:2;7653:3;7649:12;7642:19;;7301:366;;;:::o;7673:::-;7815:3;7836:67;7900:2;7895:3;7836:67;:::i;:::-;7829:74;;7912:93;8001:3;7912:93;:::i;:::-;8030:2;8025:3;8021:12;8014:19;;7673:366;;;:::o;8045:::-;8187:3;8208:67;8272:2;8267:3;8208:67;:::i;:::-;8201:74;;8284:93;8373:3;8284:93;:::i;:::-;8402:2;8397:3;8393:12;8386:19;;8045:366;;;:::o;8417:::-;8559:3;8580:67;8644:2;8639:3;8580:67;:::i;:::-;8573:74;;8656:93;8745:3;8656:93;:::i;:::-;8774:2;8769:3;8765:12;8758:19;;8417:366;;;:::o;8789:::-;8931:3;8952:67;9016:2;9011:3;8952:67;:::i;:::-;8945:74;;9028:93;9117:3;9028:93;:::i;:::-;9146:2;9141:3;9137:12;9130:19;;8789:366;;;:::o;9161:::-;9303:3;9324:67;9388:2;9383:3;9324:67;:::i;:::-;9317:74;;9400:93;9489:3;9400:93;:::i;:::-;9518:2;9513:3;9509:12;9502:19;;9161:366;;;:::o;9533:::-;9675:3;9696:67;9760:2;9755:3;9696:67;:::i;:::-;9689:74;;9772:93;9861:3;9772:93;:::i;:::-;9890:2;9885:3;9881:12;9874:19;;9533:366;;;:::o;9905:::-;10047:3;10068:67;10132:2;10127:3;10068:67;:::i;:::-;10061:74;;10144:93;10233:3;10144:93;:::i;:::-;10262:2;10257:3;10253:12;10246:19;;9905:366;;;:::o;10277:::-;10419:3;10440:67;10504:2;10499:3;10440:67;:::i;:::-;10433:74;;10516:93;10605:3;10516:93;:::i;:::-;10634:2;10629:3;10625:12;10618:19;;10277:366;;;:::o;10649:::-;10791:3;10812:67;10876:2;10871:3;10812:67;:::i;:::-;10805:74;;10888:93;10977:3;10888:93;:::i;:::-;11006:2;11001:3;10997:12;10990:19;;10649:366;;;:::o;11021:::-;11163:3;11184:67;11248:2;11243:3;11184:67;:::i;:::-;11177:74;;11260:93;11349:3;11260:93;:::i;:::-;11378:2;11373:3;11369:12;11362:19;;11021:366;;;:::o;11393:::-;11535:3;11556:67;11620:2;11615:3;11556:67;:::i;:::-;11549:74;;11632:93;11721:3;11632:93;:::i;:::-;11750:2;11745:3;11741:12;11734:19;;11393:366;;;:::o;11765:::-;11907:3;11928:67;11992:2;11987:3;11928:67;:::i;:::-;11921:74;;12004:93;12093:3;12004:93;:::i;:::-;12122:2;12117:3;12113:12;12106:19;;11765:366;;;:::o;12137:::-;12279:3;12300:67;12364:2;12359:3;12300:67;:::i;:::-;12293:74;;12376:93;12465:3;12376:93;:::i;:::-;12494:2;12489:3;12485:12;12478:19;;12137:366;;;:::o;12509:118::-;12596:24;12614:5;12596:24;:::i;:::-;12591:3;12584:37;12509:118;;:::o;12633:112::-;12716:22;12732:5;12716:22;:::i;:::-;12711:3;12704:35;12633:112;;:::o;12751:222::-;12844:4;12882:2;12871:9;12867:18;12859:26;;12895:71;12963:1;12952:9;12948:17;12939:6;12895:71;:::i;:::-;12751:222;;;;:::o;12979:807::-;13228:4;13266:3;13255:9;13251:19;13243:27;;13280:71;13348:1;13337:9;13333:17;13324:6;13280:71;:::i;:::-;13361:72;13429:2;13418:9;13414:18;13405:6;13361:72;:::i;:::-;13443:80;13519:2;13508:9;13504:18;13495:6;13443:80;:::i;:::-;13533;13609:2;13598:9;13594:18;13585:6;13533:80;:::i;:::-;13623:73;13691:3;13680:9;13676:19;13667:6;13623:73;:::i;:::-;13706;13774:3;13763:9;13759:19;13750:6;13706:73;:::i;:::-;12979:807;;;;;;;;;:::o;13792:210::-;13879:4;13917:2;13906:9;13902:18;13894:26;;13930:65;13992:1;13981:9;13977:17;13968:6;13930:65;:::i;:::-;13792:210;;;;:::o;14008:313::-;14121:4;14159:2;14148:9;14144:18;14136:26;;14208:9;14202:4;14198:20;14194:1;14183:9;14179:17;14172:47;14236:78;14309:4;14300:6;14236:78;:::i;:::-;14228:86;;14008:313;;;;:::o;14327:419::-;14493:4;14531:2;14520:9;14516:18;14508:26;;14580:9;14574:4;14570:20;14566:1;14555:9;14551:17;14544:47;14608:131;14734:4;14608:131;:::i;:::-;14600:139;;14327:419;;;:::o;14752:::-;14918:4;14956:2;14945:9;14941:18;14933:26;;15005:9;14999:4;14995:20;14991:1;14980:9;14976:17;14969:47;15033:131;15159:4;15033:131;:::i;:::-;15025:139;;14752:419;;;:::o;15177:::-;15343:4;15381:2;15370:9;15366:18;15358:26;;15430:9;15424:4;15420:20;15416:1;15405:9;15401:17;15394:47;15458:131;15584:4;15458:131;:::i;:::-;15450:139;;15177:419;;;:::o;15602:::-;15768:4;15806:2;15795:9;15791:18;15783:26;;15855:9;15849:4;15845:20;15841:1;15830:9;15826:17;15819:47;15883:131;16009:4;15883:131;:::i;:::-;15875:139;;15602:419;;;:::o;16027:::-;16193:4;16231:2;16220:9;16216:18;16208:26;;16280:9;16274:4;16270:20;16266:1;16255:9;16251:17;16244:47;16308:131;16434:4;16308:131;:::i;:::-;16300:139;;16027:419;;;:::o;16452:::-;16618:4;16656:2;16645:9;16641:18;16633:26;;16705:9;16699:4;16695:20;16691:1;16680:9;16676:17;16669:47;16733:131;16859:4;16733:131;:::i;:::-;16725:139;;16452:419;;;:::o;16877:::-;17043:4;17081:2;17070:9;17066:18;17058:26;;17130:9;17124:4;17120:20;17116:1;17105:9;17101:17;17094:47;17158:131;17284:4;17158:131;:::i;:::-;17150:139;;16877:419;;;:::o;17302:::-;17468:4;17506:2;17495:9;17491:18;17483:26;;17555:9;17549:4;17545:20;17541:1;17530:9;17526:17;17519:47;17583:131;17709:4;17583:131;:::i;:::-;17575:139;;17302:419;;;:::o;17727:::-;17893:4;17931:2;17920:9;17916:18;17908:26;;17980:9;17974:4;17970:20;17966:1;17955:9;17951:17;17944:47;18008:131;18134:4;18008:131;:::i;:::-;18000:139;;17727:419;;;:::o;18152:::-;18318:4;18356:2;18345:9;18341:18;18333:26;;18405:9;18399:4;18395:20;18391:1;18380:9;18376:17;18369:47;18433:131;18559:4;18433:131;:::i;:::-;18425:139;;18152:419;;;:::o;18577:::-;18743:4;18781:2;18770:9;18766:18;18758:26;;18830:9;18824:4;18820:20;18816:1;18805:9;18801:17;18794:47;18858:131;18984:4;18858:131;:::i;:::-;18850:139;;18577:419;;;:::o;19002:::-;19168:4;19206:2;19195:9;19191:18;19183:26;;19255:9;19249:4;19245:20;19241:1;19230:9;19226:17;19219:47;19283:131;19409:4;19283:131;:::i;:::-;19275:139;;19002:419;;;:::o;19427:::-;19593:4;19631:2;19620:9;19616:18;19608:26;;19680:9;19674:4;19670:20;19666:1;19655:9;19651:17;19644:47;19708:131;19834:4;19708:131;:::i;:::-;19700:139;;19427:419;;;:::o;19852:::-;20018:4;20056:2;20045:9;20041:18;20033:26;;20105:9;20099:4;20095:20;20091:1;20080:9;20076:17;20069:47;20133:131;20259:4;20133:131;:::i;:::-;20125:139;;19852:419;;;:::o;20277:::-;20443:4;20481:2;20470:9;20466:18;20458:26;;20530:9;20524:4;20520:20;20516:1;20505:9;20501:17;20494:47;20558:131;20684:4;20558:131;:::i;:::-;20550:139;;20277:419;;;:::o;20702:::-;20868:4;20906:2;20895:9;20891:18;20883:26;;20955:9;20949:4;20945:20;20941:1;20930:9;20926:17;20919:47;20983:131;21109:4;20983:131;:::i;:::-;20975:139;;20702:419;;;:::o;21127:::-;21293:4;21331:2;21320:9;21316:18;21308:26;;21380:9;21374:4;21370:20;21366:1;21355:9;21351:17;21344:47;21408:131;21534:4;21408:131;:::i;:::-;21400:139;;21127:419;;;:::o;21552:222::-;21645:4;21683:2;21672:9;21668:18;21660:26;;21696:71;21764:1;21753:9;21749:17;21740:6;21696:71;:::i;:::-;21552:222;;;;:::o;21780:831::-;22043:4;22081:3;22070:9;22066:19;22058:27;;22095:71;22163:1;22152:9;22148:17;22139:6;22095:71;:::i;:::-;22176:80;22252:2;22241:9;22237:18;22228:6;22176:80;:::i;:::-;22303:9;22297:4;22293:20;22288:2;22277:9;22273:18;22266:48;22331:108;22434:4;22425:6;22331:108;:::i;:::-;22323:116;;22449:72;22517:2;22506:9;22502:18;22493:6;22449:72;:::i;:::-;22531:73;22599:3;22588:9;22584:19;22575:6;22531:73;:::i;:::-;21780:831;;;;;;;;:::o;22617:214::-;22706:4;22744:2;22733:9;22729:18;22721:26;;22757:67;22821:1;22810:9;22806:17;22797:6;22757:67;:::i;:::-;22617:214;;;;:::o;22918:132::-;22985:4;23008:3;23000:11;;23038:4;23033:3;23029:14;23021:22;;22918:132;;;:::o;23056:114::-;23123:6;23157:5;23151:12;23141:22;;23056:114;;;:::o;23176:99::-;23228:6;23262:5;23256:12;23246:22;;23176:99;;;:::o;23281:113::-;23351:4;23383;23378:3;23374:14;23366:22;;23281:113;;;:::o;23400:184::-;23499:11;23533:6;23528:3;23521:19;23573:4;23568:3;23564:14;23549:29;;23400:184;;;;:::o;23590:169::-;23674:11;23708:6;23703:3;23696:19;23748:4;23743:3;23739:14;23724:29;;23590:169;;;;:::o;23765:305::-;23805:3;23824:20;23842:1;23824:20;:::i;:::-;23819:25;;23858:20;23876:1;23858:20;:::i;:::-;23853:25;;24012:1;23944:66;23940:74;23937:1;23934:81;23931:107;;;24018:18;;:::i;:::-;23931:107;24062:1;24059;24055:9;24048:16;;23765:305;;;;:::o;24076:185::-;24116:1;24133:20;24151:1;24133:20;:::i;:::-;24128:25;;24167:20;24185:1;24167:20;:::i;:::-;24162:25;;24206:1;24196:35;;24211:18;;:::i;:::-;24196:35;24253:1;24250;24246:9;24241:14;;24076:185;;;;:::o;24267:848::-;24328:5;24335:4;24359:6;24350:15;;24383:5;24374:14;;24397:712;24418:1;24408:8;24405:15;24397:712;;;24513:4;24508:3;24504:14;24498:4;24495:24;24492:50;;;24522:18;;:::i;:::-;24492:50;24572:1;24562:8;24558:16;24555:451;;;24987:4;24980:5;24976:16;24967:25;;24555:451;25037:4;25031;25027:15;25019:23;;25067:32;25090:8;25067:32;:::i;:::-;25055:44;;24397:712;;;24267:848;;;;;;;:::o;25121:285::-;25181:5;25205:23;25223:4;25205:23;:::i;:::-;25197:31;;25249:27;25267:8;25249:27;:::i;:::-;25237:39;;25295:104;25332:66;25322:8;25316:4;25295:104;:::i;:::-;25286:113;;25121:285;;;;:::o;25412:1073::-;25466:5;25657:8;25647:40;;25678:1;25669:10;;25680:5;;25647:40;25706:4;25696:36;;25723:1;25714:10;;25725:5;;25696:36;25792:4;25840:1;25835:27;;;;25876:1;25871:191;;;;25785:277;;25835:27;25853:1;25844:10;;25855:5;;;25871:191;25916:3;25906:8;25903:17;25900:43;;;25923:18;;:::i;:::-;25900:43;25972:8;25969:1;25965:16;25956:25;;26007:3;26000:5;25997:14;25994:40;;;26014:18;;:::i;:::-;25994:40;26047:5;;;25785:277;;26171:2;26161:8;26158:16;26152:3;26146:4;26143:13;26139:36;26121:2;26111:8;26108:16;26103:2;26097:4;26094:12;26090:35;26074:111;26071:246;;;26227:8;26221:4;26217:19;26208:28;;26262:3;26255:5;26252:14;26249:40;;;26269:18;;:::i;:::-;26249:40;26302:5;;26071:246;26342:42;26380:3;26370:8;26364:4;26361:1;26342:42;:::i;:::-;26327:57;;;;26416:4;26411:3;26407:14;26400:5;26397:25;26394:51;;;26425:18;;:::i;:::-;26394:51;26474:4;26467:5;26463:16;26454:25;;25412:1073;;;;;;:::o;26491:348::-;26531:7;26554:20;26572:1;26554:20;:::i;:::-;26549:25;;26588:20;26606:1;26588:20;:::i;:::-;26583:25;;26776:1;26708:66;26704:74;26701:1;26698:81;26693:1;26686:9;26679:17;26675:105;26672:131;;;26783:18;;:::i;:::-;26672:131;26831:1;26828;26824:9;26813:20;;26491:348;;;;:::o;26845:191::-;26885:4;26905:20;26923:1;26905:20;:::i;:::-;26900:25;;26939:20;26957:1;26939:20;:::i;:::-;26934:25;;26978:1;26975;26972:8;26969:34;;;26983:18;;:::i;:::-;26969:34;27028:1;27025;27021:9;27013:17;;26845:191;;;;:::o;27042:96::-;27079:7;27108:24;27126:5;27108:24;:::i;:::-;27097:35;;27042:96;;;:::o;27144:90::-;27178:7;27221:5;27214:13;27207:21;27196:32;;27144:90;;;:::o;27240:126::-;27277:7;27317:42;27310:5;27306:54;27295:65;;27240:126;;;:::o;27372:77::-;27409:7;27438:5;27427:16;;27372:77;;;:::o;27455:86::-;27490:7;27530:4;27523:5;27519:16;27508:27;;27455:86;;;:::o;27547:121::-;27605:9;27638:24;27656:5;27638:24;:::i;:::-;27625:37;;27547:121;;;:::o;27674:307::-;27742:1;27752:113;27766:6;27763:1;27760:13;27752:113;;;27851:1;27846:3;27842:11;27836:18;27832:1;27827:3;27823:11;27816:39;27788:2;27785:1;27781:10;27776:15;;27752:113;;;27883:6;27880:1;27877:13;27874:101;;;27963:1;27954:6;27949:3;27945:16;27938:27;27874:101;27723:258;27674:307;;;:::o;27987:320::-;28031:6;28068:1;28062:4;28058:12;28048:22;;28115:1;28109:4;28105:12;28136:18;28126:81;;28192:4;28184:6;28180:17;28170:27;;28126:81;28254:2;28246:6;28243:14;28223:18;28220:38;28217:84;;;28273:18;;:::i;:::-;28217:84;28038:269;27987:320;;;:::o;28313:180::-;28361:77;28358:1;28351:88;28458:4;28455:1;28448:15;28482:4;28479:1;28472:15;28499:180;28547:77;28544:1;28537:88;28644:4;28641:1;28634:15;28668:4;28665:1;28658:15;28685:180;28733:77;28730:1;28723:88;28830:4;28827:1;28820:15;28854:4;28851:1;28844:15;28871:180;28919:77;28916:1;28909:88;29016:4;29013:1;29006:15;29040:4;29037:1;29030:15;29057:180;29105:77;29102:1;29095:88;29202:4;29199:1;29192:15;29226:4;29223:1;29216:15;29366:117;29475:1;29472;29465:12;29489:102;29530:6;29581:2;29577:7;29572:2;29565:5;29561:14;29557:28;29547:38;;29489:102;;;:::o;29597:::-;29639:8;29686:5;29683:1;29679:13;29658:34;;29597:102;;;:::o;29705:222::-;29845:34;29841:1;29833:6;29829:14;29822:58;29914:5;29909:2;29901:6;29897:15;29890:30;29705:222;:::o;29933:221::-;30073:34;30069:1;30061:6;30057:14;30050:58;30142:4;30137:2;30129:6;30125:15;30118:29;29933:221;:::o;30160:225::-;30300:34;30296:1;30288:6;30284:14;30277:58;30369:8;30364:2;30356:6;30352:15;30345:33;30160:225;:::o;30391:221::-;30531:34;30527:1;30519:6;30515:14;30508:58;30600:4;30595:2;30587:6;30583:15;30576:29;30391:221;:::o;30618:164::-;30758:16;30754:1;30746:6;30742:14;30735:40;30618:164;:::o;30788:168::-;30928:20;30924:1;30916:6;30912:14;30905:44;30788:168;:::o;30962:179::-;31102:31;31098:1;31090:6;31086:14;31079:55;30962:179;:::o;31147:225::-;31287:34;31283:1;31275:6;31271:14;31264:58;31356:8;31351:2;31343:6;31339:15;31332:33;31147:225;:::o;31378:234::-;31518:34;31514:1;31506:6;31502:14;31495:58;31587:17;31582:2;31574:6;31570:15;31563:42;31378:234;:::o;31618:168::-;31758:20;31754:1;31746:6;31742:14;31735:44;31618:168;:::o;31792:182::-;31932:34;31928:1;31920:6;31916:14;31909:58;31792:182;:::o;31980:220::-;32120:34;32116:1;32108:6;32104:14;32097:58;32189:3;32184:2;32176:6;32172:15;32165:28;31980:220;:::o;32206:224::-;32346:34;32342:1;32334:6;32330:14;32323:58;32415:7;32410:2;32402:6;32398:15;32391:32;32206:224;:::o;32436:223::-;32576:34;32572:1;32564:6;32560:14;32553:58;32645:6;32640:2;32632:6;32628:15;32621:31;32436:223;:::o;32665:230::-;32805:34;32801:1;32793:6;32789:14;32782:58;32874:13;32869:2;32861:6;32857:15;32850:38;32665:230;:::o;32901:172::-;33041:24;33037:1;33029:6;33025:14;33018:48;32901:172;:::o;33079:224::-;33219:34;33215:1;33207:6;33203:14;33196:58;33288:7;33283:2;33275:6;33271:15;33264:32;33079:224;:::o;33309:122::-;33382:24;33400:5;33382:24;:::i;:::-;33375:5;33372:35;33362:63;;33421:1;33418;33411:12;33362:63;33309:122;:::o;33437:::-;33510:24;33528:5;33510:24;:::i;:::-;33503:5;33500:35;33490:63;;33549:1;33546;33539:12;33490:63;33437:122;:::o

Swarm Source

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