ETH Price: $3,430.63 (-1.29%)
Gas: 4 Gwei

Token

Awoo Token (AWOO)
 

Overview

Max Total Supply

235,078,391.65289351333700607 AWOO

Holders

146

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
3122y342e.eth
Balance
553,774.701967592 AWOO

Value
$0.00
0x4b02025dc9f43fa0aa52b7e5dfb8f695f4705c25
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:
AwooToken

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 1500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-28
*/

// SPDX-License-Identifier: MIT

// File: contracts/AddressChecksumStringUtil.sol

pragma solidity ^0.8.0;

// Derived from https://ethereum.stackexchange.com/a/63953, no license specified
// Modified to remove unnecessary functionality and prepend the checksummed string address with "0x"

/**
 * @dev This contract provides a set of pure functions for computing the EIP-55
 * checksum of an account in formats friendly to both off-chain and on-chain
 * callers, as well as for checking if a given string hex representation of an
 * address has a valid checksum. These helper functions could also be repurposed
 * as a library that extends the `address` type.
 */
contract AddressChecksumStringUtil {

    function toChecksumString(address account) internal pure returns (string memory asciiString) {
        // convert the account argument from address to bytes.
        bytes20 data = bytes20(account);

        // create an in-memory fixed-size bytes array.
        bytes memory asciiBytes = new bytes(40);

        // declare variable types.
        uint8 b;
        uint8 leftNibble;
        uint8 rightNibble;
        bool leftCaps;
        bool rightCaps;
        uint8 asciiOffset;

        // get the capitalized characters in the actual checksum.
        bool[40] memory caps = _toChecksumCapsFlags(account);

        // iterate over bytes, processing left and right nibble in each iteration.
        for (uint256 i = 0; i < data.length; i++) {
            // locate the byte and extract each nibble.
            b = uint8(uint160(data) / (2**(8*(19 - i))));
            leftNibble = b / 16;
            rightNibble = b - 16 * leftNibble;

            // locate and extract each capitalization status.
            leftCaps = caps[2*i];
            rightCaps = caps[2*i + 1];

            // get the offset from nibble value to ascii character for left nibble.
            asciiOffset = _getAsciiOffset(leftNibble, leftCaps);

            // add the converted character to the byte array.
            asciiBytes[2 * i] = bytes1(leftNibble + asciiOffset);

            // get the offset from nibble value to ascii character for right nibble.
            asciiOffset = _getAsciiOffset(rightNibble, rightCaps);

            // add the converted character to the byte array.
            asciiBytes[2 * i + 1] = bytes1(rightNibble + asciiOffset);
        }

        return string(abi.encodePacked("0x", string(asciiBytes)));
    }

    function _getAsciiOffset(uint8 nibble, bool caps) internal pure returns (uint8 offset) {
        // to convert to ascii characters, add 48 to 0-9, 55 to A-F, & 87 to a-f.
        if (nibble < 10) {
            offset = 48;
        } else if (caps) {
            offset = 55;
        } else {
            offset = 87;
        }
    }

    function _toChecksumCapsFlags(address account) internal pure returns (bool[40] memory characterCapitalized) {
        // convert the address to bytes.
        bytes20 a = bytes20(account);

        // hash the address (used to calculate checksum).
        bytes32 b = keccak256(abi.encodePacked(_toAsciiString(a)));

        // declare variable types.
        uint8 leftNibbleAddress;
        uint8 rightNibbleAddress;
        uint8 leftNibbleHash;
        uint8 rightNibbleHash;

        // iterate over bytes, processing left and right nibble in each iteration.
        for (uint256 i; i < a.length; i++) {
            // locate the byte and extract each nibble for the address and the hash.
            rightNibbleAddress = uint8(a[i]) % 16;
            leftNibbleAddress = (uint8(a[i]) - rightNibbleAddress) / 16;
            rightNibbleHash = uint8(b[i]) % 16;
            leftNibbleHash = (uint8(b[i]) - rightNibbleHash) / 16;

            characterCapitalized[2 * i] = (leftNibbleAddress > 9 && leftNibbleHash > 7);
            characterCapitalized[2 * i + 1] = (rightNibbleAddress > 9 && rightNibbleHash > 7);
        }
    }

    // based on https://ethereum.stackexchange.com/a/56499/48410
    function _toAsciiString(bytes20 data) internal pure returns (string memory asciiString) {
        // create an in-memory fixed-size bytes array.
        bytes memory asciiBytes = new bytes(40);

        // declare variable types.
        uint8 b;
        uint8 leftNibble;
        uint8 rightNibble;

        // iterate over bytes, processing left and right nibble in each iteration.
        for (uint256 i = 0; i < data.length; i++) {
            // locate the byte and extract each nibble.
            b = uint8(uint160(data) / (2 ** (8 * (19 - i))));
            leftNibble = b / 16;
            rightNibble = b - 16 * leftNibble;

            // to convert to ascii characters, add 48 to 0-9 and 87 to a-f.
            asciiBytes[2 * i] = bytes1(leftNibble + (leftNibble < 10 ? 48 : 87));
            asciiBytes[2 * i + 1] = bytes1(rightNibble + (rightNibble < 10 ? 48 : 87));
        }

        return string(asciiBytes);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: contracts/IAwooToken.sol

pragma solidity 0.8.12;

interface IAwooToken is IERC20 {
    function increaseVirtualBalance(address account, uint256 amount) external;
    function mint(address account, uint256 amount) external;
    function balanceOfVirtual(address account) external view returns(uint256);
    function spendVirtualAwoo(bytes32 hash, bytes memory sig, string calldata nonce, address account, uint256 amount) external;
}

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

    /**
     * @dev 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

// File: contracts/AwooToken.sol

pragma solidity 0.8.12;

contract AwooToken is IAwooToken, ERC20, ReentrancyGuard, Ownable, AddressChecksumStringUtil {
    using ECDSA for bytes32;
    using Strings for uint256;

    /// @dev Controls whether or not the deposit/withdraw functionality is enabled
    bool public isActive = true;

    /// @dev The percentage of spent virtual AWOO taken as a fee
    uint256 public awooFeePercentage = 10;
    /// @dev The Awoo Studios account where fees are sent
    address public awooStudiosAccount;

    address[2] private _admins;
    bool private _adminsSet;   

    /// @dev Keeps track of which contracts are explicitly allowed to add virtual AWOO to a holder's address, spend from it, or
    /// in the future, mint ERC-20 tokens
    mapping(address => bool) private _authorizedContracts;
    /// @dev Keeps track of each holders virtual AWOO balance
    mapping(address => uint256) private _virtualBalance;
    /// @dev Keeps track of nonces used for spending events to prevent double spends
    mapping(string => bool) private _usedNonces;

    event AuthorizedContractAdded(address contractAddress, address addedBy);
    event AuthorizedContractRemoved(address contractAddress, address removedBy);
    event VirtualAwooSpent(address spender, uint256 amount);

    constructor(address awooAccount) ERC20("Awoo Token", "AWOO") {
        require(awooAccount != address(0), "Invalid awooAccount");
        awooStudiosAccount = awooAccount;
    }

    /// @notice Allows an authorized contract to mint $AWOO
    /// @param account The account to receive the minted $AWOO tokens
    /// @param amount The amount of $AWOO to mint
    function mint(address account, uint256 amount) external nonReentrant onlyAuthorizedContract {
        require(account != address(0), "Cannot mint to the zero address");
        require(amount > 0, "Amount cannot be zero");
        _mint(account, amount);
    }

    /// @notice Allows the owner or an admin to add authorized contracts
    /// @param contractAddress The address of the contract to authorize
    function addAuthorizedContract(address contractAddress) external onlyOwnerOrAdmin {
        require(isContract(contractAddress), "Not a contract address");
        _authorizedContracts[contractAddress] = true;
        emit AuthorizedContractAdded(contractAddress, _msgSender());
    }

    /// @notice Allows the owner or an admin to remove authorized contracts
    /// @param contractAddress The address of the contract to revoke authorization for
    function removeAuthorizedContract(address contractAddress) external onlyOwnerOrAdmin {
        _authorizedContracts[contractAddress] = false;
        emit AuthorizedContractRemoved(contractAddress, _msgSender());
    }

    /// @notice Exchanges virtual AWOO for ERC-20 $AWOO
    /// @param amount The amount of virtual AWOO to withdraw
    function withdraw(uint256 amount) external whenActive hasBalance(amount, _virtualBalance[_msgSender()]) nonReentrant {
        _mint(_msgSender(), amount);
        _virtualBalance[_msgSender()] -= amount;
    }

    /// @notice Exchanges ERC-20 $AWOO for virtual AWOO to be used in the Awoo Studios ecosystem
    /// @param amount The amount of $AWOO to deposit
    function deposit(uint256 amount) external whenActive hasBalance(amount, balanceOf(_msgSender())) nonReentrant {
        _burn(_msgSender(), amount);
        _virtualBalance[_msgSender()] += amount;
    }

    /// @notice Returns the amount of virtual AWOO held by the specified address
    /// @param account The holder account to check
    function balanceOfVirtual(address account) external view returns(uint256) {
        return _virtualBalance[account];
    }

    /// @notice Returns the amount of ERC-20 $AWOO held by the specified address
    /// @param account The holder account to check
    function totalBalanceOf(address account) external view returns(uint256) {
        return _virtualBalance[account] + balanceOf(account);
    }

    /// @notice Allows authorized contracts to increase a holders virtual AWOO
    /// @param account The account to increase
    /// @param amount The amount of virtual AWOO to increase the account by
    function increaseVirtualBalance(address account, uint256 amount) external onlyAuthorizedContract {
        _virtualBalance[account] += amount;
    }

    /// @notice Allows authorized contracts to faciliate the spending of virtual AWOO, and fees to be paid to
    /// Awoo Studios.
    /// @notice Only amounts that have been signed and verified by the token holder can be spent
    /// @param hash The hash of the message displayed to and signed by the holder
    /// @param sig The signature of the messages that was signed by the holder
    /// @param nonce The unique code used to prevent double spends
    /// @param account The account of the holder to debit
    /// @param amount The amount of virtual AWOO to debit
    function spendVirtualAwoo(bytes32 hash, bytes memory sig, string calldata nonce, address account, uint256 amount)
        external onlyAuthorizedContract hasBalance(amount, _virtualBalance[account]) nonReentrant {
            require(_usedNonces[nonce] == false, "Duplicate nonce");
            require(matchAddresSigner(account, hash, sig), "Message signer mismatch"); // Make sure that the spend request was authorized (signed) by the holder
            require(hashTransaction(account, amount) == hash, "Hash check failed"); // Make sure that only the amount authorized by the holder can be spent
        
            // debit the holder's virtual AWOO account
            _virtualBalance[account]-=amount;

            // Mint the spending fee to the Awoo Studios account
            _mint(awooStudiosAccount, ((amount * awooFeePercentage)/100));

            _usedNonces[nonce] = true;

            emit VirtualAwooSpent(account, amount);
    }

    /// @notice Allows the owner to specify two addresses allowed to administer this contract
    /// @param adminAddresses A 2 item array of addresses
    function setAdmins(address[2] calldata adminAddresses) external onlyOwner {
        require(adminAddresses[0] != address(0) && adminAddresses[1] != address(0), "Invalid admin address");
        _admins = adminAddresses;
        _adminsSet = true;
    }

    /// @notice Allows the owner or an admin to activate/deactivate deposit and withdraw functionality
    /// @notice This will only be used to disable functionality as a worst case scenario
    /// @param active The value specifiying whether or not deposits/withdraws should be allowed
    function setActiveState(bool active) external onlyOwnerOrAdmin {
        isActive = active;
    }

    /// @notice Allows the owner to change the account used for collecting spending fees
    /// @param awooAccount The new account
    function setAwooStudiosAccount(address awooAccount) external onlyOwner {
        require(awooAccount != address(0), "Invalid awooAccount");
        awooStudiosAccount = awooAccount;
    }

    /// @notice Allows the owner to change the spending fee percentage
    /// @param feePercentage The new fee percentage
    function setFeePercentage(uint256 feePercentage) external onlyOwner {
        awooFeePercentage = feePercentage; // We're intentionally allowing the fee percentage to be set to 0%, incase no fees need to be collected
    }

    /// @notice Allows the owner to withdraw any Ethereum that was accidentally sent to this contract
    function rescueEth() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /// @dev Derived from @openzeppelin/contracts/utils/Address.sol
    function isContract(address account) private view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /// @dev Validates the specified account against the account that signed the message
    function matchAddresSigner(address account, bytes32 hash, bytes memory signature) private pure returns (bool) {
        return account == hash.recover(signature);
    }

    /// @dev Hashes the message we expected the spender to sign so we can compare the hashes to ensure that the owner
    /// of the specified address signed the same message
    /// @dev fractional ether unit amounts aren't supported
    function hashTransaction(address sender, uint256 amount) private pure returns (bytes32) {
        require(amount == ((amount/1e18)*1e18), "Invalid amount");
        // Virtual $AWOO, much like the ERC-20 $AWOO is stored with 18 implied decimal places.
        // For user-friendliness, when prompting the user to sign the message, the amount is
        // _displayed_ without the implied decimals, but it is charged with the implied decimals,
        // so when validating the hash, we have to use the same value we displayed to the user.
        // This only affects the display value, nothing else
        amount = amount/1e18;
        
        string memory message = string(abi.encodePacked(
            "As the owner of Ethereum address\r\n",
            toChecksumString(sender),
            "\r\nI authorize the spending of ",
            amount.toString()," virtual $AWOO"
        ));
        uint256 messageLength = bytes(message).length;

        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n",messageLength.toString(),
                message
            )
        );
        return hash;
    }
    
    modifier onlyAuthorizedContract() {
        require(_authorizedContracts[_msgSender()], "Sender is not authorized");
        _;
    }

    modifier whenActive() {
        require(isActive, "Contract is not active");
        _;
    }

    modifier hasBalance(uint256 amount, uint256 balance) {
        require(amount > 0, "Amount cannot be zero");
        require(balance >= amount, "Insufficient Balance");
        _;
    }

    modifier onlyOwnerOrAdmin() {
        require(
            _msgSender() == owner() ||
                (_adminsSet &&
                    (_msgSender() == _admins[0] || _msgSender() == _admins[1])),
            "Caller is not the owner or an admin"
        );
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"awooAccount","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"addedBy","type":"address"}],"name":"AuthorizedContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"removedBy","type":"address"}],"name":"AuthorizedContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VirtualAwooSpent","type":"event"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"addAuthorizedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"awooFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"awooStudiosAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfVirtual","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":"uint256","name":"amount","type":"uint256"}],"name":"deposit","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":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseVirtualBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","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":"contractAddress","type":"address"}],"name":"removeAuthorizedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setActiveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"adminAddresses","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"awooAccount","type":"address"}],"name":"setAwooStudiosAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feePercentage","type":"uint256"}],"name":"setFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spendVirtualAwoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526006805460ff60a01b1916600160a01b179055600a6007553480156200002957600080fd5b50604051620032db380380620032db8339810160408190526200004c916200023c565b604080518082018252600a81526920bbb7b7902a37b5b2b760b11b60208083019182528351808501909452600484526341574f4f60e01b9084015281519192916200009a9160039162000196565b508051620000b090600490602084019062000196565b5050600160055550620000c33362000144565b6001600160a01b0381166200011e5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642061776f6f4163636f756e7400000000000000000000000000604482015260640160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055620002ab565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a4906200026e565b90600052602060002090601f016020900481019282620001c8576000855562000213565b82601f10620001e357805160ff191683800117855562000213565b8280016001018555821562000213579182015b8281111562000213578251825591602001919060010190620001f6565b506200022192915062000225565b5090565b5b8082111562000221576000815560010162000226565b6000602082840312156200024f57600080fd5b81516001600160a01b03811681146200026757600080fd5b9392505050565b600181811c908216806200028357607f821691505b60208210811415620002a557634e487b7160e01b600052602260045260246000fd5b50919050565b61302080620002bb6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063ae06c1b7116100a2578063ce9a385411610071578063ce9a38541461041b578063dd62ed3e1461042e578063e6b165ed14610467578063f2fde38b1461047a57600080fd5b8063ae06c1b7146103da578063b6b55f25146103ed578063bfe22a0114610400578063ce31a06b1461041357600080fd5b806398eaa4a7116100de57806398eaa4a71461038e578063a457c2d7146103a1578063a9059cbb146103b4578063ad60675a146103c757600080fd5b806370a0823114610344578063715018a61461036d5780638da5cb5b1461037557806395d89b411461038657600080fd5b8063313ce5671161018757806343d022511161015657806343d02251146102ec5780634b0ee02a146103155780636590ffe3146103285780636cce000c1461033157600080fd5b8063313ce5671461028c578063395093511461029b5780633d180dd5146102ae57806340c10f19146102d957600080fd5b806318160ddd116101c357806318160ddd1461024057806322f3e2d41461025257806323b872dd146102665780632e1a7d4d1461027957600080fd5b806306fdde03146101ea578063095ea7b3146102085780630a6f94fc1461022b575b600080fd5b6101f261048d565b6040516101ff91906128ce565b60405180910390f35b61021b61021636600461291d565b61051f565b60405190151581526020016101ff565b61023e610239366004612947565b610536565b005b6002545b6040519081526020016101ff565b60065461021b90600160a01b900460ff1681565b61021b61027436600461296f565b61063e565b61023e6102873660046129ab565b6106fd565b604051601281526020016101ff565b61021b6102a936600461291d565b610895565b6008546102c1906001600160a01b031681565b6040516001600160a01b0390911681526020016101ff565b61023e6102e736600461291d565b6108d1565b6102446102fa3660046129c4565b6001600160a01b03166000908152600d602052604090205490565b6102446103233660046129c4565b610a41565b61024460075481565b61023e61033f366004612a3e565b610a6d565b6102446103523660046129c4565b6001600160a01b031660009081526020819052604090205490565b61023e610ddc565b6006546001600160a01b03166102c1565b6101f2610e42565b61023e61039c3660046129c4565b610e51565b61021b6103af36600461291d565b610fbf565b61021b6103c236600461291d565b611070565b61023e6103d53660046129c4565b61107d565b61023e6103e83660046129ab565b61115c565b61023e6103fb3660046129ab565b6111bb565b61023e61040e366004612b3d565b61133f565b61023e611426565b61023e61042936600461291d565b6114bc565b61024461043c366004612b5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61023e6104753660046129c4565b61154c565b61023e6104883660046129c4565b611642565b60606003805461049c90612b92565b80601f01602080910402602001604051908101604052809291908181526020018280546104c890612b92565b80156105155780601f106104ea57610100808354040283529160200191610515565b820191906000526020600020905b8154815290600101906020018083116104f857829003601f168201915b5050505050905090565b600061052c338484611721565b5060015b92915050565b6006546001600160a01b031633146105955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60006105a460208301836129c4565b6001600160a01b0316141580156105d4575060006105c860408301602084016129c4565b6001600160a01b031614155b6106205760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e20616464726573730000000000000000000000604482015260640161058c565b61062d600982600261280b565b5050600b805460ff19166001179055565b600061064b84848461187a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106e55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606482015260840161058c565b6106f28533858403611721565b506001949350505050565b600654600160a01b900460ff166107565760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161058c565b336000908152600d60205260409020548190816107b55760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b818110156108055760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b600260055414156108585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b60026005556108673384611a93565b336000908152600d602052604081208054859290610886908490612bf3565b90915550506001600555505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161052c9185906108cc908690612c0a565b611721565b600260055414156109245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b6002600555336000908152600c602052604090205460ff166109885760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b60008111610a2e5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b610a388282611a93565b50506001600555565b6001600160a01b03811660009081526020818152604080832054600d9092528220546105309190612c0a565b336000908152600c602052604090205460ff16610acc5760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166000908152600d6020526040902054819081610b345760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b81811015610b845760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b60026005541415610bd75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b6002600555604051600e90610bef9088908890612c22565b9081526040519081900360200190205460ff1615610c4f5760405162461bcd60e51b815260206004820152600f60248201527f4475706c6963617465206e6f6e63650000000000000000000000000000000000604482015260640161058c565b610c5a848989611b72565b610ca65760405162461bcd60e51b815260206004820152601760248201527f4d657373616765207369676e6572206d69736d61746368000000000000000000604482015260640161058c565b87610cb18585611b9b565b14610cfe5760405162461bcd60e51b815260206004820152601160248201527f4861736820636865636b206661696c6564000000000000000000000000000000604482015260640161058c565b6001600160a01b0384166000908152600d602052604081208054859290610d26908490612bf3565b9091555050600854600754610d5b916001600160a01b031690606490610d4c9087612c32565b610d569190612c67565b611a93565b6001600e8787604051610d6f929190612c22565b9081526040805160209281900383018120805460ff1916941515949094179093556001600160a01b03871683529082018590527fc4b29cfa5ce05281d5e1296f6353cea1054ec59baf4454cde69aec69c999c4a5910160405180910390a150506001600555505050505050565b6006546001600160a01b03163314610e365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b610e406000611c9c565b565b60606004805461049c90612b92565b6006546001600160a01b0316331480610ea75750600b5460ff168015610ea757506009546001600160a01b0316336001600160a01b03161480610ea75750600a546001600160a01b0316336001600160a01b0316145b610eff5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b803b610f4d5760405162461bcd60e51b815260206004820152601660248201527f4e6f74206120636f6e7472616374206164647265737300000000000000000000604482015260640161058c565b6001600160a01b0381166000908152600c60205260409020805460ff191660011790557ff8b6e5731f94977c9f6aca99256be7afb84b3fcf9efee0cddd9822f1cbfe2a4481610f993390565b604080516001600160a01b0393841681529290911660208301520160405180910390a150565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058c565b6110663385858403611721565b5060019392505050565b600061052c33848461187a565b6006546001600160a01b031633146110d75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6001600160a01b03811661112d5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642061776f6f4163636f756e7400000000000000000000000000604482015260640161058c565b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6006546001600160a01b031633146111b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b600755565b600654600160a01b900460ff166112145760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161058c565b8061121e33610352565b6000821161126e5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b818110156112be5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b600260055414156113115760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b60026005556113203384611cfb565b336000908152600d602052604081208054859290610886908490612c0a565b6006546001600160a01b03163314806113955750600b5460ff16801561139557506009546001600160a01b0316336001600160a01b031614806113955750600a546001600160a01b0316336001600160a01b0316145b6113ed5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b60068054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6006546001600160a01b031633146114805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b50565b336000908152600c602052604090205460ff1661151b5760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166000908152600d602052604081208054839290611543908490612c0a565b90915550505050565b6006546001600160a01b03163314806115a25750600b5460ff1680156115a257506009546001600160a01b0316336001600160a01b031614806115a25750600a546001600160a01b0316336001600160a01b0316145b6115fa5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b6001600160a01b0381166000908152600c60205260409020805460ff191690557ff06321695c86a1fbc00e739847170ccd4e7a383985e5636c16f079a2280384b98133610f99565b6006546001600160a01b0316331461169c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6001600160a01b0381166117185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161058c565b6114b981611c9c565b6001600160a01b03831661179c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0382166118185760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0382166119725760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03831660009081526020819052604090205481811015611a015760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611a38908490612c0a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a8491815260200190565b60405180910390a35b50505050565b6001600160a01b038216611ae95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b8060026000828254611afb9190612c0a565b90915550506001600160a01b03821660009081526020819052604081208054839290611b28908490612c0a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611b7e8383611e78565b6001600160a01b0316846001600160a01b03161490509392505050565b6000611baf670de0b6b3a764000083612c67565b611bc190670de0b6b3a7640000612c32565b8214611c0f5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161058c565b611c21670de0b6b3a764000083612c67565b91506000611c2e84611e9c565b611c3784612071565b604051602001611c48929190612c7b565b60408051601f1981840301815291905280519091506000611c6882612071565b83604051602001611c7a929190612d4c565b60408051808303601f1901815291905280516020909101209695505050505050565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216611d775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03821660009081526020819052604090205481811015611e065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611e35908490612bf3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161186d565b6000806000611e878585612193565b91509150611e9481612203565b509392505050565b604080516028808252606082810190935283831b916000916020820181803683370190505090506000806000806000806000611ed78b6123be565b905060005b601481101561204057611ef0816013612bf3565b611efb906008612c32565b611f06906002612e8b565b611f149060608c901c612c67565b9750611f21601089612e97565b9650611f2e876010612eb9565b611f389089612eda565b955081611f46826002612c32565b60288110611f5657611f56612bc7565b6020020151945081611f69826002612c32565b611f74906001612c0a565b60288110611f8457611f84612bc7565b60200201519350611f95878661254f565b9250611fa18388612efd565b60f81b89611fb0836002612c32565b81518110611fc057611fc0612bc7565b60200101906001600160f81b031916908160001a905350611fe1868561254f565b9250611fed8387612efd565b60f81b89611ffc836002612c32565b612007906001612c0a565b8151811061201757612017612bc7565b60200101906001600160f81b031916908160001a9053508061203881612f22565b915050611edc565b50876040516020016120529190612f3d565b6040516020818303038152906040529950505050505050505050919050565b6060816120b157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120db57806120c581612f22565b91506120d49050600a83612c67565b91506120b5565b60008167ffffffffffffffff8111156120f6576120f66129e6565b6040519080825280601f01601f191660200182016040528015612120576020820181803683370190505b5090505b841561218b57612135600183612bf3565b9150612142600a86612f82565b61214d906030612c0a565b60f81b81838151811061216257612162612bc7565b60200101906001600160f81b031916908160001a905350612184600a86612c67565b9450612124565b949350505050565b6000808251604114156121ca5760208301516040840151606085015160001a6121be8782858561257c565b945094505050506121fc565b8251604014156121f457602083015160408401516121e9868383612669565b9350935050506121fc565b506000905060025b9250929050565b600081600481111561221757612217612f96565b14156122205750565b600181600481111561223457612234612f96565b14156122825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058c565b600281600481111561229657612296612f96565b14156122e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058c565b60038160048111156122f8576122f8612f96565b14156123515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161058c565b600481600481111561236557612365612f96565b14156114b95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161058c565b6123c661286e565b606082901b60006123d6826126b1565b6040516020016123e69190612fac565b60405160208183030381529060405280519060200120905060008060008060005b601481101561254357601087826014811061242457612424612bc7565b6124309291901a612fc8565b935060108488836014811061244757612447612bc7565b6124539291901a612eda565b61245d9190612e97565b9450601086826020811061247357612473612bc7565b61247f9291901a612fc8565b915060108287836020811061249657612496612bc7565b6124a29291901a612eda565b6124ac9190612e97565b925060098560ff161180156124c4575060078360ff16115b886124d0836002612c32565b602881106124e0576124e0612bc7565b91151560209092020152600960ff8516118015612500575060078260ff16115b8861250c836002612c32565b612517906001612c0a565b6028811061252757612527612bc7565b911515602090920201528061253b81612f22565b915050612407565b50505050505050919050565b6000600a8360ff16101561256557506030610530565b811561257357506037610530565b50605792915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125b35750600090506003612660565b8460ff16601b141580156125cb57508460ff16601c14155b156125dc5750600090506004612660565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612630573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661265957600060019250925050612660565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016126a38782888561257c565b935093505050935093915050565b60408051602880825260608281019093526000919060208201818036833701905050905060008080805b6014811015612800576126ef816013612bf3565b6126fa906008612c32565b612705906002612e8b565b61271390606089901c612c67565b9350612720601085612e97565b925061272d836010612eb9565b6127379085612eda565b9150600a8360ff161061274b57605761274e565b60305b6127589084612efd565b60f81b85612767836002612c32565b8151811061277757612777612bc7565b60200101906001600160f81b031916908160001a905350600a8260ff16106127a05760576127a3565b60305b6127ad9083612efd565b60f81b856127bc836002612c32565b6127c7906001612c0a565b815181106127d7576127d7612bc7565b60200101906001600160f81b031916908160001a905350806127f881612f22565b9150506126db565b509295945050505050565b826002810192821561285e579160200282015b8281111561285e57815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384351617825560209092019160019091019061281e565b5061286a92915061288d565b5090565b6040518061050001604052806028906020820280368337509192915050565b5b8082111561286a576000815560010161288e565b60005b838110156128bd5781810151838201526020016128a5565b83811115611a8d5750506000910152565b60208152600082518060208401526128ed8160408501602087016128a2565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461291857600080fd5b919050565b6000806040838503121561293057600080fd5b61293983612901565b946020939093013593505050565b60006040828403121561295957600080fd5b8260408301111561296957600080fd5b50919050565b60008060006060848603121561298457600080fd5b61298d84612901565b925061299b60208501612901565b9150604084013590509250925092565b6000602082840312156129bd57600080fd5b5035919050565b6000602082840312156129d657600080fd5b6129df82612901565b9392505050565b634e487b7160e01b600052604160045260246000fd5b60008083601f840112612a0e57600080fd5b50813567ffffffffffffffff811115612a2657600080fd5b6020830191508360208285010111156121fc57600080fd5b60008060008060008060a08789031215612a5757600080fd5b86359550602087013567ffffffffffffffff80821115612a7657600080fd5b818901915089601f830112612a8a57600080fd5b813581811115612a9c57612a9c6129e6565b604051601f8201601f19908116603f01168101908382118183101715612ac457612ac46129e6565b816040528281528c6020848701011115612add57600080fd5b826020860160208301376000602084830101528099505050506040890135915080821115612b0a57600080fd5b50612b1789828a016129fc565b9095509350612b2a905060608801612901565b9150608087013590509295509295509295565b600060208284031215612b4f57600080fd5b813580151581146129df57600080fd5b60008060408385031215612b7257600080fd5b612b7b83612901565b9150612b8960208401612901565b90509250929050565b600181811c90821680612ba657607f821691505b6020821081141561296957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612c0557612c05612bdd565b500390565b60008219821115612c1d57612c1d612bdd565b500190565b8183823760009101908152919050565b6000816000190483118215151615612c4c57612c4c612bdd565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612c7657612c76612c51565b500490565b7f417320746865206f776e6572206f6620457468657265756d206164647265737381527f0d0a000000000000000000000000000000000000000000000000000000000000602082015260008351612cd98160228501602088016128a2565b7f0d0a4920617574686f72697a6520746865207370656e64696e67206f662000006022918401918201528351612d168160408401602088016128a2565b7f207669727475616c202441574f4f00000000000000000000000000000000000060409290910191820152604e01949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351612d8481601a8501602088016128a2565b835190830190612d9b81601a8401602088016128a2565b01601a01949350505050565b600181815b80851115612de2578160001904821115612dc857612dc8612bdd565b80851615612dd557918102915b93841c9390800290612dac565b509250929050565b600082612df957506001610530565b81612e0657506000610530565b8160018114612e1c5760028114612e2657612e42565b6001915050610530565b60ff841115612e3757612e37612bdd565b50506001821b610530565b5060208310610133831016604e8410600b8410161715612e65575081810a610530565b612e6f8383612da7565b8060001904821115612e8357612e83612bdd565b029392505050565b60006129df8383612dea565b600060ff831680612eaa57612eaa612c51565b8060ff84160491505092915050565b600060ff821660ff84168160ff0481118215151615612e8357612e83612bdd565b600060ff821660ff841680821015612ef457612ef4612bdd565b90039392505050565b600060ff821660ff84168060ff03821115612f1a57612f1a612bdd565b019392505050565b6000600019821415612f3657612f36612bdd565b5060010190565b7f3078000000000000000000000000000000000000000000000000000000000000815260008251612f758160028501602087016128a2565b9190910160020192915050565b600082612f9157612f91612c51565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251612fbe8184602087016128a2565b9190910192915050565b600060ff831680612fdb57612fdb612c51565b8060ff8416069150509291505056fea264697066735822122020c9c38e413362068101309c9c46b44f3de3397a74c004bd2ab303fcc11032c064736f6c634300080c00330000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063ae06c1b7116100a2578063ce9a385411610071578063ce9a38541461041b578063dd62ed3e1461042e578063e6b165ed14610467578063f2fde38b1461047a57600080fd5b8063ae06c1b7146103da578063b6b55f25146103ed578063bfe22a0114610400578063ce31a06b1461041357600080fd5b806398eaa4a7116100de57806398eaa4a71461038e578063a457c2d7146103a1578063a9059cbb146103b4578063ad60675a146103c757600080fd5b806370a0823114610344578063715018a61461036d5780638da5cb5b1461037557806395d89b411461038657600080fd5b8063313ce5671161018757806343d022511161015657806343d02251146102ec5780634b0ee02a146103155780636590ffe3146103285780636cce000c1461033157600080fd5b8063313ce5671461028c578063395093511461029b5780633d180dd5146102ae57806340c10f19146102d957600080fd5b806318160ddd116101c357806318160ddd1461024057806322f3e2d41461025257806323b872dd146102665780632e1a7d4d1461027957600080fd5b806306fdde03146101ea578063095ea7b3146102085780630a6f94fc1461022b575b600080fd5b6101f261048d565b6040516101ff91906128ce565b60405180910390f35b61021b61021636600461291d565b61051f565b60405190151581526020016101ff565b61023e610239366004612947565b610536565b005b6002545b6040519081526020016101ff565b60065461021b90600160a01b900460ff1681565b61021b61027436600461296f565b61063e565b61023e6102873660046129ab565b6106fd565b604051601281526020016101ff565b61021b6102a936600461291d565b610895565b6008546102c1906001600160a01b031681565b6040516001600160a01b0390911681526020016101ff565b61023e6102e736600461291d565b6108d1565b6102446102fa3660046129c4565b6001600160a01b03166000908152600d602052604090205490565b6102446103233660046129c4565b610a41565b61024460075481565b61023e61033f366004612a3e565b610a6d565b6102446103523660046129c4565b6001600160a01b031660009081526020819052604090205490565b61023e610ddc565b6006546001600160a01b03166102c1565b6101f2610e42565b61023e61039c3660046129c4565b610e51565b61021b6103af36600461291d565b610fbf565b61021b6103c236600461291d565b611070565b61023e6103d53660046129c4565b61107d565b61023e6103e83660046129ab565b61115c565b61023e6103fb3660046129ab565b6111bb565b61023e61040e366004612b3d565b61133f565b61023e611426565b61023e61042936600461291d565b6114bc565b61024461043c366004612b5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61023e6104753660046129c4565b61154c565b61023e6104883660046129c4565b611642565b60606003805461049c90612b92565b80601f01602080910402602001604051908101604052809291908181526020018280546104c890612b92565b80156105155780601f106104ea57610100808354040283529160200191610515565b820191906000526020600020905b8154815290600101906020018083116104f857829003601f168201915b5050505050905090565b600061052c338484611721565b5060015b92915050565b6006546001600160a01b031633146105955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60006105a460208301836129c4565b6001600160a01b0316141580156105d4575060006105c860408301602084016129c4565b6001600160a01b031614155b6106205760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e20616464726573730000000000000000000000604482015260640161058c565b61062d600982600261280b565b5050600b805460ff19166001179055565b600061064b84848461187a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106e55760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606482015260840161058c565b6106f28533858403611721565b506001949350505050565b600654600160a01b900460ff166107565760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161058c565b336000908152600d60205260409020548190816107b55760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b818110156108055760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b600260055414156108585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b60026005556108673384611a93565b336000908152600d602052604081208054859290610886908490612bf3565b90915550506001600555505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161052c9185906108cc908690612c0a565b611721565b600260055414156109245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b6002600555336000908152600c602052604090205460ff166109885760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b60008111610a2e5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b610a388282611a93565b50506001600555565b6001600160a01b03811660009081526020818152604080832054600d9092528220546105309190612c0a565b336000908152600c602052604090205460ff16610acc5760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166000908152600d6020526040902054819081610b345760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b81811015610b845760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b60026005541415610bd75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b6002600555604051600e90610bef9088908890612c22565b9081526040519081900360200190205460ff1615610c4f5760405162461bcd60e51b815260206004820152600f60248201527f4475706c6963617465206e6f6e63650000000000000000000000000000000000604482015260640161058c565b610c5a848989611b72565b610ca65760405162461bcd60e51b815260206004820152601760248201527f4d657373616765207369676e6572206d69736d61746368000000000000000000604482015260640161058c565b87610cb18585611b9b565b14610cfe5760405162461bcd60e51b815260206004820152601160248201527f4861736820636865636b206661696c6564000000000000000000000000000000604482015260640161058c565b6001600160a01b0384166000908152600d602052604081208054859290610d26908490612bf3565b9091555050600854600754610d5b916001600160a01b031690606490610d4c9087612c32565b610d569190612c67565b611a93565b6001600e8787604051610d6f929190612c22565b9081526040805160209281900383018120805460ff1916941515949094179093556001600160a01b03871683529082018590527fc4b29cfa5ce05281d5e1296f6353cea1054ec59baf4454cde69aec69c999c4a5910160405180910390a150506001600555505050505050565b6006546001600160a01b03163314610e365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b610e406000611c9c565b565b60606004805461049c90612b92565b6006546001600160a01b0316331480610ea75750600b5460ff168015610ea757506009546001600160a01b0316336001600160a01b03161480610ea75750600a546001600160a01b0316336001600160a01b0316145b610eff5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b803b610f4d5760405162461bcd60e51b815260206004820152601660248201527f4e6f74206120636f6e7472616374206164647265737300000000000000000000604482015260640161058c565b6001600160a01b0381166000908152600c60205260409020805460ff191660011790557ff8b6e5731f94977c9f6aca99256be7afb84b3fcf9efee0cddd9822f1cbfe2a4481610f993390565b604080516001600160a01b0393841681529290911660208301520160405180910390a150565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156110595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161058c565b6110663385858403611721565b5060019392505050565b600061052c33848461187a565b6006546001600160a01b031633146110d75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6001600160a01b03811661112d5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642061776f6f4163636f756e7400000000000000000000000000604482015260640161058c565b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6006546001600160a01b031633146111b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b600755565b600654600160a01b900460ff166112145760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161058c565b8061121e33610352565b6000821161126e5760405162461bcd60e51b815260206004820152601560248201527f416d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015260640161058c565b818110156112be5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742042616c616e6365000000000000000000000000604482015260640161058c565b600260055414156113115760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161058c565b60026005556113203384611cfb565b336000908152600d602052604081208054859290610886908490612c0a565b6006546001600160a01b03163314806113955750600b5460ff16801561139557506009546001600160a01b0316336001600160a01b031614806113955750600a546001600160a01b0316336001600160a01b0316145b6113ed5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b60068054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6006546001600160a01b031633146114805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b50565b336000908152600c602052604090205460ff1661151b5760405162461bcd60e51b815260206004820152601860248201527f53656e646572206973206e6f7420617574686f72697a65640000000000000000604482015260640161058c565b6001600160a01b0382166000908152600d602052604081208054839290611543908490612c0a565b90915550505050565b6006546001600160a01b03163314806115a25750600b5460ff1680156115a257506009546001600160a01b0316336001600160a01b031614806115a25750600a546001600160a01b0316336001600160a01b0316145b6115fa5760405162461bcd60e51b815260206004820152602360248201527f43616c6c6572206973206e6f7420746865206f776e6572206f7220616e20616460448201526236b4b760e91b606482015260840161058c565b6001600160a01b0381166000908152600c60205260409020805460ff191690557ff06321695c86a1fbc00e739847170ccd4e7a383985e5636c16f079a2280384b98133610f99565b6006546001600160a01b0316331461169c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161058c565b6001600160a01b0381166117185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161058c565b6114b981611c9c565b6001600160a01b03831661179c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0382166118185760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0382166119725760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03831660009081526020819052604090205481811015611a015760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611a38908490612c0a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a8491815260200190565b60405180910390a35b50505050565b6001600160a01b038216611ae95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161058c565b8060026000828254611afb9190612c0a565b90915550506001600160a01b03821660009081526020819052604081208054839290611b28908490612c0a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611b7e8383611e78565b6001600160a01b0316846001600160a01b03161490509392505050565b6000611baf670de0b6b3a764000083612c67565b611bc190670de0b6b3a7640000612c32565b8214611c0f5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161058c565b611c21670de0b6b3a764000083612c67565b91506000611c2e84611e9c565b611c3784612071565b604051602001611c48929190612c7b565b60408051601f1981840301815291905280519091506000611c6882612071565b83604051602001611c7a929190612d4c565b60408051808303601f1901815291905280516020909101209695505050505050565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216611d775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b03821660009081526020819052604090205481811015611e065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161058c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611e35908490612bf3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161186d565b6000806000611e878585612193565b91509150611e9481612203565b509392505050565b604080516028808252606082810190935283831b916000916020820181803683370190505090506000806000806000806000611ed78b6123be565b905060005b601481101561204057611ef0816013612bf3565b611efb906008612c32565b611f06906002612e8b565b611f149060608c901c612c67565b9750611f21601089612e97565b9650611f2e876010612eb9565b611f389089612eda565b955081611f46826002612c32565b60288110611f5657611f56612bc7565b6020020151945081611f69826002612c32565b611f74906001612c0a565b60288110611f8457611f84612bc7565b60200201519350611f95878661254f565b9250611fa18388612efd565b60f81b89611fb0836002612c32565b81518110611fc057611fc0612bc7565b60200101906001600160f81b031916908160001a905350611fe1868561254f565b9250611fed8387612efd565b60f81b89611ffc836002612c32565b612007906001612c0a565b8151811061201757612017612bc7565b60200101906001600160f81b031916908160001a9053508061203881612f22565b915050611edc565b50876040516020016120529190612f3d565b6040516020818303038152906040529950505050505050505050919050565b6060816120b157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120db57806120c581612f22565b91506120d49050600a83612c67565b91506120b5565b60008167ffffffffffffffff8111156120f6576120f66129e6565b6040519080825280601f01601f191660200182016040528015612120576020820181803683370190505b5090505b841561218b57612135600183612bf3565b9150612142600a86612f82565b61214d906030612c0a565b60f81b81838151811061216257612162612bc7565b60200101906001600160f81b031916908160001a905350612184600a86612c67565b9450612124565b949350505050565b6000808251604114156121ca5760208301516040840151606085015160001a6121be8782858561257c565b945094505050506121fc565b8251604014156121f457602083015160408401516121e9868383612669565b9350935050506121fc565b506000905060025b9250929050565b600081600481111561221757612217612f96565b14156122205750565b600181600481111561223457612234612f96565b14156122825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161058c565b600281600481111561229657612296612f96565b14156122e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161058c565b60038160048111156122f8576122f8612f96565b14156123515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161058c565b600481600481111561236557612365612f96565b14156114b95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161058c565b6123c661286e565b606082901b60006123d6826126b1565b6040516020016123e69190612fac565b60405160208183030381529060405280519060200120905060008060008060005b601481101561254357601087826014811061242457612424612bc7565b6124309291901a612fc8565b935060108488836014811061244757612447612bc7565b6124539291901a612eda565b61245d9190612e97565b9450601086826020811061247357612473612bc7565b61247f9291901a612fc8565b915060108287836020811061249657612496612bc7565b6124a29291901a612eda565b6124ac9190612e97565b925060098560ff161180156124c4575060078360ff16115b886124d0836002612c32565b602881106124e0576124e0612bc7565b91151560209092020152600960ff8516118015612500575060078260ff16115b8861250c836002612c32565b612517906001612c0a565b6028811061252757612527612bc7565b911515602090920201528061253b81612f22565b915050612407565b50505050505050919050565b6000600a8360ff16101561256557506030610530565b811561257357506037610530565b50605792915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125b35750600090506003612660565b8460ff16601b141580156125cb57508460ff16601c14155b156125dc5750600090506004612660565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612630573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661265957600060019250925050612660565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016126a38782888561257c565b935093505050935093915050565b60408051602880825260608281019093526000919060208201818036833701905050905060008080805b6014811015612800576126ef816013612bf3565b6126fa906008612c32565b612705906002612e8b565b61271390606089901c612c67565b9350612720601085612e97565b925061272d836010612eb9565b6127379085612eda565b9150600a8360ff161061274b57605761274e565b60305b6127589084612efd565b60f81b85612767836002612c32565b8151811061277757612777612bc7565b60200101906001600160f81b031916908160001a905350600a8260ff16106127a05760576127a3565b60305b6127ad9083612efd565b60f81b856127bc836002612c32565b6127c7906001612c0a565b815181106127d7576127d7612bc7565b60200101906001600160f81b031916908160001a905350806127f881612f22565b9150506126db565b509295945050505050565b826002810192821561285e579160200282015b8281111561285e57815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384351617825560209092019160019091019061281e565b5061286a92915061288d565b5090565b6040518061050001604052806028906020820280368337509192915050565b5b8082111561286a576000815560010161288e565b60005b838110156128bd5781810151838201526020016128a5565b83811115611a8d5750506000910152565b60208152600082518060208401526128ed8160408501602087016128a2565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461291857600080fd5b919050565b6000806040838503121561293057600080fd5b61293983612901565b946020939093013593505050565b60006040828403121561295957600080fd5b8260408301111561296957600080fd5b50919050565b60008060006060848603121561298457600080fd5b61298d84612901565b925061299b60208501612901565b9150604084013590509250925092565b6000602082840312156129bd57600080fd5b5035919050565b6000602082840312156129d657600080fd5b6129df82612901565b9392505050565b634e487b7160e01b600052604160045260246000fd5b60008083601f840112612a0e57600080fd5b50813567ffffffffffffffff811115612a2657600080fd5b6020830191508360208285010111156121fc57600080fd5b60008060008060008060a08789031215612a5757600080fd5b86359550602087013567ffffffffffffffff80821115612a7657600080fd5b818901915089601f830112612a8a57600080fd5b813581811115612a9c57612a9c6129e6565b604051601f8201601f19908116603f01168101908382118183101715612ac457612ac46129e6565b816040528281528c6020848701011115612add57600080fd5b826020860160208301376000602084830101528099505050506040890135915080821115612b0a57600080fd5b50612b1789828a016129fc565b9095509350612b2a905060608801612901565b9150608087013590509295509295509295565b600060208284031215612b4f57600080fd5b813580151581146129df57600080fd5b60008060408385031215612b7257600080fd5b612b7b83612901565b9150612b8960208401612901565b90509250929050565b600181811c90821680612ba657607f821691505b6020821081141561296957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612c0557612c05612bdd565b500390565b60008219821115612c1d57612c1d612bdd565b500190565b8183823760009101908152919050565b6000816000190483118215151615612c4c57612c4c612bdd565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612c7657612c76612c51565b500490565b7f417320746865206f776e6572206f6620457468657265756d206164647265737381527f0d0a000000000000000000000000000000000000000000000000000000000000602082015260008351612cd98160228501602088016128a2565b7f0d0a4920617574686f72697a6520746865207370656e64696e67206f662000006022918401918201528351612d168160408401602088016128a2565b7f207669727475616c202441574f4f00000000000000000000000000000000000060409290910191820152604e01949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351612d8481601a8501602088016128a2565b835190830190612d9b81601a8401602088016128a2565b01601a01949350505050565b600181815b80851115612de2578160001904821115612dc857612dc8612bdd565b80851615612dd557918102915b93841c9390800290612dac565b509250929050565b600082612df957506001610530565b81612e0657506000610530565b8160018114612e1c5760028114612e2657612e42565b6001915050610530565b60ff841115612e3757612e37612bdd565b50506001821b610530565b5060208310610133831016604e8410600b8410161715612e65575081810a610530565b612e6f8383612da7565b8060001904821115612e8357612e83612bdd565b029392505050565b60006129df8383612dea565b600060ff831680612eaa57612eaa612c51565b8060ff84160491505092915050565b600060ff821660ff84168160ff0481118215151615612e8357612e83612bdd565b600060ff821660ff841680821015612ef457612ef4612bdd565b90039392505050565b600060ff821660ff84168060ff03821115612f1a57612f1a612bdd565b019392505050565b6000600019821415612f3657612f36612bdd565b5060010190565b7f3078000000000000000000000000000000000000000000000000000000000000815260008251612f758160028501602087016128a2565b9190910160020192915050565b600082612f9157612f91612c51565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251612fbe8184602087016128a2565b9190910192915050565b600060ff831680612fdb57612fdb612c51565b8060ff8416069150509291505056fea264697066735822122020c9c38e413362068101309c9c46b44f3de3397a74c004bd2ab303fcc11032c064736f6c634300080c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be

-----Decoded View---------------
Arg [0] : awooAccount (address): 0x5E697C6f5cBEBD6ca17BDE80d684c226A1e223BE

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e697c6f5cbebd6ca17bde80d684c226a1e223be


Deployed Bytecode Sourcemap

39135:10551:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29111:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31278:169;;;;;;:::i;:::-;;:::i;:::-;;;1290:14:1;;1283:22;1265:41;;1253:2;1238:18;31278:169:0;1125:187:1;45220:256:0;;;;;;:::i;:::-;;:::i;:::-;;30231:108;30319:12;;30231:108;;;1719:25:1;;;1707:2;1692:18;30231:108:0;1573:177:1;39383:27:0;;;;;-1:-1:-1;;;39383:27:0;;;;;;31929:492;;;;;;:::i;:::-;;:::i;42012:213::-;;;;;;:::i;:::-;;:::i;30073:93::-;;;30156:2;2415:36:1;;2403:2;2388:18;30073:93:0;2273:184:1;32830:215:0;;;;;;:::i;:::-;;:::i;39588:33::-;;;;;-1:-1:-1;;;;;39588:33:0;;;;;;-1:-1:-1;;;;;2626:55:1;;;2608:74;;2596:2;2581:18;39588:33:0;2462:226:1;40784:264:0;;;;;;:::i;:::-;;:::i;42733:124::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42825:24:0;42798:7;42825:24;;;:15;:24;;;;;;;42733:124;42999:143;;;;;;:::i;:::-;;:::i;39485:37::-;;;;;;44094:964;;;;;;:::i;:::-;;:::i;30402:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30503:18:0;30476:7;30503:18;;;;;;;;;;;;30402:127;22090:103;;;:::i;21439:87::-;21512:6;;-1:-1:-1;;;;;21512:6:0;21439:87;;29330:104;;;:::i;41203:288::-;;;;;;:::i;:::-;;:::i;33548:413::-;;;;;;:::i;:::-;;:::i;30742:175::-;;;;;;:::i;:::-;;:::i;46016:190::-;;;;;;:::i;:::-;;:::i;46339:224::-;;;;;;:::i;:::-;;:::i;42385:206::-;;;;;;:::i;:::-;;:::i;45775:99::-;;;;;;:::i;:::-;;:::i;46674:107::-;;;:::i;43355:150::-;;;;;;:::i;:::-;;:::i;30980:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31096:18:0;;;31069:7;31096:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30980:151;41664:221;;;;;;:::i;:::-;;:::i;22348:201::-;;;;;;:::i;:::-;;:::i;29111:100::-;29165:13;29198:5;29191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29111:100;:::o;31278:169::-;31361:4;31378:39;20245:10;31401:7;31410:6;31378:8;:39::i;:::-;-1:-1:-1;31435:4:0;31278:169;;;;;:::o;45220:256::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;;;;;;;;;45342:1:::1;45313:17;;::::0;::::1;:14:::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;45313:31:0::1;;;:66;;;;-1:-1:-1::0;45377:1:0::1;45348:17;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45348:31:0::1;;;45313:66;45305:100;;;::::0;-1:-1:-1;;;45305:100:0;;6590:2:1;45305:100:0::1;::::0;::::1;6572:21:1::0;6629:2;6609:18;;;6602:30;6668:23;6648:18;;;6641:51;6709:18;;45305:100:0::1;6388:345:1::0;45305:100:0::1;45416:24;:7;45426:14:::0;45416:24:::1;;:::i;:::-;-1:-1:-1::0;;45451:10:0::1;:17:::0;;-1:-1:-1;;45451:17:0::1;45464:4;45451:17;::::0;;45220:256::o;31929:492::-;32069:4;32086:36;32096:6;32104:9;32115:6;32086:9;:36::i;:::-;-1:-1:-1;;;;;32162:19:0;;32135:24;32162:19;;;:11;:19;;;;;;;;20245:10;32162:33;;;;;;;;32214:26;;;;32206:79;;;;-1:-1:-1;;;32206:79:0;;6940:2:1;32206:79:0;;;6922:21:1;6979:2;6959:18;;;6952:30;7018:34;6998:18;;;6991:62;7089:10;7069:18;;;7062:38;7117:19;;32206:79:0;6738:404:1;32206:79:0;32321:57;32330:6;20245:10;32371:6;32352:16;:25;32321:8;:57::i;:::-;-1:-1:-1;32409:4:0;;31929:492;-1:-1:-1;;;;31929:492:0:o;42012:213::-;49140:8;;-1:-1:-1;;;49140:8:0;;;;49132:43;;;;-1:-1:-1;;;49132:43:0;;7349:2:1;49132:43:0;;;7331:21:1;7388:2;7368:18;;;7361:30;7427:24;7407:18;;;7400:52;7469:18;;49132:43:0;7147:346:1;49132:43:0;20245:10;42085:29:::1;::::0;;;:15:::1;:29;::::0;;;;;42077:6;;49275:10;49267:44:::1;;;::::0;-1:-1:-1;;;49267:44:0;;7700:2:1;49267:44:0::1;::::0;::::1;7682:21:1::0;7739:2;7719:18;;;7712:30;7778:23;7758:18;;;7751:51;7819:18;;49267:44:0::1;7498:345:1::0;49267:44:0::1;49341:6;49330:7;:17;;49322:50;;;::::0;-1:-1:-1;;;49322:50:0;;8050:2:1;49322:50:0::1;::::0;::::1;8032:21:1::0;8089:2;8069:18;;;8062:30;8128:22;8108:18;;;8101:50;8168:18;;49322:50:0::1;7848:344:1::0;49322:50:0::1;6855:1:::2;7453:7;;:19;;7445:63;;;::::0;-1:-1:-1;;;7445:63:0;;8399:2:1;7445:63:0::2;::::0;::::2;8381:21:1::0;8438:2;8418:18;;;8411:30;8477:33;8457:18;;;8450:61;8528:18;;7445:63:0::2;8197:355:1::0;7445:63:0::2;6855:1;7586:7;:18:::0;42140:27:::3;20245:10:::0;42160:6:::3;42140:5;:27::i;:::-;20245:10:::0;42178:29:::3;::::0;;;:15:::3;:29;::::0;;;;:39;;42211:6;;42178:29;:39:::3;::::0;42211:6;;42178:39:::3;:::i;:::-;::::0;;;-1:-1:-1;;6811:1:0::2;7765:7;:22:::0;-1:-1:-1;;;42012:213:0:o;32830:215::-;20245:10;32918:4;32967:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;32967:34:0;;;;;;;;;;32918:4;;32935:80;;32958:7;;32967:47;;33004:10;;32967:47;:::i;:::-;32935:8;:80::i;40784:264::-;6855:1;7453:7;;:19;;7445:63;;;;-1:-1:-1;;;7445:63:0;;8399:2:1;7445:63:0;;;8381:21:1;8438:2;8418:18;;;8411:30;8477:33;8457:18;;;8450:61;8528:18;;7445:63:0;8197:355:1;7445:63:0;6855:1;7586:7;:18;20245:10;49008:34:::1;::::0;;;:20:::1;:34;::::0;;;;;::::1;;49000:71;;;::::0;-1:-1:-1;;;49000:71:0;;9211:2:1;49000:71:0::1;::::0;::::1;9193:21:1::0;9250:2;9230:18;;;9223:30;9289:26;9269:18;;;9262:54;9333:18;;49000:71:0::1;9009:348:1::0;49000:71:0::1;-1:-1:-1::0;;;;;40895:21:0;::::2;40887:65;;;::::0;-1:-1:-1;;;40887:65:0;;9564:2:1;40887:65:0::2;::::0;::::2;9546:21:1::0;9603:2;9583:18;;;9576:30;9642:33;9622:18;;;9615:61;9693:18;;40887:65:0::2;9362:355:1::0;40887:65:0::2;40980:1;40971:6;:10;40963:44;;;::::0;-1:-1:-1;;;40963:44:0;;7700:2:1;40963:44:0::2;::::0;::::2;7682:21:1::0;7739:2;7719:18;;;7712:30;7778:23;7758:18;;;7751:51;7819:18;;40963:44:0::2;7498:345:1::0;40963:44:0::2;41018:22;41024:7;41033:6;41018:5;:22::i;:::-;-1:-1:-1::0;;6811:1:0;7765:7;:22;40784:264::o;42999:143::-;-1:-1:-1;;;;;30503:18:0;;43062:7;30503:18;;;;;;;;;;;;43089:15;:24;;;;;;:45;;30503:18;43089:45;:::i;44094:964::-;20245:10;49008:34;;;;:20;:34;;;;;;;;49000:71;;;;-1:-1:-1;;;49000:71:0;;9211:2:1;49000:71:0;;;9193:21:1;9250:2;9230:18;;;9223:30;9289:26;9269:18;;;9262:54;9333:18;;49000:71:0;9009:348:1;49000:71:0;-1:-1:-1;;;;;44268:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;44260:6;;49275:10;49267:44:::1;;;::::0;-1:-1:-1;;;49267:44:0;;7700:2:1;49267:44:0::1;::::0;::::1;7682:21:1::0;7739:2;7719:18;;;7712:30;7778:23;7758:18;;;7751:51;7819:18;;49267:44:0::1;7498:345:1::0;49267:44:0::1;49341:6;49330:7;:17;;49322:50;;;::::0;-1:-1:-1;;;49322:50:0;;8050:2:1;49322:50:0::1;::::0;::::1;8032:21:1::0;8089:2;8069:18;;;8062:30;8128:22;8108:18;;;8101:50;8168:18;;49322:50:0::1;7848:344:1::0;49322:50:0::1;6855:1:::2;7453:7;;:19;;7445:63;;;::::0;-1:-1:-1;;;7445:63:0;;8399:2:1;7445:63:0::2;::::0;::::2;8381:21:1::0;8438:2;8418:18;;;8411:30;8477:33;8457:18;;;8450:61;8528:18;;7445:63:0::2;8197:355:1::0;7445:63:0::2;6855:1;7586:7;:18:::0;44330::::3;::::0;:11:::3;::::0;:18:::3;::::0;44342:5;;;;44330:18:::3;:::i;:::-;::::0;;;::::3;::::0;;;;;::::3;::::0;;;;::::3;;:27;44322:55;;;::::0;-1:-1:-1;;;44322:55:0;;10202:2:1;44322:55:0::3;::::0;::::3;10184:21:1::0;10241:2;10221:18;;;10214:30;10280:17;10260:18;;;10253:45;10315:18;;44322:55:0::3;10000:339:1::0;44322:55:0::3;44400:37;44418:7;44427:4;44433:3;44400:17;:37::i;:::-;44392:73;;;::::0;-1:-1:-1;;;44392:73:0;;10546:2:1;44392:73:0::3;::::0;::::3;10528:21:1::0;10585:2;10565:18;;;10558:30;10624:25;10604:18;;;10597:53;10667:18;;44392:73:0::3;10344:347:1::0;44392:73:0::3;44598:4;44562:32;44578:7;44587:6;44562:15;:32::i;:::-;:40;44554:70;;;::::0;-1:-1:-1;;;44554:70:0;;10898:2:1;44554:70:0::3;::::0;::::3;10880:21:1::0;10937:2;10917:18;;;10910:30;10976:19;10956:18;;;10949:47;11013:18;;44554:70:0::3;10696:341:1::0;44554:70:0::3;-1:-1:-1::0;;;;;44777:24:0;::::3;;::::0;;;:15:::3;:24;::::0;;;;:32;;44803:6;;44777:24;:32:::3;::::0;44803:6;;44777:32:::3;:::i;:::-;::::0;;;-1:-1:-1;;44898:18:0::3;::::0;44929:17:::3;::::0;44892:61:::3;::::0;-1:-1:-1;;;;;44898:18:0::3;::::0;44948:3:::3;::::0;44920:26:::3;::::0;:6;:26:::3;:::i;:::-;44919:32;;;;:::i;:::-;44892:5;:61::i;:::-;44991:4;44970:11;44982:5;;44970:18;;;;;;;:::i;:::-;::::0;;;::::3;::::0;;::::3;::::0;;;;;;;;:25;;-1:-1:-1;;44970:25:0::3;::::0;::::3;;::::0;;;::::3;::::0;;;-1:-1:-1;;;;;11721:55:1;;11703:74;;11793:18;;;11786:34;;;45017:33:0::3;::::0;11676:18:1;45017:33:0::3;;;;;;;-1:-1:-1::0;;6811:1:0::2;7765:7;:22:::0;-1:-1:-1;;;;;;44094:964:0:o;22090:103::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;5838:356:1;21651:68:0;22155:30:::1;22182:1;22155:18;:30::i;:::-;22090:103::o:0;29330:104::-;29386:13;29419:7;29412:14;;;;;:::i;41203:288::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;49461:23;;:139;;-1:-1:-1;49506:10:0;;;;:93;;;;-1:-1:-1;49558:7:0;:10;-1:-1:-1;;;;;49558:10:0;20245;-1:-1:-1;;;;;49542:26:0;;:56;;;-1:-1:-1;49588:10:0;;-1:-1:-1;;;;;49588:10:0;20245;-1:-1:-1;;;;;49572:26:0;;49542:56;49439:224;;;;-1:-1:-1;;;49439:224:0;;12033:2:1;49439:224:0;;;12015:21:1;12072:2;12052:18;;;12045:30;12111:34;12091:18;;;12084:62;-1:-1:-1;;;12162:18:1;;;12155:33;12205:19;;49439:224:0;11831:399:1;49439:224:0;47178:20;;41296:62:::1;;;::::0;-1:-1:-1;;;41296:62:0;;12437:2:1;41296:62:0::1;::::0;::::1;12419:21:1::0;12476:2;12456:18;;;12449:30;12515:24;12495:18;;;12488:52;12557:18;;41296:62:0::1;12235:346:1::0;41296:62:0::1;-1:-1:-1::0;;;;;41369:37:0;::::1;;::::0;;;:20:::1;:37;::::0;;;;:44;;-1:-1:-1;;41369:44:0::1;41409:4;41369:44;::::0;;41429:54:::1;41390:15:::0;41470:12:::1;20245:10:::0;;20165:98;41470:12:::1;41429:54;::::0;;-1:-1:-1;;;;;12839:15:1;;;12821:34;;12891:15;;;;12886:2;12871:18;;12864:43;12733:18;41429:54:0::1;;;;;;;41203:288:::0;:::o;33548:413::-;20245:10;33641:4;33685:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33685:34:0;;;;;;;;;;33738:35;;;;33730:85;;;;-1:-1:-1;;;33730:85:0;;13120:2:1;33730:85:0;;;13102:21:1;13159:2;13139:18;;;13132:30;13198:34;13178:18;;;13171:62;13269:7;13249:18;;;13242:35;13294:19;;33730:85:0;12918:401:1;33730:85:0;33851:67;20245:10;33874:7;33902:15;33883:16;:34;33851:8;:67::i;:::-;-1:-1:-1;33949:4:0;;33548:413;-1:-1:-1;;;33548:413:0:o;30742:175::-;30828:4;30845:42;20245:10;30869:9;30880:6;30845:9;:42::i;46016:190::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;5838:356:1;21651:68:0;-1:-1:-1;;;;;46106:25:0;::::1;46098:57;;;::::0;-1:-1:-1;;;46098:57:0;;13526:2:1;46098:57:0::1;::::0;::::1;13508:21:1::0;13565:2;13545:18;;;13538:30;13604:21;13584:18;;;13577:49;13643:18;;46098:57:0::1;13324:343:1::0;46098:57:0::1;46166:18;:32:::0;;-1:-1:-1;;46166:32:0::1;-1:-1:-1::0;;;;;46166:32:0;;;::::1;::::0;;;::::1;::::0;;46016:190::o;46339:224::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;5838:356:1;21651:68:0;46418:17:::1;:33:::0;46339:224::o;42385:206::-;49140:8;;-1:-1:-1;;;49140:8:0;;;;49132:43;;;;-1:-1:-1;;;49132:43:0;;7349:2:1;49132:43:0;;;7331:21:1;7388:2;7368:18;;;7361:30;7427:24;7407:18;;;7400:52;7469:18;;49132:43:0;7147:346:1;49132:43:0;42449:6;42457:23:::1;20245:10:::0;42467:12:::1;20165:98:::0;42457:23:::1;49284:1;49275:6;:10;49267:44;;;::::0;-1:-1:-1;;;49267:44:0;;7700:2:1;49267:44:0::1;::::0;::::1;7682:21:1::0;7739:2;7719:18;;;7712:30;7778:23;7758:18;;;7751:51;7819:18;;49267:44:0::1;7498:345:1::0;49267:44:0::1;49341:6;49330:7;:17;;49322:50;;;::::0;-1:-1:-1;;;49322:50:0;;8050:2:1;49322:50:0::1;::::0;::::1;8032:21:1::0;8089:2;8069:18;;;8062:30;8128:22;8108:18;;;8101:50;8168:18;;49322:50:0::1;7848:344:1::0;49322:50:0::1;6855:1:::2;7453:7;;:19;;7445:63;;;::::0;-1:-1:-1;;;7445:63:0;;8399:2:1;7445:63:0::2;::::0;::::2;8381:21:1::0;8438:2;8418:18;;;8411:30;8477:33;8457:18;;;8450:61;8528:18;;7445:63:0::2;8197:355:1::0;7445:63:0::2;6855:1;7586:7;:18:::0;42506:27:::3;20245:10:::0;42526:6:::3;42506:5;:27::i;:::-;20245:10:::0;42544:29:::3;::::0;;;:15:::3;:29;::::0;;;;:39;;42577:6;;42544:29;:39:::3;::::0;42577:6;;42544:39:::3;:::i;45775:99::-:0;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;49461:23;;:139;;-1:-1:-1;49506:10:0;;;;:93;;;;-1:-1:-1;49558:7:0;:10;-1:-1:-1;;;;;49558:10:0;20245;-1:-1:-1;;;;;49542:26:0;;:56;;;-1:-1:-1;49588:10:0;;-1:-1:-1;;;;;49588:10:0;20245;-1:-1:-1;;;;;49572:26:0;;49542:56;49439:224;;;;-1:-1:-1;;;49439:224:0;;12033:2:1;49439:224:0;;;12015:21:1;12072:2;12052:18;;;12045:30;12111:34;12091:18;;;12084:62;-1:-1:-1;;;12162:18:1;;;12155:33;12205:19;;49439:224:0;11831:399:1;49439:224:0;45849:8:::1;:17:::0;;;::::1;;-1:-1:-1::0;;;45849:17:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;45775:99::o;46674:107::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;5838:356:1;21651:68:0;21512:6;;46725:48:::1;::::0;-1:-1:-1;;;;;21512:6:0;;;;46751:21:::1;46725:48:::0;::::1;;;::::0;::::1;::::0;;;46751:21;21512:6;46725:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;46674:107::o:0;43355:150::-;20245:10;49008:34;;;;:20;:34;;;;;;;;49000:71;;;;-1:-1:-1;;;49000:71:0;;9211:2:1;49000:71:0;;;9193:21:1;9250:2;9230:18;;;9223:30;9289:26;9269:18;;;9262:54;9333:18;;49000:71:0;9009:348:1;49000:71:0;-1:-1:-1;;;;;43463:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:34;;43491:6;;43463:24;:34:::1;::::0;43491:6;;43463:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;43355:150:0:o;41664:221::-;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;49461:23;;:139;;-1:-1:-1;49506:10:0;;;;:93;;;;-1:-1:-1;49558:7:0;:10;-1:-1:-1;;;;;49558:10:0;20245;-1:-1:-1;;;;;49542:26:0;;:56;;;-1:-1:-1;49588:10:0;;-1:-1:-1;;;;;49588:10:0;20245;-1:-1:-1;;;;;49572:26:0;;49542:56;49439:224;;;;-1:-1:-1;;;49439:224:0;;12033:2:1;49439:224:0;;;12015:21:1;12072:2;12052:18;;;12045:30;12111:34;12091:18;;;12084:62;-1:-1:-1;;;12162:18:1;;;12155:33;12205:19;;49439:224:0;11831:399:1;49439:224:0;-1:-1:-1;;;;;41760:37:0;::::1;41800:5;41760:37:::0;;;:20:::1;:37;::::0;;;;:45;;-1:-1:-1;;41760:45:0::1;::::0;;41821:56:::1;41760:37:::0;20245:10;41864:12:::1;20165:98:::0;22348:201;21512:6;;-1:-1:-1;;;;;21512:6:0;20245:10;21659:23;21651:68;;;;-1:-1:-1;;;21651:68:0;;6040:2:1;21651:68:0;;;6022:21:1;;;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;6170:18;;21651:68:0;5838:356:1;21651:68:0;-1:-1:-1;;;;;22437:22:0;::::1;22429:73;;;::::0;-1:-1:-1;;;22429:73:0;;13874:2:1;22429:73:0::1;::::0;::::1;13856:21:1::0;13913:2;13893:18;;;13886:30;13952:34;13932:18;;;13925:62;14023:8;14003:18;;;13996:36;14049:19;;22429:73:0::1;13672:402:1::0;22429:73:0::1;22513:28;22532:8;22513:18;:28::i;37232:380::-:0;-1:-1:-1;;;;;37368:19:0;;37360:68;;;;-1:-1:-1;;;37360:68:0;;14281:2:1;37360:68:0;;;14263:21:1;14320:2;14300:18;;;14293:30;14359:34;14339:18;;;14332:62;14430:6;14410:18;;;14403:34;14454:19;;37360:68:0;14079:400:1;37360:68:0;-1:-1:-1;;;;;37447:21:0;;37439:68;;;;-1:-1:-1;;;37439:68:0;;14686:2:1;37439:68:0;;;14668:21:1;14725:2;14705:18;;;14698:30;14764:34;14744:18;;;14737:62;14835:4;14815:18;;;14808:32;14857:19;;37439:68:0;14484:398:1;37439:68:0;-1:-1:-1;;;;;37520:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37572:32;;1719:25:1;;;37572:32:0;;1692:18:1;37572:32:0;;;;;;;;37232:380;;;:::o;34451:733::-;-1:-1:-1;;;;;34591:20:0;;34583:70;;;;-1:-1:-1;;;34583:70:0;;15089:2:1;34583:70:0;;;15071:21:1;15128:2;15108:18;;;15101:30;15167:34;15147:18;;;15140:62;15238:7;15218:18;;;15211:35;15263:19;;34583:70:0;14887:401:1;34583:70:0;-1:-1:-1;;;;;34672:23:0;;34664:71;;;;-1:-1:-1;;;34664:71:0;;15495:2:1;34664:71:0;;;15477:21:1;15534:2;15514:18;;;15507:30;15573:34;15553:18;;;15546:62;15644:5;15624:18;;;15617:33;15667:19;;34664:71:0;15293:399:1;34664:71:0;-1:-1:-1;;;;;34832:17:0;;34808:21;34832:17;;;;;;;;;;;34868:23;;;;34860:74;;;;-1:-1:-1;;;34860:74:0;;15899:2:1;34860:74:0;;;15881:21:1;15938:2;15918:18;;;15911:30;15977:34;15957:18;;;15950:62;16048:8;16028:18;;;16021:36;16074:19;;34860:74:0;15697:402:1;34860:74:0;-1:-1:-1;;;;;34970:17:0;;;:9;:17;;;;;;;;;;;34990:22;;;34970:42;;35034:20;;;;;;;;:30;;35006:6;;34970:9;35034:30;;35006:6;;35034:30;:::i;:::-;;;;;;;;35099:9;-1:-1:-1;;;;;35082:35:0;35091:6;-1:-1:-1;;;;;35082:35:0;;35110:6;35082:35;;;;1719:25:1;;1707:2;1692:18;;1573:177;35082:35:0;;;;;;;;35130:46;34572:612;34451:733;;;:::o;35471:399::-;-1:-1:-1;;;;;35555:21:0;;35547:65;;;;-1:-1:-1;;;35547:65:0;;16306:2:1;35547:65:0;;;16288:21:1;16345:2;16325:18;;;16318:30;16384:33;16364:18;;;16357:61;16435:18;;35547:65:0;16104:355:1;35547:65:0;35703:6;35687:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;35720:18:0;;:9;:18;;;;;;;;;;:28;;35742:6;;35720:9;:28;;35742:6;;35720:28;:::i;:::-;;;;-1:-1:-1;;35764:37:0;;1719:25:1;;;-1:-1:-1;;;;;35764:37:0;;;35781:1;;35764:37;;1707:2:1;1692:18;35764:37:0;;;;;;;35471:399;;:::o;47340:170::-;47444:4;47479:23;:4;47492:9;47479:12;:23::i;:::-;-1:-1:-1;;;;;47468:34:0;:7;-1:-1:-1;;;;;47468:34:0;;47461:41;;47340:170;;;;;:::o;47756:1187::-;47835:7;47875:11;47882:4;47875:6;:11;:::i;:::-;47874:18;;47888:4;47874:18;:::i;:::-;47863:6;:30;47855:57;;;;-1:-1:-1;;;47855:57:0;;16666:2:1;47855:57:0;;;16648:21:1;16705:2;16685:18;;;16678:30;16744:16;16724:18;;;16717:44;16778:18;;47855:57:0;16464:338:1;47855:57:0;48380:11;48387:4;48380:6;:11;:::i;:::-;48371:20;;48412:21;48527:24;48544:6;48527:16;:24::i;:::-;48615:17;:6;:15;:17::i;:::-;48443:217;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48443:217:0;;;;;;;;;48696:21;;48443:217;;-1:-1:-1;48672:21:0;48837:24;48696:21;48837:22;:24::i;:::-;48880:7;48769:133;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;48769:133:0;;;;;;48745:168;;48769:133;48745:168;;;;;47756:1187;-1:-1:-1;;;;;;47756:1187:0:o;22709:191::-;22802:6;;;-1:-1:-1;;;;;22819:17:0;;;-1:-1:-1;;22819:17:0;;;;;;;22852:40;;22802:6;;;22819:17;22802:6;;22852:40;;22783:16;;22852:40;22772:128;22709:191;:::o;36203:591::-;-1:-1:-1;;;;;36287:21:0;;36279:67;;;;-1:-1:-1;;;36279:67:0;;18799:2:1;36279:67:0;;;18781:21:1;18838:2;18818:18;;;18811:30;18877:34;18857:18;;;18850:62;18948:3;18928:18;;;18921:31;18969:19;;36279:67:0;18597:397:1;36279:67:0;-1:-1:-1;;;;;36446:18:0;;36421:22;36446:18;;;;;;;;;;;36483:24;;;;36475:71;;;;-1:-1:-1;;;36475:71:0;;19201:2:1;36475:71:0;;;19183:21:1;19240:2;19220:18;;;19213:30;19279:34;19259:18;;;19252:62;19350:4;19330:18;;;19323:32;19372:19;;36475:71:0;18999:398:1;36475:71:0;-1:-1:-1;;;;;36582:18:0;;:9;:18;;;;;;;;;;36603:23;;;36582:44;;36648:12;:22;;36620:6;;36582:9;36648:22;;36620:6;;36648:22;:::i;:::-;;;;-1:-1:-1;;36688:37:0;;1719:25:1;;;36714:1:0;;-1:-1:-1;;;;;36688:37:0;;;;;1707:2:1;1692:18;36688:37:0;1573:177:1;14324:231:0;14402:7;14423:17;14442:18;14464:27;14475:4;14481:9;14464:10;:27::i;:::-;14422:69;;;;14502:18;14514:5;14502:11;:18::i;:::-;-1:-1:-1;14538:9:0;14324:231;-1:-1:-1;;;14324:231:0:o;725:1771::-;1019:13;;;1029:2;1019:13;;;791:25;1019:13;;;;;;908:16;;;;893:12;;1019:13;;;;;;;;;;-1:-1:-1;1019:13:0;993:39;;1081:7;1099:16;1126:17;1154:13;1178:14;1203:17;1300:20;1323:29;1344:7;1323:20;:29::i;:::-;1300:52;;1454:9;1449:970;1473:11;1469:15;;1449:970;;;1597:6;1602:1;1597:2;:6;:::i;:::-;1594:10;;:1;:10;:::i;:::-;1590:15;;:1;:15;:::i;:::-;1573:33;;:13;;;;:33;:::i;:::-;1563:44;-1:-1:-1;1635:6:0;1639:2;1563:44;1635:6;:::i;:::-;1622:19;-1:-1:-1;1674:15:0;1622:19;1674:2;:15;:::i;:::-;1670:19;;:1;:19;:::i;:::-;1656:33;-1:-1:-1;1780:4:0;1785:3;1787:1;1785;:3;:::i;:::-;1780:9;;;;;;;:::i;:::-;;;;;;-1:-1:-1;1816:4:0;1821:3;1823:1;1821;:3;:::i;:::-;:7;;1827:1;1821:7;:::i;:::-;1816:13;;;;;;;:::i;:::-;;;;;1804:25;;1945:37;1961:10;1973:8;1945:15;:37::i;:::-;1931:51;-1:-1:-1;2089:24:0;1931:51;2089:10;:24;:::i;:::-;2082:32;;2062:10;2073:5;2077:1;2073;:5;:::i;:::-;2062:17;;;;;;;;:::i;:::-;;;;:52;-1:-1:-1;;;;;2062:52:0;;;;;;;;;2231:39;2247:11;2260:9;2231:15;:39::i;:::-;2217:53;-1:-1:-1;2381:25:0;2217:53;2381:11;:25;:::i;:::-;2374:33;;2350:10;2361:5;2365:1;2361;:5;:::i;:::-;:9;;2369:1;2361:9;:::i;:::-;2350:21;;;;;;;;:::i;:::-;;;;:57;-1:-1:-1;;;;;2350:57:0;;;;;;;;-1:-1:-1;1486:3:0;;;;:::i;:::-;;;;1449:970;;;;2475:10;2445:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;2431:57;;;;;;;;;;;725:1771;;;:::o;8165:723::-;8221:13;8442:10;8438:53;;-1:-1:-1;;8469:10:0;;;;;;;;;;;;;;;;;;8165:723::o;8438:53::-;8516:5;8501:12;8557:78;8564:9;;8557:78;;8590:8;;;;:::i;:::-;;-1:-1:-1;8613:10:0;;-1:-1:-1;8621:2:0;8613:10;;:::i;:::-;;;8557:78;;;8645:19;8677:6;8667:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8667:17:0;;8645:39;;8695:154;8702:10;;8695:154;;8729:11;8739:1;8729:11;;:::i;:::-;;-1:-1:-1;8798:10:0;8806:2;8798:5;:10;:::i;:::-;8785:24;;:2;:24;:::i;:::-;8772:39;;8755:6;8762;8755:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8755:56:0;;;;;;;;-1:-1:-1;8826:11:0;8835:2;8826:11;;:::i;:::-;;;8695:154;;;8873:6;8165:723;-1:-1:-1;;;;8165:723:0:o;12214:1308::-;12295:7;12304:12;12529:9;:16;12549:2;12529:22;12525:990;;;12825:4;12810:20;;12804:27;12875:4;12860:20;;12854:27;12933:4;12918:20;;12912:27;12568:9;12904:36;12976:25;12987:4;12904:36;12804:27;12854;12976:10;:25::i;:::-;12969:32;;;;;;;;;12525:990;13023:9;:16;13043:2;13023:22;13019:496;;;13298:4;13283:20;;13277:27;13349:4;13334:20;;13328:27;13391:23;13402:4;13277:27;13328;13391:10;:23::i;:::-;13384:30;;;;;;;;13019:496;-1:-1:-1;13463:1:0;;-1:-1:-1;13467:35:0;13019:496;12214:1308;;;;;:::o;10485:643::-;10563:20;10554:5;:29;;;;;;;;:::i;:::-;;10550:571;;;10485:643;:::o;10550:571::-;10661:29;10652:5;:38;;;;;;;;:::i;:::-;;10648:473;;;10707:34;;-1:-1:-1;;;10707:34:0;;22670:2:1;10707:34:0;;;22652:21:1;22709:2;22689:18;;;22682:30;22748:26;22728:18;;;22721:54;22792:18;;10707:34:0;22468:348:1;10648:473:0;10772:35;10763:5;:44;;;;;;;;:::i;:::-;;10759:362;;;10824:41;;-1:-1:-1;;;10824:41:0;;23023:2:1;10824:41:0;;;23005:21:1;23062:2;23042:18;;;23035:30;23101:33;23081:18;;;23074:61;23152:18;;10824:41:0;22821:355:1;10759:362:0;10896:30;10887:5;:39;;;;;;;;:::i;:::-;;10883:238;;;10943:44;;-1:-1:-1;;;10943:44:0;;23383:2:1;10943:44:0;;;23365:21:1;23422:2;23402:18;;;23395:30;23461:34;23441:18;;;23434:62;-1:-1:-1;;;23512:18:1;;;23505:32;23554:19;;10943:44:0;23181:398:1;10883:238:0;11018:30;11009:5;:39;;;;;;;;:::i;:::-;;11005:116;;;11065:44;;-1:-1:-1;;;11065:44:0;;23786:2:1;11065:44:0;;;23768:21:1;23825:2;23805:18;;;23798:30;23864:34;23844:18;;;23837:62;-1:-1:-1;;;23915:18:1;;;23908:32;23957:19;;11065:44:0;23584:398:1;2853:1157:0;2923:36;;:::i;:::-;3026:16;;;;3014:9;3153:17;3026:16;3153:14;:17::i;:::-;3136:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;3126:46;;;;;;3114:58;;3221:23;3255:24;3290:20;3321:21;3444:9;3439:564;3459:8;3455:12;;3439:564;;;3610:2;3602:1;3604;3602:4;;;;;;;:::i;:::-;3596:16;;;3602:4;;3596:16;:::i;:::-;3575:37;;3684:2;3662:18;3654:1;3656;3654:4;;;;;;;:::i;:::-;3648:32;;;3654:4;;3648:32;:::i;:::-;3647:39;;;;:::i;:::-;3627:59;;3733:2;3725:1;3727;3725:4;;;;;;;:::i;:::-;3719:16;;;3725:4;;3719:16;:::i;:::-;3701:34;;3801:2;3782:15;3774:1;3776;3774:4;;;;;;;:::i;:::-;3768:29;;;3774:4;;3768:29;:::i;:::-;3767:36;;;;:::i;:::-;3750:53;;3871:1;3851:17;:21;;;:43;;;;;3893:1;3876:14;:18;;;3851:43;3820:20;3841:5;3845:1;3841;:5;:::i;:::-;3820:27;;;;;;;:::i;:::-;:75;;;:27;;;;;:75;3966:1;3945:22;;;;:45;;;;;3989:1;3971:15;:19;;;3945:45;3910:20;3931:5;3935:1;3931;:5;:::i;:::-;:9;;3939:1;3931:9;:::i;:::-;3910:31;;;;;;;:::i;:::-;:81;;;:31;;;;;:81;3469:3;;;;:::i;:::-;;;;3439:564;;;;2961:1049;;;;;;2853:1157;;;:::o;2504:341::-;2577:12;2698:2;2689:6;:11;;;2685:153;;;-1:-1:-1;2726:2:0;2685:153;;;2750:4;2746:92;;;-1:-1:-1;2780:2:0;2746:92;;;-1:-1:-1;2824:2:0;2504:341;;;;:::o;15823:1632::-;15954:7;;16888:66;16875:79;;16871:163;;;-1:-1:-1;16987:1:0;;-1:-1:-1;16991:30:0;16971:51;;16871:163;17048:1;:7;;17053:2;17048:7;;:18;;;;;17059:1;:7;;17064:2;17059:7;;17048:18;17044:102;;;-1:-1:-1;17099:1:0;;-1:-1:-1;17103:30:0;17083:51;;17044:102;17260:24;;;17243:14;17260:24;;;;;;;;;24657:25:1;;;24730:4;24718:17;;24698:18;;;24691:45;;;;24752:18;;;24745:34;;;24795:18;;;24788:34;;;17260:24:0;;24629:19:1;;17260:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17260:24:0;;-1:-1:-1;;17260:24:0;;;-1:-1:-1;;;;;;;17299:20:0;;17295:103;;17352:1;17356:29;17336:50;;;;;;;17295:103;17418:6;-1:-1:-1;17426:20:0;;-1:-1:-1;15823:1632:0;;;;;;;;:::o;14818:391::-;14932:7;;15041:66;15033:75;;15135:3;15131:12;;;15145:2;15127:21;15176:25;15187:4;15127:21;15196:1;15033:75;15176:10;:25::i;:::-;15169:32;;;;;;14818:391;;;;;;:::o;4084:954::-;4265:13;;;4275:2;4265:13;;;4145:25;4265:13;;;;;;4239:23;;4265:13;;;;;;;;;;;-1:-1:-1;;4239:39:0;-1:-1:-1;4327:7:0;;;;4486:507;4510:11;4506:15;;4486:507;;;4638:6;4643:1;4638:2;:6;:::i;:::-;4633:12;;:1;:12;:::i;:::-;4627:19;;:1;:19;:::i;:::-;4610:37;;:13;;;;:37;:::i;:::-;4600:48;-1:-1:-1;4676:6:0;4680:2;4600:48;4676:6;:::i;:::-;4663:19;-1:-1:-1;4715:15:0;4663:19;4715:2;:15;:::i;:::-;4711:19;;:1;:19;:::i;:::-;4697:33;;4878:2;4865:10;:15;;;:25;;4888:2;4865:25;;;4883:2;4865:25;4851:40;;:10;:40;:::i;:::-;4844:48;;4824:10;4835:5;4839:1;4835;:5;:::i;:::-;4824:17;;;;;;;;:::i;:::-;;;;:68;-1:-1:-1;;;;;4824:68:0;;;;;;;;;4967:2;4953:11;:16;;;:26;;4977:2;4953:26;;;4972:2;4953:26;4938:42;;:11;:42;:::i;:::-;4931:50;;4907:10;4918:5;4922:1;4918;:5;:::i;:::-;:9;;4926:1;4918:9;:::i;:::-;4907:21;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;4907:74:0;;;;;;;;-1:-1:-1;4523:3:0;;;;:::i;:::-;;;;4486:507;;;-1:-1:-1;5019:10:0;;4084:954;-1:-1:-1;;;;;4084:954:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:258:1;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:196::-;733:20;;-1:-1:-1;;;;;782:54:1;;772:65;;762:93;;851:1;848;841:12;762:93;665:196;;;:::o;866:254::-;934:6;942;995:2;983:9;974:7;970:23;966:32;963:52;;;1011:1;1008;1001:12;963:52;1034:29;1053:9;1034:29;:::i;:::-;1024:39;1110:2;1095:18;;;;1082:32;;-1:-1:-1;;;866:254:1:o;1317:251::-;1401:6;1454:2;1442:9;1433:7;1429:23;1425:32;1422:52;;;1470:1;1467;1460:12;1422:52;1509:7;1504:2;1493:9;1489:18;1486:31;1483:51;;;1530:1;1527;1520:12;1483:51;-1:-1:-1;1553:9:1;1317:251;-1:-1:-1;1317:251:1:o;1755:328::-;1832:6;1840;1848;1901:2;1889:9;1880:7;1876:23;1872:32;1869:52;;;1917:1;1914;1907:12;1869:52;1940:29;1959:9;1940:29;:::i;:::-;1930:39;;1988:38;2022:2;2011:9;2007:18;1988:38;:::i;:::-;1978:48;;2073:2;2062:9;2058:18;2045:32;2035:42;;1755:328;;;;;:::o;2088:180::-;2147:6;2200:2;2188:9;2179:7;2175:23;2171:32;2168:52;;;2216:1;2213;2206:12;2168:52;-1:-1:-1;2239:23:1;;2088:180;-1:-1:-1;2088:180:1:o;2693:186::-;2752:6;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;2844:29;2863:9;2844:29;:::i;:::-;2834:39;2693:186;-1:-1:-1;;;2693:186:1:o;2884:184::-;-1:-1:-1;;;2933:1:1;2926:88;3033:4;3030:1;3023:15;3057:4;3054:1;3047:15;3073:348;3125:8;3135:6;3189:3;3182:4;3174:6;3170:17;3166:27;3156:55;;3207:1;3204;3197:12;3156:55;-1:-1:-1;3230:20:1;;3273:18;3262:30;;3259:50;;;3305:1;3302;3295:12;3259:50;3342:4;3334:6;3330:17;3318:29;;3394:3;3387:4;3378:6;3370;3366:19;3362:30;3359:39;3356:59;;;3411:1;3408;3401:12;3426:1422;3542:6;3550;3558;3566;3574;3582;3635:3;3623:9;3614:7;3610:23;3606:33;3603:53;;;3652:1;3649;3642:12;3603:53;3688:9;3675:23;3665:33;;3749:2;3738:9;3734:18;3721:32;3772:18;3813:2;3805:6;3802:14;3799:34;;;3829:1;3826;3819:12;3799:34;3867:6;3856:9;3852:22;3842:32;;3912:7;3905:4;3901:2;3897:13;3893:27;3883:55;;3934:1;3931;3924:12;3883:55;3970:2;3957:16;3992:2;3988;3985:10;3982:36;;;3998:18;;:::i;:::-;4073:2;4067:9;4041:2;4127:13;;-1:-1:-1;;4123:22:1;;;4147:2;4119:31;4115:40;4103:53;;;4171:18;;;4191:22;;;4168:46;4165:72;;;4217:18;;:::i;:::-;4257:10;4253:2;4246:22;4292:2;4284:6;4277:18;4332:7;4327:2;4322;4318;4314:11;4310:20;4307:33;4304:53;;;4353:1;4350;4343:12;4304:53;4409:2;4404;4400;4396:11;4391:2;4383:6;4379:15;4366:46;4454:1;4449:2;4444;4436:6;4432:15;4428:24;4421:35;4475:6;4465:16;;;;;4534:2;4523:9;4519:18;4506:32;4490:48;;4563:2;4553:8;4550:16;4547:36;;;4579:1;4576;4569:12;4547:36;;4618:61;4671:7;4660:8;4649:9;4645:24;4618:61;:::i;:::-;4698:8;;-1:-1:-1;4592:87:1;-1:-1:-1;4752:38:1;;-1:-1:-1;4786:2:1;4771:18;;4752:38;:::i;:::-;4742:48;;4837:3;4826:9;4822:19;4809:33;4799:43;;3426:1422;;;;;;;;:::o;4853:273::-;4909:6;4962:2;4950:9;4941:7;4937:23;4933:32;4930:52;;;4978:1;4975;4968:12;4930:52;5017:9;5004:23;5070:5;5063:13;5056:21;5049:5;5046:32;5036:60;;5092:1;5089;5082:12;5131:260;5199:6;5207;5260:2;5248:9;5239:7;5235:23;5231:32;5228:52;;;5276:1;5273;5266:12;5228:52;5299:29;5318:9;5299:29;:::i;:::-;5289:39;;5347:38;5381:2;5370:9;5366:18;5347:38;:::i;:::-;5337:48;;5131:260;;;;;:::o;5396:437::-;5475:1;5471:12;;;;5518;;;5539:61;;5593:4;5585:6;5581:17;5571:27;;5539:61;5646:2;5638:6;5635:14;5615:18;5612:38;5609:218;;;-1:-1:-1;;;5680:1:1;5673:88;5784:4;5781:1;5774:15;5812:4;5809:1;5802:15;6199:184;-1:-1:-1;;;6248:1:1;6241:88;6348:4;6345:1;6338:15;6372:4;6369:1;6362:15;8557:184;-1:-1:-1;;;8606:1:1;8599:88;8706:4;8703:1;8696:15;8730:4;8727:1;8720:15;8746:125;8786:4;8814:1;8811;8808:8;8805:34;;;8819:18;;:::i;:::-;-1:-1:-1;8856:9:1;;8746:125::o;8876:128::-;8916:3;8947:1;8943:6;8940:1;8937:13;8934:39;;;8953:18;;:::i;:::-;-1:-1:-1;8989:9:1;;8876:128::o;9722:273::-;9907:6;9899;9894:3;9881:33;9863:3;9933:16;;9958:13;;;9933:16;9722:273;-1:-1:-1;9722:273:1:o;11042:168::-;11082:7;11148:1;11144;11140:6;11136:14;11133:1;11130:21;11125:1;11118:9;11111:17;11107:45;11104:71;;;11155:18;;:::i;:::-;-1:-1:-1;11195:9:1;;11042:168::o;11215:184::-;-1:-1:-1;;;11264:1:1;11257:88;11364:4;11361:1;11354:15;11388:4;11385:1;11378:15;11404:120;11444:1;11470;11460:35;;11475:18;;:::i;:::-;-1:-1:-1;11509:9:1;;11404:120::o;16807:1103::-;17319:34;17314:3;17307:47;17384:66;17379:2;17374:3;17370:12;17363:88;17289:3;17480:6;17474:13;17496:60;17549:6;17544:2;17539:3;17535:12;17530:2;17522:6;17518:15;17496:60;:::i;:::-;17620:66;17615:2;17575:16;;;17607:11;;;17600:87;17712:13;;17734:61;17712:13;17781:2;17773:11;;17768:2;17756:15;;17734:61;:::i;:::-;17860:16;17855:2;17814:17;;;;17847:11;;;17840:37;17901:2;17893:11;;16807:1103;-1:-1:-1;;;;16807:1103:1:o;17915:677::-;18225:66;18220:3;18213:79;18195:3;18321:6;18315:13;18337:62;18392:6;18387:2;18382:3;18378:12;18371:4;18363:6;18359:17;18337:62;:::i;:::-;18459:13;;18418:16;;;;18481:63;18459:13;18530:2;18522:11;;18515:4;18503:17;;18481:63;:::i;:::-;18564:17;18583:2;18560:26;;17915:677;-1:-1:-1;;;;17915:677:1:o;19402:422::-;19491:1;19534:5;19491:1;19548:270;19569:7;19559:8;19556:21;19548:270;;;19628:4;19624:1;19620:6;19616:17;19610:4;19607:27;19604:53;;;19637:18;;:::i;:::-;19687:7;19677:8;19673:22;19670:55;;;19707:16;;;;19670:55;19786:22;;;;19746:15;;;;19548:270;;;19552:3;19402:422;;;;;:::o;19829:806::-;19878:5;19908:8;19898:80;;-1:-1:-1;19949:1:1;19963:5;;19898:80;19997:4;19987:76;;-1:-1:-1;20034:1:1;20048:5;;19987:76;20079:4;20097:1;20092:59;;;;20165:1;20160:130;;;;20072:218;;20092:59;20122:1;20113:10;;20136:5;;;20160:130;20197:3;20187:8;20184:17;20181:43;;;20204:18;;:::i;:::-;-1:-1:-1;;20260:1:1;20246:16;;20275:5;;20072:218;;20374:2;20364:8;20361:16;20355:3;20349:4;20346:13;20342:36;20336:2;20326:8;20323:16;20318:2;20312:4;20309:12;20305:35;20302:77;20299:159;;;-1:-1:-1;20411:19:1;;;20443:5;;20299:159;20490:34;20515:8;20509:4;20490:34;:::i;:::-;20560:6;20556:1;20552:6;20548:19;20539:7;20536:32;20533:58;;;20571:18;;:::i;:::-;20609:20;;19829:806;-1:-1:-1;;;19829:806:1:o;20640:131::-;20700:5;20729:36;20756:8;20750:4;20729:36;:::i;20776:165::-;20814:1;20848:4;20845:1;20841:12;20872:3;20862:37;;20879:18;;:::i;:::-;20931:3;20924:4;20921:1;20917:12;20913:22;20908:27;;;20776:165;;;;:::o;20946:238::-;20984:7;21024:4;21021:1;21017:12;21056:4;21053:1;21049:12;21116:3;21110:4;21106:14;21101:3;21098:23;21091:3;21084:11;21077:19;21073:49;21070:75;;;21125:18;;:::i;21189:195::-;21227:4;21264;21261:1;21257:12;21296:4;21293:1;21289:12;21321:3;21316;21313:12;21310:38;;;21328:18;;:::i;:::-;21365:13;;;21189:195;-1:-1:-1;;;21189:195:1:o;21389:204::-;21427:3;21463:4;21460:1;21456:12;21495:4;21492:1;21488:12;21530:3;21524:4;21520:14;21515:3;21512:23;21509:49;;;21538:18;;:::i;:::-;21574:13;;21389:204;-1:-1:-1;;;21389:204:1:o;21598:135::-;21637:3;-1:-1:-1;;21658:17:1;;21655:43;;;21678:18;;:::i;:::-;-1:-1:-1;21725:1:1;21714:13;;21598:135::o;21738:419::-;22000:4;21995:3;21988:17;21970:3;22034:6;22028:13;22050:61;22104:6;22100:1;22095:3;22091:11;22084:4;22076:6;22072:17;22050:61;:::i;:::-;22131:16;;;;22149:1;22127:24;;21738:419;-1:-1:-1;;21738:419:1:o;22162:112::-;22194:1;22220;22210:35;;22225:18;;:::i;:::-;-1:-1:-1;22259:9:1;;22162:112::o;22279:184::-;-1:-1:-1;;;22328:1:1;22321:88;22428:4;22425:1;22418:15;22452:4;22449:1;22442:15;23987:276;24118:3;24156:6;24150:13;24172:53;24218:6;24213:3;24206:4;24198:6;24194:17;24172:53;:::i;:::-;24241:16;;;;;23987:276;-1:-1:-1;;23987:276:1:o;24268:157::-;24298:1;24332:4;24329:1;24325:12;24356:3;24346:37;;24363:18;;:::i;:::-;24415:3;24408:4;24405:1;24401:12;24397:22;24392:27;;;24268:157;;;;:::o

Swarm Source

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