ETH Price: $2,580.67 (-2.39%)

Token

Nafty Angels (NAFTY)
 

Overview

Max Total Supply

1,696 NAFTY

Holders

510

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 NAFTY
0x8364e59631d012ead8a4db965df4f174da05a260
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:
NaftyAngels

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// 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 (last updated v4.5.0) (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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 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/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}

// File: contracts/NA/NaftyAngels.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;





contract NaftyAngels is ERC721, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public MAX_EXCLUSIVE = 696;
    uint256 public MAX_PRESALE = 1500;
    
    uint256 public maxSupply = 6969;
    uint256 public currentSupply = 0;

    uint256 public salePrice = 0.02 ether;
    uint256 public presalePrice = 0.015 ether;
    uint256 public exclusivePrice = 0.01 ether;

    uint256 public presaleCount;
    uint256 public exclusiveCount;

    uint256 private freeMinted;

    //Placeholders
    address private presaleAddress = address(0x4b296B40eED802E41447E79DD207ECa7844EA146);
    address private exclusiveAddress = address(0x06ebcDBEc10EcB8731F46185Af236bAaD620dAfB);
    address private wallet = address(0x9C86fC37EB0054f38D29C44Ba374E6e712e40F9f);

    string private baseURI;
    string private notRevealedUri = "ipfs://QmPLmJsniAS8BqJoqqy4eUU7cy8KyoqdGys19nfQy3nkdU";

    bool public revealed = false;
    bool public baseLocked = false;

    enum WorkflowStatus {
        Before,
        Exclusive,
        Presale,
        Sale,
        Paused,
        Reveal
    }

    WorkflowStatus public workflow;

    mapping(address => uint256) public freeMintAccess;
    mapping(address => uint256) public freeMintLog;

    constructor()
        ERC721("Nafty Angels", "NAFTY")
    {
        transferOwnership(msg.sender);
        workflow = WorkflowStatus.Before;
    }

    function withdraw() public onlyOwner {
        uint256 _balance = address( this ).balance;
        
        payable( wallet ).transfer( _balance );
    }

    //GETTERS
    function getSaleStatus() public view returns (WorkflowStatus) {
        return workflow;
    }

    function totalSupply() public view returns (uint256) {
        return currentSupply;
    }

    function getFreeMintAmount( address _acc ) public view returns (uint256) {
        return freeMintAccess[ _acc ];
    }

    function getFreeMintLog( address _acc ) public view returns (uint256) {
        return freeMintLog[ _acc ];
    }

    function validateSignature( address _addr, bytes memory _s ) internal view returns (bool){
        bytes32 messageHash = keccak256(
            abi.encodePacked( address(this), msg.sender)
        );

        address signer = messageHash.toEthSignedMessageHash().recover(_s);

        if( _addr == signer ) {
            return true;
        } else {
            return false;
        }
    }

    //Batch minting
    function mintBatch(
        address to,
        uint256 baseId,
        uint256 number
    ) internal {

        for (uint256 i = 0; i < number; i++) {
            _safeMint(to, baseId + i);
        }

    }

    /**
        Claims tokens for free paying only gas fees
     */
    function freeMint(uint256 _amount) external {
        uint256 supply = currentSupply;

        require( 
          freeMintAccess[ msg.sender ] >= _amount, 
          "You dont have permision to free mint that amount." 
        );

        require(
            supply + _amount <= maxSupply,
            "NaftyAngels: Mint too large, exceeding the maxSupply"
        );

        freeMintAccess[ msg.sender ] -= _amount;
        freeMintLog[ msg.sender ] += _amount;

        freeMinted += _amount;
        currentSupply += _amount;

        mintBatch(msg.sender, supply, _amount);
    }

    //Exclusive presale minting
    function exclusiveMint(
        uint256 amount,
        bytes calldata signature
    ) external payable {
        
        require(amount > 0, "You must mint at least one token");

        require(
            workflow == WorkflowStatus.Exclusive,
            "NaftyAngels: Exclusive presale has not been started yet!"
        );

        require(
            validateSignature(
                exclusiveAddress,
                signature
            ),
            "SIGNATURE_VALIDATION_FAILED"
        );
        
        require(
            exclusiveCount + amount <= MAX_EXCLUSIVE,
            "NaftyAngels: Selected amount exceeds the max exclusive presale supply."
        );

        require(
            msg.value >= exclusivePrice * amount,
            "NaftyAngels: Insuficient ETH amount sent."
        );

        exclusiveCount += amount;
        currentSupply  += amount;
 
        mintBatch(msg.sender, currentSupply - amount, amount);
    }

    function presaleMint(
        uint256 amount,
        bytes calldata signature
    ) external payable {
        
        require(amount > 0, "You must mint at least one token");

        require(
            validateSignature(
                presaleAddress,
                signature
            ),
            "SIGNATURE_VALIDATION_FAILED"
        );
        
        require(
            workflow == WorkflowStatus.Presale,
            "NaftyAngels: Presale has not started yet!"
        );
        
        require(
            presaleCount + amount <= MAX_PRESALE,
            "NaftyAngels: Selected amount exceeds the max presale supply"
        );

        require(
            msg.value >= presalePrice * amount,
            "NaftyAngels: Insuficient ETH amount sent."
        );

        presaleCount += amount;
        currentSupply += amount;

        mintBatch(msg.sender, currentSupply - amount, amount);
    }

    function publicSaleMint(uint256 amount) external payable {
        require( amount > 0, "You must mint at least one NFT.");
        
        uint256 supply = currentSupply;

        require( supply < maxSupply, "NaftyAngels: Sold out!" );
        require( supply + amount <= maxSupply, "NaftyAngels: Selected amount exceeds the max supply.");

        require(
            workflow == WorkflowStatus.Sale,
            "NaftyAngels: Public sale has not started yet."
        );

        require(
            msg.value >= salePrice * amount,
            "NaftyAngels: Insuficient ETH amount sent."
        );

        currentSupply += amount;

        mintBatch(msg.sender, supply, amount);
    }

    function forceMint(uint256 number, address receiver) external onlyOwner {
        uint256 supply = currentSupply;

        require(
            supply + number <= maxSupply,
            "NaftyAngels: You can't mint more than max supply"
        );

        currentSupply += number;

        mintBatch( receiver, supply, number);
    }

    function ownerMint(uint256 number) external onlyOwner {
        uint256 supply = currentSupply;

        require(
            supply + number <= maxSupply,
            "NaftyAngels: You can't mint more than max supply"
        );

        currentSupply += number;

        mintBatch(msg.sender, supply, number);
    }

    function airdrop(address[] calldata addresses) external onlyOwner {
        uint256 supply = currentSupply;
        require(
            supply + addresses.length <= maxSupply,
            "NaftyAngels: You can't mint more than max supply"
        );

        currentSupply += addresses.length;

        for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], supply + i);
        }
    }

    // END MINT FUNCTIONS
    function getFreeMinted() public view onlyOwner returns (uint256){
        return freeMinted;
    }

    function setUpBefore() external onlyOwner {
        workflow = WorkflowStatus.Before;
    }

    function setUpExclusive() external onlyOwner {
        workflow = WorkflowStatus.Exclusive;
    }

    function setUpPresale() external onlyOwner {
        workflow = WorkflowStatus.Presale;
    }

    function setUpSale() external onlyOwner {
        workflow = WorkflowStatus.Sale;
    }

    function pauseSale() external onlyOwner {
        workflow = WorkflowStatus.Paused;
    }

    function setMaxExclusive( uint256 _amount ) external onlyOwner {
        MAX_EXCLUSIVE = _amount;
    }

    function setMaxPresale( uint256 _amount ) external onlyOwner {
        MAX_PRESALE = _amount;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        require( baseLocked == false, "Base URI change has been disabled permanently");

        baseURI = _newBaseURI;
    }

    function setPresaleAddress(address _newAddress) public onlyOwner {
        require(_newAddress != address(0), "CAN'T PUT 0 ADDRESS");
        presaleAddress = _newAddress;
    }

    function setExclusiveAddress(address _newAddress) public onlyOwner {
        require(_newAddress != address(0), "CAN'T PUT 0 ADDRESS");
        exclusiveAddress = _newAddress;
    }

    function setWallet(address _newWallet) public onlyOwner {
        wallet = _newWallet;
    }

    function setSalePrice(uint256 _newPrice) public onlyOwner {
        salePrice = _newPrice;
    }

    function setPresalePrice(uint256 _newPrice) public onlyOwner {
        presalePrice = _newPrice;
    }

    function setFreeMintAccess(address _acc, uint256 _am ) public onlyOwner {
        freeMintAccess[ _acc ] = _am;
    }

    function setExclusivePrice(uint256 _newPrice) public onlyOwner {
        exclusivePrice = _newPrice;
    }

    function lockBase() public onlyOwner {
        baseLocked = true;
    }

    // FACTORY
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721)
        returns (string memory)
    {
        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = baseURI;
        return
            bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString(),'.json'))
                : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_EXCLUSIVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exclusiveCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"exclusiveMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exclusivePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"forceMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintAccess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_acc","type":"address"}],"name":"getFreeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_acc","type":"address"}],"name":"getFreeMintLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleStatus","outputs":[{"internalType":"enum NaftyAngels.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setExclusiveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setExclusivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_acc","type":"address"},{"internalType":"uint256","name":"_am","type":"uint256"}],"name":"setFreeMintAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxExclusive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setPresaleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpExclusive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum NaftyAngels.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

6102b86007556105dc600855611b396009556000600a5566470de4df820000600b5566354a6ba7a18000600c55662386f26fc10000600d55601180546001600160a01b0319908116734b296b40eed802e41447e79dd207eca7844ea146179091556012805482167306ebcdbec10ecb8731f46185af236baad620dafb17905560138054909116739c86fc37eb0054f38d29c44ba374e6e712e40f9f17905560e0604052603560808181529062003d3f60a0398051620000c7916015916020909101906200026d565b506016805461ffff19169055348015620000e057600080fd5b50604080518082018252600c81526b4e6166747920416e67656c7360a01b6020808301918252835180850190945260058452644e4146545960d81b90840152815191929162000132916000916200026d565b508051620001489060019060208401906200026d565b505050620001656200015f6200018260201b60201c565b62000186565b6200017033620001d8565b6016805462ff000019169055620003cb565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001e262000182565b6001600160a01b0316620001f56200025e565b6001600160a01b031614620002275760405162461bcd60e51b81526004016200021e9062000359565b60405180910390fd5b6001600160a01b038116620002505760405162461bcd60e51b81526004016200021e9062000313565b6200025b8162000186565b50565b6006546001600160a01b031690565b8280546200027b906200038e565b90600052602060002090601f0160209004810192826200029f5760008555620002ea565b82601f10620002ba57805160ff1916838001178555620002ea565b82800160010185558215620002ea579182015b82811115620002ea578251825591602001919060010190620002cd565b50620002f8929150620002fc565b5090565b5b80821115620002f85760008155600101620002fd565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600281046001821680620003a357607f821691505b60208210811415620003c557634e487b7160e01b600052602260045260246000fd5b50919050565b61396480620003db6000396000f3fe6080604052600436106103a15760003560e01c80637b082610116101e7578063b3ab66b01161010d578063deaa59df116100a0578063f2fde38b1161006f578063f2fde38b146109da578063f51f96dd146109fa578063fb7ddd0414610a0f578063fd24a85414610a2f576103a1565b8063deaa59df1461095a578063e985e9c51461097a578063f19e75d41461099a578063f2c4ce1e146109ba576103a1565b8063cc081c46116100dc578063cc081c4614610908578063cde27a351461091b578063d5abeb0114610930578063dac69bcc14610945576103a1565b8063b3ab66b014610895578063b88d4fde146108a8578063bdb9f28d146108c8578063c87b56dd146108e8576103a1565b8063916d31ff116101855780639e17b440116101545780639e17b44014610836578063a22cb4651461084b578063a33441251461086b578063a475b5dd14610880576103a1565b8063916d31ff146107cc57806393676270146107ec57806395d89b411461080157806397b9bd0814610816576103a1565b8063847e2101116101c1578063847e2101146107605780638c3c4b34146107755780638da5cb5b146107975780638f48676a146107ac576103a1565b80637b0826101461070b5780637c928fe9146107205780638074be9814610740576103a1565b80633549345e116102cc57806355f804b31161026a578063715018a611610239578063715018a6146106ac578063729ad39e146106c1578063771282f6146106e15780637a10eb7a146106f6576103a1565b806355f804b31461062c5780636352211e1461064c57806367dc2fbb1461066c57806370a082311461068c576103a1565b80634c709163116102a65780634c709163146105cd5780634d4c4e99146105ed578063518302271461060257806355367ba914610617576103a1565b80633549345e146105785780633ccfd60b1461059857806342842e0e146105ad576103a1565b80630b2af42e116103445780631bbc1afa116103135780631bbc1afa1461050e5780631c03ceb51461052e5780631f2898c31461054357806323b872dd14610558576103a1565b80630b2af42e146104a457806315c316fc146104c457806318160ddd146104d95780631919fed7146104ee576103a1565b806306fdde031161038057806306fdde0314610413578063081812fc1461043557806308ea29ad14610462578063095ea7b314610484576103a1565b80620e7fa8146103a657806301ffc9a7146103d1578063033bea20146103fe575b600080fd5b3480156103b257600080fd5b506103bb610a42565b6040516103c891906137d5565b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004612b8e565b610a48565b6040516103c89190612dd1565b34801561040a57600080fd5b506103bb610a90565b34801561041f57600080fd5b50610428610ae1565b6040516103c89190612e22565b34801561044157600080fd5b50610455610450366004612c0c565b610b73565b6040516103c89190612d80565b34801561046e57600080fd5b5061048261047d366004612c0c565b610bb6565b005b34801561049057600080fd5b5061048261049f366004612af6565b610bfa565b3480156104b057600080fd5b506104826104bf366004612af6565b610c92565b3480156104d057600080fd5b50610482610ced565b3480156104e557600080fd5b506103bb610d47565b3480156104fa57600080fd5b50610482610509366004612c0c565b610d4d565b34801561051a57600080fd5b50610482610529366004612c0c565b610d91565b34801561053a57600080fd5b50610482610dd5565b34801561054f57600080fd5b50610482610e25565b34801561056457600080fd5b50610482610573366004612a08565b610e7c565b34801561058457600080fd5b50610482610593366004612c0c565b610eb4565b3480156105a457600080fd5b50610482610ef8565b3480156105b957600080fd5b506104826105c8366004612a08565b610f75565b3480156105d957600080fd5b506103bb6105e83660046129bc565b610f90565b3480156105f957600080fd5b506103bb610fa2565b34801561060e57600080fd5b506103f1610fa8565b34801561062357600080fd5b50610482610fb1565b34801561063857600080fd5b50610482610647366004612bc6565b611008565b34801561065857600080fd5b50610455610667366004612c0c565b611082565b34801561067857600080fd5b50610482610687366004612c0c565b6110b7565b34801561069857600080fd5b506103bb6106a73660046129bc565b6110fb565b3480156106b857600080fd5b5061048261113f565b3480156106cd57600080fd5b506104826106dc366004612b1f565b61118a565b3480156106ed57600080fd5b506103bb61127c565b34801561070257600080fd5b50610482611282565b34801561071757600080fd5b506103f16112d9565b34801561072c57600080fd5b5061048261073b366004612c0c565b6112e7565b34801561074c57600080fd5b5061048261075b366004612c24565b6113ca565b34801561076c57600080fd5b5061048261145a565b34801561078157600080fd5b5061078a6114b1565b6040516103c89190612dfa565b3480156107a357600080fd5b506104556114c0565b3480156107b857600080fd5b506104826107c73660046129bc565b6114cf565b3480156107d857600080fd5b506103bb6107e73660046129bc565b611556565b3480156107f857600080fd5b506103bb611568565b34801561080d57600080fd5b5061042861156e565b34801561082257600080fd5b506103bb6108313660046129bc565b61157d565b34801561084257600080fd5b506103bb611598565b34801561085757600080fd5b50610482610866366004612abc565b61159e565b34801561087757600080fd5b5061078a6115b0565b34801561088c57600080fd5b506104826115bf565b6104826108a3366004612c0c565b61160d565b3480156108b457600080fd5b506104826108c3366004612a43565b611705565b3480156108d457600080fd5b506104826108e33660046129bc565b61173e565b3480156108f457600080fd5b50610428610903366004612c0c565b6117c5565b610482610916366004612c46565b611943565b34801561092757600080fd5b506103bb611ab9565b34801561093c57600080fd5b506103bb611abf565b34801561095157600080fd5b506103bb611ac5565b34801561096657600080fd5b506104826109753660046129bc565b611acb565b34801561098657600080fd5b506103f16109953660046129d6565b611b2c565b3480156109a657600080fd5b506104826109b5366004612c0c565b611b5c565b3480156109c657600080fd5b506104826109d5366004612bc6565b611bc9565b3480156109e657600080fd5b506104826109f53660046129bc565b611c1b565b348015610a0657600080fd5b506103bb611c8c565b348015610a1b57600080fd5b506103bb610a2a3660046129bc565b611c92565b610482610a3d366004612c46565b611cad565b600c5481565b60006001600160e01b031982166380ac58cd60e01b1480610a7957506001600160e01b03198216635b5e139f60e01b145b80610a885750610a8882611deb565b90505b919050565b6000610a9a611e04565b6001600160a01b0316610aab6114c0565b6001600160a01b031614610ada5760405162461bcd60e51b8152600401610ad190613581565b60405180910390fd5b5060105490565b606060008054610af09061386c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1c9061386c565b8015610b695780601f10610b3e57610100808354040283529160200191610b69565b820191906000526020600020905b815481529060010190602001808311610b4c57829003601f168201915b5050505050905090565b6000610b7e82611e08565b610b9a5760405162461bcd60e51b8152600401610ad190613535565b506000908152600460205260409020546001600160a01b031690565b610bbe611e04565b6001600160a01b0316610bcf6114c0565b6001600160a01b031614610bf55760405162461bcd60e51b8152600401610ad190613581565b600d55565b6000610c0582611082565b9050806001600160a01b0316836001600160a01b03161415610c395760405162461bcd60e51b8152600401610ad190613687565b806001600160a01b0316610c4b611e04565b6001600160a01b03161480610c675750610c6781610995611e04565b610c835760405162461bcd60e51b8152600401610ad1906133a1565b610c8d8383611e25565b505050565b610c9a611e04565b6001600160a01b0316610cab6114c0565b6001600160a01b031614610cd15760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b03909116600090815260176020526040902055565b610cf5611e04565b6001600160a01b0316610d066114c0565b6001600160a01b031614610d2c5760405162461bcd60e51b8152600401610ad190613581565b601680546002919062ff0000191662010000835b0217905550565b600a5490565b610d55611e04565b6001600160a01b0316610d666114c0565b6001600160a01b031614610d8c5760405162461bcd60e51b8152600401610ad190613581565b600b55565b610d99611e04565b6001600160a01b0316610daa6114c0565b6001600160a01b031614610dd05760405162461bcd60e51b8152600401610ad190613581565b600855565b610ddd611e04565b6001600160a01b0316610dee6114c0565b6001600160a01b031614610e145760405162461bcd60e51b8152600401610ad190613581565b6016805461ff001916610100179055565b610e2d611e04565b6001600160a01b0316610e3e6114c0565b6001600160a01b031614610e645760405162461bcd60e51b8152600401610ad190613581565b601680546003919062ff000019166201000083610d40565b610e8d610e87611e04565b82611e93565b610ea95760405162461bcd60e51b8152600401610ad1906136fd565b610c8d838383611f18565b610ebc611e04565b6001600160a01b0316610ecd6114c0565b6001600160a01b031614610ef35760405162461bcd60e51b8152600401610ad190613581565b600c55565b610f00611e04565b6001600160a01b0316610f116114c0565b6001600160a01b031614610f375760405162461bcd60e51b8152600401610ad190613581565b60135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f71573d6000803e3d6000fd5b5050565b610c8d83838360405180602001604052806000815250611705565b60186020526000908152604090205481565b60085481565b60165460ff1681565b610fb9611e04565b6001600160a01b0316610fca6114c0565b6001600160a01b031614610ff05760405162461bcd60e51b8152600401610ad190613581565b601680546004919062ff000019166201000083610d40565b611010611e04565b6001600160a01b03166110216114c0565b6001600160a01b0316146110475760405162461bcd60e51b8152600401610ad190613581565b601654610100900460ff161561106f5760405162461bcd60e51b8152600401610ad190612e6c565b8051610f71906014906020840190612896565b6000818152600260205260408120546001600160a01b031680610a885760405162461bcd60e51b8152600401610ad190613448565b6110bf611e04565b6001600160a01b03166110d06114c0565b6001600160a01b0316146110f65760405162461bcd60e51b8152600401610ad190613581565b600755565b60006001600160a01b0382166111235760405162461bcd60e51b8152600401610ad1906133fe565b506001600160a01b031660009081526003602052604090205490565b611147611e04565b6001600160a01b03166111586114c0565b6001600160a01b03161461117e5760405162461bcd60e51b8152600401610ad190613581565b611188600061204b565b565b611192611e04565b6001600160a01b03166111a36114c0565b6001600160a01b0316146111c95760405162461bcd60e51b8152600401610ad190613581565b600a546009546111d983836137de565b11156111f75760405162461bcd60e51b8152600401610ad190613785565b82829050600a600082825461120c91906137de565b90915550600090505b828110156112765761126484848381811061124057634e487b7160e01b600052603260045260246000fd5b905060200201602081019061125591906129bc565b61125f83856137de565b61209d565b8061126e816138a7565b915050611215565b50505050565b600a5481565b61128a611e04565b6001600160a01b031661129b6114c0565b6001600160a01b0316146112c15760405162461bcd60e51b8152600401610ad190613581565b601680546001919062ff000019166201000083610d40565b601654610100900460ff1681565b600a54336000908152601760205260409020548211156113195760405162461bcd60e51b8152600401610ad190612fe5565b60095461132683836137de565b11156113445760405162461bcd60e51b8152600401610ad1906135e6565b3360009081526017602052604081208054849290611363908490613829565b909155505033600090815260186020526040812080548492906113879084906137de565b9250508190555081601060008282546113a091906137de565b9250508190555081600a60008282546113b991906137de565b90915550610f7190503382846120b7565b6113d2611e04565b6001600160a01b03166113e36114c0565b6001600160a01b0316146114095760405162461bcd60e51b8152600401610ad190613581565b600a5460095461141984836137de565b11156114375760405162461bcd60e51b8152600401610ad190613785565b82600a600082825461144991906137de565b90915550610c8d90508282856120b7565b611462611e04565b6001600160a01b03166114736114c0565b6001600160a01b0316146114995760405162461bcd60e51b8152600401610ad190613581565b601680546000919062ff000019166201000083610d40565b60165462010000900460ff1690565b6006546001600160a01b031690565b6114d7611e04565b6001600160a01b03166114e86114c0565b6001600160a01b03161461150e5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b0381166115345760405162461bcd60e51b8152600401610ad190613491565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60176020526000908152604090205481565b600d5481565b606060018054610af09061386c565b6001600160a01b031660009081526018602052604090205490565b60075481565b610f716115a9611e04565b83836120e2565b60165462010000900460ff1681565b6115c7611e04565b6001600160a01b03166115d86114c0565b6001600160a01b0316146115fe5760405162461bcd60e51b8152600401610ad190613581565b6016805460ff19166001179055565b6000811161162d5760405162461bcd60e51b8152600401610ad19061374e565b600a5460095481106116515760405162461bcd60e51b8152600401610ad1906135b6565b60095461165e83836137de565b111561167c5760405162461bcd60e51b8152600401610ad1906131e2565b600360165462010000900460ff1660058111156116a957634e487b7160e01b600052602160045260246000fd5b146116c65760405162461bcd60e51b8152600401610ad19061363a565b81600b546116d4919061380a565b3410156116f35760405162461bcd60e51b8152600401610ad190613236565b81600a60008282546113b991906137de565b611716611710611e04565b83611e93565b6117325760405162461bcd60e51b8152600401610ad1906136fd565b61127684848484612185565b611746611e04565b6001600160a01b03166117576114c0565b6001600160a01b03161461177d5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b0381166117a35760405162461bcd60e51b8152600401610ad190613491565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60165460609060ff1661186457601580546117df9061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461180b9061386c565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050610a8b565b6000601480546118739061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461189f9061386c565b80156118ec5780601f106118c1576101008083540402835291602001916118ec565b820191906000526020600020905b8154815290600101906020018083116118cf57829003601f168201915b505050505090506000815111611911576040518060200160405280600081525061193c565b8061191b846121b8565b60405160200161192c929190612d10565b6040516020818303038152906040525b9392505050565b600083116119635760405162461bcd60e51b8152600401610ad1906136c8565b600160165462010000900460ff16600581111561199057634e487b7160e01b600052602160045260246000fd5b146119ad5760405162461bcd60e51b8152600401610ad190612f42565b601254604080516020601f85018190048102820181019092528381526119f7926001600160a01b03169185908590819084018382808284376000920191909152506122d392505050565b611a135760405162461bcd60e51b8152600401610ad19061330d565b60075483600f54611a2491906137de565b1115611a425760405162461bcd60e51b8152600401610ad190613176565b82600d54611a50919061380a565b341015611a6f5760405162461bcd60e51b8152600401610ad190613236565b82600f6000828254611a8191906137de565b9250508190555082600a6000828254611a9a91906137de565b92505081905550610c8d3384600a54611ab39190613829565b856120b7565b600e5481565b60095481565b600f5481565b611ad3611e04565b6001600160a01b0316611ae46114c0565b6001600160a01b031614611b0a5760405162461bcd60e51b8152600401610ad190613581565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b611b64611e04565b6001600160a01b0316611b756114c0565b6001600160a01b031614611b9b5760405162461bcd60e51b8152600401610ad190613581565b600a54600954611bab83836137de565b11156116f35760405162461bcd60e51b8152600401610ad190613785565b611bd1611e04565b6001600160a01b0316611be26114c0565b6001600160a01b031614611c085760405162461bcd60e51b8152600401610ad190613581565b8051610f71906015906020840190612896565b611c23611e04565b6001600160a01b0316611c346114c0565b6001600160a01b031614611c5a5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b038116611c805760405162461bcd60e51b8152600401610ad190612f9f565b611c898161204b565b50565b600b5481565b6001600160a01b031660009081526017602052604090205490565b60008311611ccd5760405162461bcd60e51b8152600401610ad1906136c8565b601154604080516020601f8501819004810282018101909252838152611d17926001600160a01b03169185908590819084018382808284376000920191909152506122d392505050565b611d335760405162461bcd60e51b8152600401610ad19061330d565b600260165462010000900460ff166005811115611d6057634e487b7160e01b600052602160045260246000fd5b14611d7d5760405162461bcd60e51b8152600401610ad1906130b2565b60085483600e54611d8e91906137de565b1115611dac5760405162461bcd60e51b8152600401610ad190613344565b82600c54611dba919061380a565b341015611dd95760405162461bcd60e51b8152600401610ad190613236565b82600e6000828254611a8191906137de565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e5a82611082565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e9e82611e08565b611eba5760405162461bcd60e51b8152600401610ad1906132c1565b6000611ec583611082565b9050806001600160a01b0316846001600160a01b03161480611f005750836001600160a01b0316611ef584610b73565b6001600160a01b0316145b80611f105750611f108185611b2c565b949350505050565b826001600160a01b0316611f2b82611082565b6001600160a01b031614611f515760405162461bcd60e51b8152600401610ad190613036565b6001600160a01b038216611f775760405162461bcd60e51b8152600401610ad1906130fb565b611f82838383610c8d565b611f8d600082611e25565b6001600160a01b0383166000908152600360205260408120805460019290611fb6908490613829565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe49084906137de565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610c8d838383610c8d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610f71828260405180602001604052806000815250612348565b60005b81811015611276576120d08461125f83866137de565b806120da816138a7565b9150506120ba565b816001600160a01b0316836001600160a01b031614156121145760405162461bcd60e51b8152600401610ad19061313f565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612178908590612dd1565b60405180910390a3505050565b612190848484611f18565b61219c8484848461237b565b6112765760405162461bcd60e51b8152600401610ad190612ef0565b6060816121dd57506040805180820190915260018152600360fc1b6020820152610a8b565b8160005b811561220757806121f1816138a7565b91506122009050600a836137f6565b91506121e1565b60008167ffffffffffffffff81111561223057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561225a576020820181803683370190505b5090505b8415611f105761226f600183613829565b915061227c600a866138c2565b6122879060306137de565b60f81b8183815181106122aa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122cc600a866137f6565b945061225e565b60008030336040516020016122e9929190612ce9565b60405160208183030381529060405280519060200120905060006123168461231084612496565b906124c6565b9050806001600160a01b0316856001600160a01b0316141561233d57600192505050611b56565b600092505050611b56565b61235283836124ea565b61235f600084848461237b565b610c8d5760405162461bcd60e51b8152600401610ad190612ef0565b600061238f846001600160a01b03166125d1565b1561248b57836001600160a01b031663150b7a026123ab611e04565b8786866040518563ffffffff1660e01b81526004016123cd9493929190612d94565b602060405180830381600087803b1580156123e757600080fd5b505af1925050508015612417575060408051601f3d908101601f1916820190925261241491810190612baa565b60015b612471573d808015612445576040519150601f19603f3d011682016040523d82523d6000602084013e61244a565b606091505b5080516124695760405162461bcd60e51b8152600401610ad190612ef0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f10565b506001949350505050565b6000816040516020016124a99190612d4f565b604051602081830303815290604052805190602001209050919050565b60008060006124d585856125e0565b915091506124e281612650565b509392505050565b6001600160a01b0382166125105760405162461bcd60e51b8152600401610ad190613500565b61251981611e08565b156125365760405162461bcd60e51b8152600401610ad19061307b565b61254260008383610c8d565b6001600160a01b038216600090815260036020526040812080546001929061256b9084906137de565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f7160008383610c8d565b6001600160a01b03163b151590565b6000808251604114156126175760208301516040840151606085015160001a61260b8782858561277d565b94509450505050612649565b825160401415612641576020830151604084015161263686838361285d565b935093505050612649565b506000905060025b9250929050565b600081600481111561267257634e487b7160e01b600052602160045260246000fd5b141561267d57611c89565b600181600481111561269f57634e487b7160e01b600052602160045260246000fd5b14156126bd5760405162461bcd60e51b8152600401610ad190612e35565b60028160048111156126df57634e487b7160e01b600052602160045260246000fd5b14156126fd5760405162461bcd60e51b8152600401610ad190612eb9565b600381600481111561271f57634e487b7160e01b600052602160045260246000fd5b141561273d5760405162461bcd60e51b8152600401610ad19061327f565b600481600481111561275f57634e487b7160e01b600052602160045260246000fd5b1415611c895760405162461bcd60e51b8152600401610ad1906134be565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127b45750600090506003612854565b8460ff16601b141580156127cc57508460ff16601c14155b156127dd5750600090506004612854565b6000600187878787604051600081526020016040526040516128029493929190612ddc565b6020604051602081039080840390855afa158015612824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661284d57600060019250925050612854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161287a60ff86901c601b6137de565b90506128888782888561277d565b935093505050935093915050565b8280546128a29061386c565b90600052602060002090601f0160209004810192826128c4576000855561290a565b82601f106128dd57805160ff191683800117855561290a565b8280016001018555821561290a579182015b8281111561290a5782518255916020019190600101906128ef565b5061291692915061291a565b5090565b5b80821115612916576000815560010161291b565b600067ffffffffffffffff8084111561294a5761294a613902565b604051601f8501601f19908116603f0116810190828211818310171561297257612972613902565b8160405280935085815286868601111561298b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610a8b57600080fd5b6000602082840312156129cd578081fd5b61193c826129a5565b600080604083850312156129e8578081fd5b6129f1836129a5565b91506129ff602084016129a5565b90509250929050565b600080600060608486031215612a1c578081fd5b612a25846129a5565b9250612a33602085016129a5565b9150604084013590509250925092565b60008060008060808587031215612a58578081fd5b612a61856129a5565b9350612a6f602086016129a5565b925060408501359150606085013567ffffffffffffffff811115612a91578182fd5b8501601f81018713612aa1578182fd5b612ab08782356020840161292f565b91505092959194509250565b60008060408385031215612ace578182fd5b612ad7836129a5565b915060208301358015158114612aeb578182fd5b809150509250929050565b60008060408385031215612b08578182fd5b612b11836129a5565b946020939093013593505050565b60008060208385031215612b31578182fd5b823567ffffffffffffffff80821115612b48578384fd5b818501915085601f830112612b5b578384fd5b813581811115612b69578485fd5b8660208083028501011115612b7c578485fd5b60209290920196919550909350505050565b600060208284031215612b9f578081fd5b813561193c81613918565b600060208284031215612bbb578081fd5b815161193c81613918565b600060208284031215612bd7578081fd5b813567ffffffffffffffff811115612bed578182fd5b8201601f81018413612bfd578182fd5b611f108482356020840161292f565b600060208284031215612c1d578081fd5b5035919050565b60008060408385031215612c36578182fd5b823591506129ff602084016129a5565b600080600060408486031215612c5a578283fd5b83359250602084013567ffffffffffffffff80821115612c78578384fd5b818601915086601f830112612c8b578384fd5b813581811115612c99578485fd5b876020828501011115612caa578485fd5b6020830194508093505050509250925092565b60008151808452612cd5816020860160208601613840565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b60008351612d22818460208801613840565b835190830190612d36818360208801613840565b64173539b7b760d91b9101908152600501949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc790830184612cbd565b9695505050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160068310612e1c57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020825261193c6020830184612cbd565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252602d908201527f4261736520555249206368616e676520686173206265656e2064697361626c6560408201526c64207065726d616e656e746c7960981b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4e61667479416e67656c733a204578636c75736976652070726573616c65206860408201527f6173206e6f74206265656e207374617274656420796574210000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526031908201527f596f7520646f6e742068617665207065726d6973696f6e20746f20667265652060408201527036b4b73a103a3430ba1030b6b7bab73a1760791b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526029908201527f4e61667479416e67656c733a2050726573616c6520686173206e6f742073746160408201526872746564207965742160b81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526046908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527f6565647320746865206d6178206578636c75736976652070726573616c6520736060820152653ab838363c9760d11b608082015260a00190565b60208082526034908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527332b2b239903a34329036b0bc1039bab838363c9760611b606082015260800190565b60208082526029908201527f4e61667479416e67656c733a20496e737566696369656e742045544820616d6f6040820152683ab73a1039b2b73a1760b91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601b908201527f5349474e41545552455f56414c49444154494f4e5f4641494c45440000000000604082015260600190565b6020808252603b908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527f6565647320746865206d61782070726573616c6520737570706c790000000000606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526013908201527243414e2754205055542030204144445245535360681b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152754e61667479416e67656c733a20536f6c64206f75742160501b604082015260600190565b60208082526034908201527f4e61667479416e67656c733a204d696e7420746f6f206c617267652c20657863604082015273656564696e6720746865206d6178537570706c7960601b606082015260800190565b6020808252602d908201527f4e61667479416e67656c733a205075626c69632073616c6520686173206e6f7460408201526c1039ba30b93a32b2103cb2ba1760991b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252818101527f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f596f75206d757374206d696e74206174206c65617374206f6e65204e46542e00604082015260600190565b60208082526030908201527f4e61667479416e67656c733a20596f752063616e2774206d696e74206d6f726560408201526f207468616e206d617820737570706c7960801b606082015260800190565b90815260200190565b600082198211156137f1576137f16138d6565b500190565b600082613805576138056138ec565b500490565b6000816000190483118215151615613824576138246138d6565b500290565b60008282101561383b5761383b6138d6565b500390565b60005b8381101561385b578181015183820152602001613843565b838111156112765750506000910152565b60028104600182168061388057607f821691505b602082108114156138a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138bb576138bb6138d6565b5060010190565b6000826138d1576138d16138ec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c8957600080fdfea26469706673582212203cc3ab4e1a3ce9af846bcba9892dad4b9d126525ca9286abd6266e0c6cabd10264736f6c63430008010033697066733a2f2f516d504c6d4a736e6941533842714a6f71717934655555376379384b796f716447797331396e665179336e6b6455

Deployed Bytecode

0x6080604052600436106103a15760003560e01c80637b082610116101e7578063b3ab66b01161010d578063deaa59df116100a0578063f2fde38b1161006f578063f2fde38b146109da578063f51f96dd146109fa578063fb7ddd0414610a0f578063fd24a85414610a2f576103a1565b8063deaa59df1461095a578063e985e9c51461097a578063f19e75d41461099a578063f2c4ce1e146109ba576103a1565b8063cc081c46116100dc578063cc081c4614610908578063cde27a351461091b578063d5abeb0114610930578063dac69bcc14610945576103a1565b8063b3ab66b014610895578063b88d4fde146108a8578063bdb9f28d146108c8578063c87b56dd146108e8576103a1565b8063916d31ff116101855780639e17b440116101545780639e17b44014610836578063a22cb4651461084b578063a33441251461086b578063a475b5dd14610880576103a1565b8063916d31ff146107cc57806393676270146107ec57806395d89b411461080157806397b9bd0814610816576103a1565b8063847e2101116101c1578063847e2101146107605780638c3c4b34146107755780638da5cb5b146107975780638f48676a146107ac576103a1565b80637b0826101461070b5780637c928fe9146107205780638074be9814610740576103a1565b80633549345e116102cc57806355f804b31161026a578063715018a611610239578063715018a6146106ac578063729ad39e146106c1578063771282f6146106e15780637a10eb7a146106f6576103a1565b806355f804b31461062c5780636352211e1461064c57806367dc2fbb1461066c57806370a082311461068c576103a1565b80634c709163116102a65780634c709163146105cd5780634d4c4e99146105ed578063518302271461060257806355367ba914610617576103a1565b80633549345e146105785780633ccfd60b1461059857806342842e0e146105ad576103a1565b80630b2af42e116103445780631bbc1afa116103135780631bbc1afa1461050e5780631c03ceb51461052e5780631f2898c31461054357806323b872dd14610558576103a1565b80630b2af42e146104a457806315c316fc146104c457806318160ddd146104d95780631919fed7146104ee576103a1565b806306fdde031161038057806306fdde0314610413578063081812fc1461043557806308ea29ad14610462578063095ea7b314610484576103a1565b80620e7fa8146103a657806301ffc9a7146103d1578063033bea20146103fe575b600080fd5b3480156103b257600080fd5b506103bb610a42565b6040516103c891906137d5565b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004612b8e565b610a48565b6040516103c89190612dd1565b34801561040a57600080fd5b506103bb610a90565b34801561041f57600080fd5b50610428610ae1565b6040516103c89190612e22565b34801561044157600080fd5b50610455610450366004612c0c565b610b73565b6040516103c89190612d80565b34801561046e57600080fd5b5061048261047d366004612c0c565b610bb6565b005b34801561049057600080fd5b5061048261049f366004612af6565b610bfa565b3480156104b057600080fd5b506104826104bf366004612af6565b610c92565b3480156104d057600080fd5b50610482610ced565b3480156104e557600080fd5b506103bb610d47565b3480156104fa57600080fd5b50610482610509366004612c0c565b610d4d565b34801561051a57600080fd5b50610482610529366004612c0c565b610d91565b34801561053a57600080fd5b50610482610dd5565b34801561054f57600080fd5b50610482610e25565b34801561056457600080fd5b50610482610573366004612a08565b610e7c565b34801561058457600080fd5b50610482610593366004612c0c565b610eb4565b3480156105a457600080fd5b50610482610ef8565b3480156105b957600080fd5b506104826105c8366004612a08565b610f75565b3480156105d957600080fd5b506103bb6105e83660046129bc565b610f90565b3480156105f957600080fd5b506103bb610fa2565b34801561060e57600080fd5b506103f1610fa8565b34801561062357600080fd5b50610482610fb1565b34801561063857600080fd5b50610482610647366004612bc6565b611008565b34801561065857600080fd5b50610455610667366004612c0c565b611082565b34801561067857600080fd5b50610482610687366004612c0c565b6110b7565b34801561069857600080fd5b506103bb6106a73660046129bc565b6110fb565b3480156106b857600080fd5b5061048261113f565b3480156106cd57600080fd5b506104826106dc366004612b1f565b61118a565b3480156106ed57600080fd5b506103bb61127c565b34801561070257600080fd5b50610482611282565b34801561071757600080fd5b506103f16112d9565b34801561072c57600080fd5b5061048261073b366004612c0c565b6112e7565b34801561074c57600080fd5b5061048261075b366004612c24565b6113ca565b34801561076c57600080fd5b5061048261145a565b34801561078157600080fd5b5061078a6114b1565b6040516103c89190612dfa565b3480156107a357600080fd5b506104556114c0565b3480156107b857600080fd5b506104826107c73660046129bc565b6114cf565b3480156107d857600080fd5b506103bb6107e73660046129bc565b611556565b3480156107f857600080fd5b506103bb611568565b34801561080d57600080fd5b5061042861156e565b34801561082257600080fd5b506103bb6108313660046129bc565b61157d565b34801561084257600080fd5b506103bb611598565b34801561085757600080fd5b50610482610866366004612abc565b61159e565b34801561087757600080fd5b5061078a6115b0565b34801561088c57600080fd5b506104826115bf565b6104826108a3366004612c0c565b61160d565b3480156108b457600080fd5b506104826108c3366004612a43565b611705565b3480156108d457600080fd5b506104826108e33660046129bc565b61173e565b3480156108f457600080fd5b50610428610903366004612c0c565b6117c5565b610482610916366004612c46565b611943565b34801561092757600080fd5b506103bb611ab9565b34801561093c57600080fd5b506103bb611abf565b34801561095157600080fd5b506103bb611ac5565b34801561096657600080fd5b506104826109753660046129bc565b611acb565b34801561098657600080fd5b506103f16109953660046129d6565b611b2c565b3480156109a657600080fd5b506104826109b5366004612c0c565b611b5c565b3480156109c657600080fd5b506104826109d5366004612bc6565b611bc9565b3480156109e657600080fd5b506104826109f53660046129bc565b611c1b565b348015610a0657600080fd5b506103bb611c8c565b348015610a1b57600080fd5b506103bb610a2a3660046129bc565b611c92565b610482610a3d366004612c46565b611cad565b600c5481565b60006001600160e01b031982166380ac58cd60e01b1480610a7957506001600160e01b03198216635b5e139f60e01b145b80610a885750610a8882611deb565b90505b919050565b6000610a9a611e04565b6001600160a01b0316610aab6114c0565b6001600160a01b031614610ada5760405162461bcd60e51b8152600401610ad190613581565b60405180910390fd5b5060105490565b606060008054610af09061386c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1c9061386c565b8015610b695780601f10610b3e57610100808354040283529160200191610b69565b820191906000526020600020905b815481529060010190602001808311610b4c57829003601f168201915b5050505050905090565b6000610b7e82611e08565b610b9a5760405162461bcd60e51b8152600401610ad190613535565b506000908152600460205260409020546001600160a01b031690565b610bbe611e04565b6001600160a01b0316610bcf6114c0565b6001600160a01b031614610bf55760405162461bcd60e51b8152600401610ad190613581565b600d55565b6000610c0582611082565b9050806001600160a01b0316836001600160a01b03161415610c395760405162461bcd60e51b8152600401610ad190613687565b806001600160a01b0316610c4b611e04565b6001600160a01b03161480610c675750610c6781610995611e04565b610c835760405162461bcd60e51b8152600401610ad1906133a1565b610c8d8383611e25565b505050565b610c9a611e04565b6001600160a01b0316610cab6114c0565b6001600160a01b031614610cd15760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b03909116600090815260176020526040902055565b610cf5611e04565b6001600160a01b0316610d066114c0565b6001600160a01b031614610d2c5760405162461bcd60e51b8152600401610ad190613581565b601680546002919062ff0000191662010000835b0217905550565b600a5490565b610d55611e04565b6001600160a01b0316610d666114c0565b6001600160a01b031614610d8c5760405162461bcd60e51b8152600401610ad190613581565b600b55565b610d99611e04565b6001600160a01b0316610daa6114c0565b6001600160a01b031614610dd05760405162461bcd60e51b8152600401610ad190613581565b600855565b610ddd611e04565b6001600160a01b0316610dee6114c0565b6001600160a01b031614610e145760405162461bcd60e51b8152600401610ad190613581565b6016805461ff001916610100179055565b610e2d611e04565b6001600160a01b0316610e3e6114c0565b6001600160a01b031614610e645760405162461bcd60e51b8152600401610ad190613581565b601680546003919062ff000019166201000083610d40565b610e8d610e87611e04565b82611e93565b610ea95760405162461bcd60e51b8152600401610ad1906136fd565b610c8d838383611f18565b610ebc611e04565b6001600160a01b0316610ecd6114c0565b6001600160a01b031614610ef35760405162461bcd60e51b8152600401610ad190613581565b600c55565b610f00611e04565b6001600160a01b0316610f116114c0565b6001600160a01b031614610f375760405162461bcd60e51b8152600401610ad190613581565b60135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f71573d6000803e3d6000fd5b5050565b610c8d83838360405180602001604052806000815250611705565b60186020526000908152604090205481565b60085481565b60165460ff1681565b610fb9611e04565b6001600160a01b0316610fca6114c0565b6001600160a01b031614610ff05760405162461bcd60e51b8152600401610ad190613581565b601680546004919062ff000019166201000083610d40565b611010611e04565b6001600160a01b03166110216114c0565b6001600160a01b0316146110475760405162461bcd60e51b8152600401610ad190613581565b601654610100900460ff161561106f5760405162461bcd60e51b8152600401610ad190612e6c565b8051610f71906014906020840190612896565b6000818152600260205260408120546001600160a01b031680610a885760405162461bcd60e51b8152600401610ad190613448565b6110bf611e04565b6001600160a01b03166110d06114c0565b6001600160a01b0316146110f65760405162461bcd60e51b8152600401610ad190613581565b600755565b60006001600160a01b0382166111235760405162461bcd60e51b8152600401610ad1906133fe565b506001600160a01b031660009081526003602052604090205490565b611147611e04565b6001600160a01b03166111586114c0565b6001600160a01b03161461117e5760405162461bcd60e51b8152600401610ad190613581565b611188600061204b565b565b611192611e04565b6001600160a01b03166111a36114c0565b6001600160a01b0316146111c95760405162461bcd60e51b8152600401610ad190613581565b600a546009546111d983836137de565b11156111f75760405162461bcd60e51b8152600401610ad190613785565b82829050600a600082825461120c91906137de565b90915550600090505b828110156112765761126484848381811061124057634e487b7160e01b600052603260045260246000fd5b905060200201602081019061125591906129bc565b61125f83856137de565b61209d565b8061126e816138a7565b915050611215565b50505050565b600a5481565b61128a611e04565b6001600160a01b031661129b6114c0565b6001600160a01b0316146112c15760405162461bcd60e51b8152600401610ad190613581565b601680546001919062ff000019166201000083610d40565b601654610100900460ff1681565b600a54336000908152601760205260409020548211156113195760405162461bcd60e51b8152600401610ad190612fe5565b60095461132683836137de565b11156113445760405162461bcd60e51b8152600401610ad1906135e6565b3360009081526017602052604081208054849290611363908490613829565b909155505033600090815260186020526040812080548492906113879084906137de565b9250508190555081601060008282546113a091906137de565b9250508190555081600a60008282546113b991906137de565b90915550610f7190503382846120b7565b6113d2611e04565b6001600160a01b03166113e36114c0565b6001600160a01b0316146114095760405162461bcd60e51b8152600401610ad190613581565b600a5460095461141984836137de565b11156114375760405162461bcd60e51b8152600401610ad190613785565b82600a600082825461144991906137de565b90915550610c8d90508282856120b7565b611462611e04565b6001600160a01b03166114736114c0565b6001600160a01b0316146114995760405162461bcd60e51b8152600401610ad190613581565b601680546000919062ff000019166201000083610d40565b60165462010000900460ff1690565b6006546001600160a01b031690565b6114d7611e04565b6001600160a01b03166114e86114c0565b6001600160a01b03161461150e5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b0381166115345760405162461bcd60e51b8152600401610ad190613491565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60176020526000908152604090205481565b600d5481565b606060018054610af09061386c565b6001600160a01b031660009081526018602052604090205490565b60075481565b610f716115a9611e04565b83836120e2565b60165462010000900460ff1681565b6115c7611e04565b6001600160a01b03166115d86114c0565b6001600160a01b0316146115fe5760405162461bcd60e51b8152600401610ad190613581565b6016805460ff19166001179055565b6000811161162d5760405162461bcd60e51b8152600401610ad19061374e565b600a5460095481106116515760405162461bcd60e51b8152600401610ad1906135b6565b60095461165e83836137de565b111561167c5760405162461bcd60e51b8152600401610ad1906131e2565b600360165462010000900460ff1660058111156116a957634e487b7160e01b600052602160045260246000fd5b146116c65760405162461bcd60e51b8152600401610ad19061363a565b81600b546116d4919061380a565b3410156116f35760405162461bcd60e51b8152600401610ad190613236565b81600a60008282546113b991906137de565b611716611710611e04565b83611e93565b6117325760405162461bcd60e51b8152600401610ad1906136fd565b61127684848484612185565b611746611e04565b6001600160a01b03166117576114c0565b6001600160a01b03161461177d5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b0381166117a35760405162461bcd60e51b8152600401610ad190613491565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60165460609060ff1661186457601580546117df9061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461180b9061386c565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050610a8b565b6000601480546118739061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461189f9061386c565b80156118ec5780601f106118c1576101008083540402835291602001916118ec565b820191906000526020600020905b8154815290600101906020018083116118cf57829003601f168201915b505050505090506000815111611911576040518060200160405280600081525061193c565b8061191b846121b8565b60405160200161192c929190612d10565b6040516020818303038152906040525b9392505050565b600083116119635760405162461bcd60e51b8152600401610ad1906136c8565b600160165462010000900460ff16600581111561199057634e487b7160e01b600052602160045260246000fd5b146119ad5760405162461bcd60e51b8152600401610ad190612f42565b601254604080516020601f85018190048102820181019092528381526119f7926001600160a01b03169185908590819084018382808284376000920191909152506122d392505050565b611a135760405162461bcd60e51b8152600401610ad19061330d565b60075483600f54611a2491906137de565b1115611a425760405162461bcd60e51b8152600401610ad190613176565b82600d54611a50919061380a565b341015611a6f5760405162461bcd60e51b8152600401610ad190613236565b82600f6000828254611a8191906137de565b9250508190555082600a6000828254611a9a91906137de565b92505081905550610c8d3384600a54611ab39190613829565b856120b7565b600e5481565b60095481565b600f5481565b611ad3611e04565b6001600160a01b0316611ae46114c0565b6001600160a01b031614611b0a5760405162461bcd60e51b8152600401610ad190613581565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b611b64611e04565b6001600160a01b0316611b756114c0565b6001600160a01b031614611b9b5760405162461bcd60e51b8152600401610ad190613581565b600a54600954611bab83836137de565b11156116f35760405162461bcd60e51b8152600401610ad190613785565b611bd1611e04565b6001600160a01b0316611be26114c0565b6001600160a01b031614611c085760405162461bcd60e51b8152600401610ad190613581565b8051610f71906015906020840190612896565b611c23611e04565b6001600160a01b0316611c346114c0565b6001600160a01b031614611c5a5760405162461bcd60e51b8152600401610ad190613581565b6001600160a01b038116611c805760405162461bcd60e51b8152600401610ad190612f9f565b611c898161204b565b50565b600b5481565b6001600160a01b031660009081526017602052604090205490565b60008311611ccd5760405162461bcd60e51b8152600401610ad1906136c8565b601154604080516020601f8501819004810282018101909252838152611d17926001600160a01b03169185908590819084018382808284376000920191909152506122d392505050565b611d335760405162461bcd60e51b8152600401610ad19061330d565b600260165462010000900460ff166005811115611d6057634e487b7160e01b600052602160045260246000fd5b14611d7d5760405162461bcd60e51b8152600401610ad1906130b2565b60085483600e54611d8e91906137de565b1115611dac5760405162461bcd60e51b8152600401610ad190613344565b82600c54611dba919061380a565b341015611dd95760405162461bcd60e51b8152600401610ad190613236565b82600e6000828254611a8191906137de565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e5a82611082565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e9e82611e08565b611eba5760405162461bcd60e51b8152600401610ad1906132c1565b6000611ec583611082565b9050806001600160a01b0316846001600160a01b03161480611f005750836001600160a01b0316611ef584610b73565b6001600160a01b0316145b80611f105750611f108185611b2c565b949350505050565b826001600160a01b0316611f2b82611082565b6001600160a01b031614611f515760405162461bcd60e51b8152600401610ad190613036565b6001600160a01b038216611f775760405162461bcd60e51b8152600401610ad1906130fb565b611f82838383610c8d565b611f8d600082611e25565b6001600160a01b0383166000908152600360205260408120805460019290611fb6908490613829565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe49084906137de565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610c8d838383610c8d565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610f71828260405180602001604052806000815250612348565b60005b81811015611276576120d08461125f83866137de565b806120da816138a7565b9150506120ba565b816001600160a01b0316836001600160a01b031614156121145760405162461bcd60e51b8152600401610ad19061313f565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612178908590612dd1565b60405180910390a3505050565b612190848484611f18565b61219c8484848461237b565b6112765760405162461bcd60e51b8152600401610ad190612ef0565b6060816121dd57506040805180820190915260018152600360fc1b6020820152610a8b565b8160005b811561220757806121f1816138a7565b91506122009050600a836137f6565b91506121e1565b60008167ffffffffffffffff81111561223057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561225a576020820181803683370190505b5090505b8415611f105761226f600183613829565b915061227c600a866138c2565b6122879060306137de565b60f81b8183815181106122aa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122cc600a866137f6565b945061225e565b60008030336040516020016122e9929190612ce9565b60405160208183030381529060405280519060200120905060006123168461231084612496565b906124c6565b9050806001600160a01b0316856001600160a01b0316141561233d57600192505050611b56565b600092505050611b56565b61235283836124ea565b61235f600084848461237b565b610c8d5760405162461bcd60e51b8152600401610ad190612ef0565b600061238f846001600160a01b03166125d1565b1561248b57836001600160a01b031663150b7a026123ab611e04565b8786866040518563ffffffff1660e01b81526004016123cd9493929190612d94565b602060405180830381600087803b1580156123e757600080fd5b505af1925050508015612417575060408051601f3d908101601f1916820190925261241491810190612baa565b60015b612471573d808015612445576040519150601f19603f3d011682016040523d82523d6000602084013e61244a565b606091505b5080516124695760405162461bcd60e51b8152600401610ad190612ef0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f10565b506001949350505050565b6000816040516020016124a99190612d4f565b604051602081830303815290604052805190602001209050919050565b60008060006124d585856125e0565b915091506124e281612650565b509392505050565b6001600160a01b0382166125105760405162461bcd60e51b8152600401610ad190613500565b61251981611e08565b156125365760405162461bcd60e51b8152600401610ad19061307b565b61254260008383610c8d565b6001600160a01b038216600090815260036020526040812080546001929061256b9084906137de565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f7160008383610c8d565b6001600160a01b03163b151590565b6000808251604114156126175760208301516040840151606085015160001a61260b8782858561277d565b94509450505050612649565b825160401415612641576020830151604084015161263686838361285d565b935093505050612649565b506000905060025b9250929050565b600081600481111561267257634e487b7160e01b600052602160045260246000fd5b141561267d57611c89565b600181600481111561269f57634e487b7160e01b600052602160045260246000fd5b14156126bd5760405162461bcd60e51b8152600401610ad190612e35565b60028160048111156126df57634e487b7160e01b600052602160045260246000fd5b14156126fd5760405162461bcd60e51b8152600401610ad190612eb9565b600381600481111561271f57634e487b7160e01b600052602160045260246000fd5b141561273d5760405162461bcd60e51b8152600401610ad19061327f565b600481600481111561275f57634e487b7160e01b600052602160045260246000fd5b1415611c895760405162461bcd60e51b8152600401610ad1906134be565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127b45750600090506003612854565b8460ff16601b141580156127cc57508460ff16601c14155b156127dd5750600090506004612854565b6000600187878787604051600081526020016040526040516128029493929190612ddc565b6020604051602081039080840390855afa158015612824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661284d57600060019250925050612854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161287a60ff86901c601b6137de565b90506128888782888561277d565b935093505050935093915050565b8280546128a29061386c565b90600052602060002090601f0160209004810192826128c4576000855561290a565b82601f106128dd57805160ff191683800117855561290a565b8280016001018555821561290a579182015b8281111561290a5782518255916020019190600101906128ef565b5061291692915061291a565b5090565b5b80821115612916576000815560010161291b565b600067ffffffffffffffff8084111561294a5761294a613902565b604051601f8501601f19908116603f0116810190828211818310171561297257612972613902565b8160405280935085815286868601111561298b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610a8b57600080fd5b6000602082840312156129cd578081fd5b61193c826129a5565b600080604083850312156129e8578081fd5b6129f1836129a5565b91506129ff602084016129a5565b90509250929050565b600080600060608486031215612a1c578081fd5b612a25846129a5565b9250612a33602085016129a5565b9150604084013590509250925092565b60008060008060808587031215612a58578081fd5b612a61856129a5565b9350612a6f602086016129a5565b925060408501359150606085013567ffffffffffffffff811115612a91578182fd5b8501601f81018713612aa1578182fd5b612ab08782356020840161292f565b91505092959194509250565b60008060408385031215612ace578182fd5b612ad7836129a5565b915060208301358015158114612aeb578182fd5b809150509250929050565b60008060408385031215612b08578182fd5b612b11836129a5565b946020939093013593505050565b60008060208385031215612b31578182fd5b823567ffffffffffffffff80821115612b48578384fd5b818501915085601f830112612b5b578384fd5b813581811115612b69578485fd5b8660208083028501011115612b7c578485fd5b60209290920196919550909350505050565b600060208284031215612b9f578081fd5b813561193c81613918565b600060208284031215612bbb578081fd5b815161193c81613918565b600060208284031215612bd7578081fd5b813567ffffffffffffffff811115612bed578182fd5b8201601f81018413612bfd578182fd5b611f108482356020840161292f565b600060208284031215612c1d578081fd5b5035919050565b60008060408385031215612c36578182fd5b823591506129ff602084016129a5565b600080600060408486031215612c5a578283fd5b83359250602084013567ffffffffffffffff80821115612c78578384fd5b818601915086601f830112612c8b578384fd5b813581811115612c99578485fd5b876020828501011115612caa578485fd5b6020830194508093505050509250925092565b60008151808452612cd5816020860160208601613840565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b60008351612d22818460208801613840565b835190830190612d36818360208801613840565b64173539b7b760d91b9101908152600501949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc790830184612cbd565b9695505050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160068310612e1c57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020825261193c6020830184612cbd565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252602d908201527f4261736520555249206368616e676520686173206265656e2064697361626c6560408201526c64207065726d616e656e746c7960981b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4e61667479416e67656c733a204578636c75736976652070726573616c65206860408201527f6173206e6f74206265656e207374617274656420796574210000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526031908201527f596f7520646f6e742068617665207065726d6973696f6e20746f20667265652060408201527036b4b73a103a3430ba1030b6b7bab73a1760791b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526029908201527f4e61667479416e67656c733a2050726573616c6520686173206e6f742073746160408201526872746564207965742160b81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526046908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527f6565647320746865206d6178206578636c75736976652070726573616c6520736060820152653ab838363c9760d11b608082015260a00190565b60208082526034908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527332b2b239903a34329036b0bc1039bab838363c9760611b606082015260800190565b60208082526029908201527f4e61667479416e67656c733a20496e737566696369656e742045544820616d6f6040820152683ab73a1039b2b73a1760b91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601b908201527f5349474e41545552455f56414c49444154494f4e5f4641494c45440000000000604082015260600190565b6020808252603b908201527f4e61667479416e67656c733a2053656c656374656420616d6f756e742065786360408201527f6565647320746865206d61782070726573616c6520737570706c790000000000606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526013908201527243414e2754205055542030204144445245535360681b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152754e61667479416e67656c733a20536f6c64206f75742160501b604082015260600190565b60208082526034908201527f4e61667479416e67656c733a204d696e7420746f6f206c617267652c20657863604082015273656564696e6720746865206d6178537570706c7960601b606082015260800190565b6020808252602d908201527f4e61667479416e67656c733a205075626c69632073616c6520686173206e6f7460408201526c1039ba30b93a32b2103cb2ba1760991b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252818101527f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f596f75206d757374206d696e74206174206c65617374206f6e65204e46542e00604082015260600190565b60208082526030908201527f4e61667479416e67656c733a20596f752063616e2774206d696e74206d6f726560408201526f207468616e206d617820737570706c7960801b606082015260800190565b90815260200190565b600082198211156137f1576137f16138d6565b500190565b600082613805576138056138ec565b500490565b6000816000190483118215151615613824576138246138d6565b500290565b60008282101561383b5761383b6138d6565b500390565b60005b8381101561385b578181015183820152602001613843565b838111156112765750506000910152565b60028104600182168061388057607f821691505b602082108114156138a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138bb576138bb6138d6565b5060010190565b6000826138d1576138d16138ec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c8957600080fdfea26469706673582212203cc3ab4e1a3ce9af846bcba9892dad4b9d126525ca9286abd6266e0c6cabd10264736f6c63430008010033

Deployed Bytecode Sourcemap

48337:10051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48658:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35108:305;;;;;;;;;;-1:-1:-1;35108:305:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55652:100::-;;;;;;;;;;;;;:::i;36053:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37612:221::-;;;;;;;;;;-1:-1:-1;37612:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57730:108::-;;;;;;;;;;-1:-1:-1;57730:108:0;;;;;:::i;:::-;;:::i;:::-;;37135:411;;;;;;;;;;-1:-1:-1;37135:411:0;;;;;:::i;:::-;;:::i;57603:119::-;;;;;;;;;;-1:-1:-1;57603:119:0;;;;;:::i;:::-;;:::i;55968:95::-;;;;;;;;;;;;;:::i;50084:92::-;;;;;;;;;;;;;:::i;57385:98::-;;;;;;;;;;-1:-1:-1;57385:98:0;;;;;:::i;:::-;;:::i;56380:101::-;;;;;;;;;;-1:-1:-1;56380:101:0;;;;;:::i;:::-;;:::i;57846:73::-;;;;;;;;;;;;;:::i;56071:89::-;;;;;;;;;;;;;:::i;38362:339::-;;;;;;;;;;-1:-1:-1;38362:339:0;;;;;:::i;:::-;;:::i;57491:104::-;;;;;;;;;;-1:-1:-1;57491:104:0;;;;;:::i;:::-;;:::i;49800:157::-;;;;;;;;;;;;;:::i;38772:185::-;;;;;;;;;;-1:-1:-1;38772:185:0;;;;;:::i;:::-;;:::i;49586:46::-;;;;;;;;;;-1:-1:-1;49586:46:0;;;;;:::i;:::-;;:::i;48489:33::-;;;;;;;;;;;;;:::i;49278:28::-;;;;;;;;;;;;;:::i;56168:91::-;;;;;;;;;;;;;:::i;56700:195::-;;;;;;;;;;-1:-1:-1;56700:195:0;;;;;:::i;:::-;;:::i;35747:239::-;;;;;;;;;;-1:-1:-1;35747:239:0;;;;;:::i;:::-;;:::i;56267:105::-;;;;;;;;;;-1:-1:-1;56267:105:0;;;;;:::i;:::-;;:::i;35477:208::-;;;;;;;;;;-1:-1:-1;35477:208:0;;;;;:::i;:::-;;:::i;15729:103::-;;;;;;;;;;;;;:::i;55188:429::-;;;;;;;;;;-1:-1:-1;55188:429:0;;;;;:::i;:::-;;:::i;48573:32::-;;;;;;;;;;;;;:::i;55861:99::-;;;;;;;;;;;;;:::i;49313:30::-;;;;;;;;;;;;;:::i;51165:606::-;;;;;;;;;;-1:-1:-1;51165:606:0;;;;;:::i;:::-;;:::i;54499:345::-;;;;;;;;;;-1:-1:-1;54499:345:0;;;;;:::i;:::-;;:::i;55760:93::-;;;;;;;;;;;;;:::i;49980:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15078:87::-;;;;;;;;;;;;;:::i;57091:184::-;;;;;;;;;;-1:-1:-1;57091:184:0;;;;;:::i;:::-;;:::i;49530:49::-;;;;;;;;;;-1:-1:-1;49530:49:0;;;;;:::i;:::-;;:::i;48706:42::-;;;;;;;;;;;;;:::i;36222:104::-;;;;;;;;;;;;;:::i;50313:115::-;;;;;;;;;;-1:-1:-1;50313:115:0;;;;;:::i;:::-;;:::i;48448:34::-;;;;;;;;;;;;;:::i;37905:155::-;;;;;;;;;;-1:-1:-1;37905:155:0;;;;;:::i;:::-;;:::i;49491:30::-;;;;;;;;;;;;;:::i;56489:69::-;;;;;;;;;;;;;:::i;53776:715::-;;;;;;:::i;:::-;;:::i;39028:328::-;;;;;;;;;;-1:-1:-1;39028:328:0;;;;;:::i;:::-;;:::i;56903:180::-;;;;;;;;;;-1:-1:-1;56903:180:0;;;;;:::i;:::-;;:::i;57943:442::-;;;;;;;;;;-1:-1:-1;57943:442:0;;;;;:::i;:::-;;:::i;51812:991::-;;;;;;:::i;:::-;;:::i;48757:27::-;;;;;;;;;;;;;:::i;48535:31::-;;;;;;;;;;;;;:::i;48791:29::-;;;;;;;;;;;;;:::i;57283:94::-;;;;;;;;;;-1:-1:-1;57283:94:0;;;;;:::i;:::-;;:::i;38131:164::-;;;;;;;;;;-1:-1:-1;38131:164:0;;;;;:::i;:::-;;:::i;54852:328::-;;;;;;;;;;-1:-1:-1;54852:328:0;;;;;:::i;:::-;;:::i;56566:126::-;;;;;;;;;;-1:-1:-1;56566:126:0;;;;;:::i;:::-;;:::i;15987:201::-;;;;;;;;;;-1:-1:-1;15987:201:0;;;;;:::i;:::-;;:::i;48614:37::-;;;;;;;;;;;;;:::i;50184:121::-;;;;;;;;;;-1:-1:-1;50184:121:0;;;;;:::i;:::-;;:::i;52811:957::-;;;;;;:::i;:::-;;:::i;48658:41::-;;;;:::o;35108:305::-;35210:4;-1:-1:-1;;;;;;35247:40:0;;-1:-1:-1;;;35247:40:0;;:105;;-1:-1:-1;;;;;;;35304:48:0;;-1:-1:-1;;;35304:48:0;35247:105;:158;;;;35369:36;35393:11;35369:23;:36::i;:::-;35227:178;;35108:305;;;;:::o;55652:100::-;55708:7;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;55734:10:0::1;::::0;55652:100;:::o;36053:::-;36107:13;36140:5;36133:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36053:100;:::o;37612:221::-;37688:7;37716:16;37724:7;37716;:16::i;:::-;37708:73;;;;-1:-1:-1;;;37708:73:0;;;;;;;:::i;:::-;-1:-1:-1;37801:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37801:24:0;;37612:221::o;57730:108::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;57804:14:::1;:26:::0;57730:108::o;37135:411::-;37216:13;37232:23;37247:7;37232:14;:23::i;:::-;37216:39;;37280:5;-1:-1:-1;;;;;37274:11:0;:2;-1:-1:-1;;;;;37274:11:0;;;37266:57;;;;-1:-1:-1;;;37266:57:0;;;;;;;:::i;:::-;37374:5;-1:-1:-1;;;;;37358:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;37358:21:0;;:62;;;;37383:37;37400:5;37407:12;:10;:12::i;37383:37::-;37336:168;;;;-1:-1:-1;;;37336:168:0;;;;;;;:::i;:::-;37517:21;37526:2;37530:7;37517:8;:21::i;:::-;37135:411;;;:::o;57603:119::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57686:22:0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;:28;57603:119::o;55968:95::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56022:8:::1;:33:::0;;56033:22:::1;::::0;56022:8;-1:-1:-1;;56022:33:0::1;::::0;56033:22;56022:33:::1;;;;;;55968:95::o:0;50084:92::-;50155:13;;50084:92;:::o;57385:98::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;57454:9:::1;:21:::0;57385:98::o;56380:101::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56452:11:::1;:21:::0;56380:101::o;57846:73::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;57894:10:::1;:17:::0;;-1:-1:-1;;57894:17:0::1;;;::::0;;57846:73::o;56071:89::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56122:8:::1;:30:::0;;56133:19:::1;::::0;56122:8;-1:-1:-1;;56122:30:0::1;::::0;56133:19;56122:30:::1;::::0;38362:339;38557:41;38576:12;:10;:12::i;:::-;38590:7;38557:18;:41::i;:::-;38549:103;;;;-1:-1:-1;;;38549:103:0;;;;;;;:::i;:::-;38665:28;38675:4;38681:2;38685:7;38665:9;:28::i;57491:104::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;57563:12:::1;:24:::0;57491:104::o;49800:157::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;49920:6:::1;::::0;49911:38:::1;::::0;49867:23:::1;::::0;-1:-1:-1;;;;;49920:6:0::1;::::0;49911:38;::::1;;;::::0;49867:23;;49848:16:::1;49911:38:::0;49848:16;49911:38;49867:23;49920:6;49911:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;15369:1;49800:157::o:0;38772:185::-;38910:39;38927:4;38933:2;38937:7;38910:39;;;;;;;;;;;;:16;:39::i;49586:46::-;;;;;;;;;;;;;:::o;48489:33::-;;;;:::o;49278:28::-;;;;;;:::o;56168:91::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56219:8:::1;:32:::0;;56230:21:::1;::::0;56219:8;-1:-1:-1;;56219:32:0::1;::::0;56230:21;56219:32:::1;::::0;56700:195;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56784:10:::1;::::0;::::1;::::0;::::1;;;:19;56775:78;;;;-1:-1:-1::0;;;56775:78:0::1;;;;;;;:::i;:::-;56866:21:::0;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;35747:239::-:0;35819:7;35855:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35855:16:0;35890:19;35882:73;;;;-1:-1:-1;;;35882:73:0;;;;;;;:::i;56267:105::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56341:13:::1;:23:::0;56267:105::o;35477:208::-;35549:7;-1:-1:-1;;;;;35577:19:0;;35569:74;;;;-1:-1:-1;;;35569:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;35661:16:0;;;;;:9;:16;;;;;;;35477:208::o;15729:103::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;15794:30:::1;15821:1;15794:18;:30::i;:::-;15729:103::o:0;55188:429::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;55282:13:::1;::::0;55357:9:::1;::::0;55328:25:::1;55337:9:::0;55282:13;55328:25:::1;:::i;:::-;:38;;55306:136;;;;-1:-1:-1::0;;;55306:136:0::1;;;;;;;:::i;:::-;55472:9;;:16;;55455:13;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;55506:9:0::1;::::0;-1:-1:-1;55501:109:0::1;55521:20:::0;;::::1;55501:109;;;55563:35;55573:9;;55583:1;55573:12;;;;;-1:-1:-1::0;;;55573:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55587:10;55596:1:::0;55587:6;:10:::1;:::i;:::-;55563:9;:35::i;:::-;55543:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55501:109;;;;15369:1;55188:429:::0;;:::o;48573:32::-;;;;:::o;55861:99::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;55917:8:::1;:35:::0;;55928:24:::1;::::0;55917:8;-1:-1:-1;;55917:35:0::1;::::0;55928:24;55917:35:::1;::::0;49313:30;;;;;;;;;:::o;51165:606::-;51237:13;;51300:10;51220:14;51284:28;;;:14;:28;;;;;;:39;-1:-1:-1;51284:39:0;51263:137;;;;-1:-1:-1;;;51263:137:0;;;;;;;:::i;:::-;51455:9;;51435:16;51444:7;51435:6;:16;:::i;:::-;:29;;51413:131;;;;-1:-1:-1;;;51413:131:0;;;;;;;:::i;:::-;51573:10;51557:28;;;;:14;:28;;;;;:39;;51589:7;;51557:28;:39;;51589:7;;51557:39;:::i;:::-;;;;-1:-1:-1;;51620:10:0;51607:25;;;;:11;:25;;;;;:36;;51636:7;;51607:25;:36;;51636:7;;51607:36;:::i;:::-;;;;;;;;51670:7;51656:10;;:21;;;;;;;:::i;:::-;;;;;;;;51705:7;51688:13;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;51725:38:0;;-1:-1:-1;51735:10:0;51747:6;51755:7;51725:9;:38::i;54499:345::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;54599:13:::1;::::0;54666:9:::1;::::0;54647:15:::1;54656:6:::0;54599:13;54647:15:::1;:::i;:::-;:28;;54625:126;;;;-1:-1:-1::0;;;54625:126:0::1;;;;;;;:::i;:::-;54781:6;54764:13;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54800:36:0::1;::::0;-1:-1:-1;54811:8:0;54821:6;54829;54800:9:::1;:36::i;55760:93::-:0;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;55813:8:::1;:32:::0;;55824:21:::1;::::0;55813:8;-1:-1:-1;;55813:32:0::1;::::0;55824:21;55813:32:::1;::::0;49980:96;50060:8;;;;;;;;49980:96::o;15078:87::-;15151:6;;-1:-1:-1;;;;;15151:6:0;15078:87;:::o;57091:184::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57177:25:0;::::1;57169:57;;;;-1:-1:-1::0;;;57169:57:0::1;;;;;;;:::i;:::-;57237:16;:30:::0;;-1:-1:-1;;;;;;57237:30:0::1;-1:-1:-1::0;;;;;57237:30:0;;;::::1;::::0;;;::::1;::::0;;57091:184::o;49530:49::-;;;;;;;;;;;;;:::o;48706:42::-;;;;:::o;36222:104::-;36278:13;36311:7;36304:14;;;;;:::i;50313:115::-;-1:-1:-1;;;;;50401:19:0;50374:7;50401:19;;;:11;:19;;;;;;;50313:115::o;48448:34::-;;;;:::o;37905:155::-;38000:52;38019:12;:10;:12::i;:::-;38033:8;38043;38000:18;:52::i;49491:30::-;;;;;;;;;:::o;56489:69::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56535:8:::1;:15:::0;;-1:-1:-1;;56535:15:0::1;56546:4;56535:15;::::0;;56489:69::o;53776:715::-;53862:1;53853:6;:10;53844:55;;;;-1:-1:-1;;;53844:55:0;;;;;;;:::i;:::-;53937:13;;53981:9;;53972:18;;53963:55;;;;-1:-1:-1;;;53963:55:0;;;;;;;:::i;:::-;54057:9;;54038:15;54047:6;54038;:15;:::i;:::-;:28;;54029:94;;;;-1:-1:-1;;;54029:94:0;;;;;;;:::i;:::-;54170:19;54158:8;;;;;;;:31;;;;;;-1:-1:-1;;;54158:31:0;;;;;;;;;;54136:126;;;;-1:-1:-1;;;54136:126:0;;;;;;;:::i;:::-;54322:6;54310:9;;:18;;;;:::i;:::-;54297:9;:31;;54275:122;;;;-1:-1:-1;;;54275:122:0;;;;;;;:::i;:::-;54427:6;54410:13;;:23;;;;;;;:::i;39028:328::-;39203:41;39222:12;:10;:12::i;:::-;39236:7;39203:18;:41::i;:::-;39195:103;;;;-1:-1:-1;;;39195:103:0;;;;;;;:::i;:::-;39309:39;39323:4;39329:2;39333:7;39342:5;39309:13;:39::i;56903:180::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56987:25:0;::::1;56979:57;;;;-1:-1:-1::0;;;56979:57:0::1;;;;;;;:::i;:::-;57047:14;:28:::0;;-1:-1:-1;;;;;;57047:28:0::1;-1:-1:-1::0;;;;;57047:28:0;;;::::1;::::0;;;::::1;::::0;;56903:180::o;57943:442::-;58087:8;;58052:13;;58087:8;;58083:71;;58128:14;58121:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58083:71;58166:28;58197:7;58166:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58266:1;58241:14;58235:28;:32;:142;;;;;;;;;;;;;;;;;58311:14;58327:18;:7;:16;:18::i;:::-;58294:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58235:142;58215:162;57943:442;-1:-1:-1;;;57943:442:0:o;51812:991::-;51957:1;51948:6;:10;51940:55;;;;-1:-1:-1;;;51940:55:0;;;;;;;:::i;:::-;52042:24;52030:8;;;;;;;:36;;;;;;-1:-1:-1;;;52030:36:0;;;;;;;;;;52008:142;;;;-1:-1:-1;;;52008:142:0;;;;;;;:::i;:::-;52221:16;;52185:95;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52221:16:0;;52256:9;;;;;;52185:95;;52256:9;;;;52185:95;;;;;;;;;-1:-1:-1;52185:17:0;;-1:-1:-1;;;52185:95:0:i;:::-;52163:172;;;;-1:-1:-1;;;52163:172:0;;;;;;;:::i;:::-;52405:13;;52395:6;52378:14;;:23;;;;:::i;:::-;:40;;52356:160;;;;-1:-1:-1;;;52356:160:0;;;;;;;:::i;:::-;52581:6;52564:14;;:23;;;;:::i;:::-;52551:9;:36;;52529:127;;;;-1:-1:-1;;;52529:127:0;;;;;;;:::i;:::-;52687:6;52669:14;;:24;;;;;;;:::i;:::-;;;;;;;;52722:6;52704:13;;:24;;;;;;;:::i;:::-;;;;;;;;52742:53;52752:10;52780:6;52764:13;;:22;;;;:::i;:::-;52788:6;52742:9;:53::i;48757:27::-;;;;:::o;48535:31::-;;;;:::o;48791:29::-;;;;:::o;57283:94::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;57350:6:::1;:19:::0;;-1:-1:-1;;;;;;57350:19:0::1;-1:-1:-1::0;;;;;57350:19:0;;;::::1;::::0;;;::::1;::::0;;57283:94::o;38131:164::-;-1:-1:-1;;;;;38252:25:0;;;38228:4;38252:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38131:164;;;;;:::o;54852:328::-;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;54934:13:::1;::::0;55001:9:::1;::::0;54982:15:::1;54991:6:::0;54934:13;54982:15:::1;:::i;:::-;:28;;54960:126;;;;-1:-1:-1::0;;;54960:126:0::1;;;;;;;:::i;56566:::-:0;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;56652:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;15987:201::-:0;15309:12;:10;:12::i;:::-;-1:-1:-1;;;;;15298:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;15298:23:0;;15290:68;;;;-1:-1:-1;;;15290:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16076:22:0;::::1;16068:73;;;;-1:-1:-1::0;;;16068:73:0::1;;;;;;;:::i;:::-;16152:28;16171:8;16152:18;:28::i;:::-;15987:201:::0;:::o;48614:37::-;;;;:::o;50184:121::-;-1:-1:-1;;;;;50275:22:0;50248:7;50275:22;;;:14;:22;;;;;;;50184:121::o;52811:957::-;52954:1;52945:6;:10;52937:55;;;;-1:-1:-1;;;52937:55:0;;;;;;;:::i;:::-;53063:14;;53027:93;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53063:14:0;;53096:9;;;;;;53027:93;;53096:9;;;;53027:93;;;;;;;;;-1:-1:-1;53027:17:0;;-1:-1:-1;;;53027:93:0:i;:::-;53005:170;;;;-1:-1:-1;;;53005:170:0;;;;;;;:::i;:::-;53230:22;53218:8;;;;;;;:34;;;;;;-1:-1:-1;;;53218:34:0;;;;;;;;;;53196:125;;;;-1:-1:-1;;;53196:125:0;;;;;;;:::i;:::-;53389:11;;53379:6;53364:12;;:21;;;;:::i;:::-;:36;;53342:145;;;;-1:-1:-1;;;53342:145:0;;;;;;;:::i;:::-;53550:6;53535:12;;:21;;;;:::i;:::-;53522:9;:34;;53500:125;;;;-1:-1:-1;;;53500:125:0;;;;;;;:::i;:::-;53654:6;53638:12;;:22;;;;;;;:::i;27862:157::-;-1:-1:-1;;;;;;27971:40:0;;-1:-1:-1;;;27971:40:0;27862:157;;;:::o;13802:98::-;13882:10;13802:98;:::o;40866:127::-;40931:4;40955:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40955:16:0;:30;;;40866:127::o;45012:174::-;45087:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45087:29:0;-1:-1:-1;;;;;45087:29:0;;;;;;;;:24;;45141:23;45087:24;45141:14;:23::i;:::-;-1:-1:-1;;;;;45132:46:0;;;;;;;;;;;45012:174;;:::o;41160:348::-;41253:4;41278:16;41286:7;41278;:16::i;:::-;41270:73;;;;-1:-1:-1;;;41270:73:0;;;;;;;:::i;:::-;41354:13;41370:23;41385:7;41370:14;:23::i;:::-;41354:39;;41423:5;-1:-1:-1;;;;;41412:16:0;:7;-1:-1:-1;;;;;41412:16:0;;:51;;;;41456:7;-1:-1:-1;;;;;41432:31:0;:20;41444:7;41432:11;:20::i;:::-;-1:-1:-1;;;;;41432:31:0;;41412:51;:87;;;;41467:32;41484:5;41491:7;41467:16;:32::i;:::-;41404:96;41160:348;-1:-1:-1;;;;41160:348:0:o;44269:625::-;44428:4;-1:-1:-1;;;;;44401:31:0;:23;44416:7;44401:14;:23::i;:::-;-1:-1:-1;;;;;44401:31:0;;44393:81;;;;-1:-1:-1;;;44393:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44493:16:0;;44485:65;;;;-1:-1:-1;;;44485:65:0;;;;;;;:::i;:::-;44563:39;44584:4;44590:2;44594:7;44563:20;:39::i;:::-;44667:29;44684:1;44688:7;44667:8;:29::i;:::-;-1:-1:-1;;;;;44709:15:0;;;;;;:9;:15;;;;;:20;;44728:1;;44709:15;:20;;44728:1;;44709:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44740:13:0;;;;;;:9;:13;;;;;:18;;44757:1;;44740:13;:18;;44757:1;;44740:18;:::i;:::-;;;;-1:-1:-1;;44769:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44769:21:0;-1:-1:-1;;;;;44769:21:0;;;;;;;;;44808:27;;44769:16;;44808:27;;;;;;;44848:38;44868:4;44874:2;44878:7;44848:19;:38::i;16348:191::-;16441:6;;;-1:-1:-1;;;;;16458:17:0;;;-1:-1:-1;;;;;;16458:17:0;;;;;;;16491:40;;16441:6;;;16458:17;16441:6;;16491:40;;16422:16;;16491:40;16348:191;;:::o;41850:110::-;41926:26;41936:2;41940:7;41926:26;;;;;;;;;;;;:9;:26::i;50869:217::-;50993:9;50988:89;51012:6;51008:1;:10;50988:89;;;51040:25;51050:2;51054:10;51063:1;51054:6;:10;:::i;51040:25::-;51020:3;;;;:::i;:::-;;;;50988:89;;45328:315;45483:8;-1:-1:-1;;;;;45474:17:0;:5;-1:-1:-1;;;;;45474:17:0;;;45466:55;;;;-1:-1:-1;;;45466:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45532:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;45532:46:0;;;;;;;45594:41;;;;;45532:46;;45594:41;:::i;:::-;;;;;;;;45328:315;;;:::o;40238:::-;40395:28;40405:4;40411:2;40415:7;40395:9;:28::i;:::-;40442:48;40465:4;40471:2;40475:7;40484:5;40442:22;:48::i;:::-;40434:111;;;;-1:-1:-1;;;40434:111:0;;;;;;;:::i;1830:723::-;1886:13;2107:10;2103:53;;-1:-1:-1;2134:10:0;;;;;;;;;;;;-1:-1:-1;;;2134:10:0;;;;;;2103:53;2181:5;2166:12;2222:78;2229:9;;2222:78;;2255:8;;;;:::i;:::-;;-1:-1:-1;2278:10:0;;-1:-1:-1;2286:2:0;2278:10;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;-1:-1:-1;;;2332:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2332:17:0;;2310:39;;2360:154;2367:10;;2360:154;;2394:11;2404:1;2394:11;;:::i;:::-;;-1:-1:-1;2463:10:0;2471:2;2463:5;:10;:::i;:::-;2450:24;;:2;:24;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;-1:-1:-1;;;2420:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;2420:56:0;;;;;;;;-1:-1:-1;2491:11:0;2500:2;2491:11;;:::i;:::-;;;2360:154;;50436:404;50520:4;50536:19;50608:4;50615:10;50582:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50558:79;;;;;;50536:101;;50650:14;50667:48;50712:2;50667:36;:11;:34;:36::i;:::-;:44;;:48::i;:::-;50650:65;;50741:6;-1:-1:-1;;;;;50732:15:0;:5;-1:-1:-1;;;;;50732:15:0;;50728:105;;;50772:4;50765:11;;;;;;50728:105;50816:5;50809:12;;;;;;42187:321;42317:18;42323:2;42327:7;42317:5;:18::i;:::-;42368:54;42399:1;42403:2;42407:7;42416:5;42368:22;:54::i;:::-;42346:154;;;;-1:-1:-1;;;42346:154:0;;;;;;;:::i;46208:799::-;46363:4;46384:15;:2;-1:-1:-1;;;;;46384:13:0;;:15::i;:::-;46380:620;;;46436:2;-1:-1:-1;;;;;46420:36:0;;46457:12;:10;:12::i;:::-;46471:4;46477:7;46486:5;46420:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46420:72:0;;;;;;;;-1:-1:-1;;46420:72:0;;;;;;;;;;;;:::i;:::-;;;46416:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46662:13:0;;46658:272;;46705:60;;-1:-1:-1;;;46705:60:0;;;;;;;:::i;46658:272::-;46880:6;46874:13;46865:6;46861:2;46857:15;46850:38;46416:529;-1:-1:-1;;;;;;46543:51:0;-1:-1:-1;;;46543:51:0;;-1:-1:-1;46536:58:0;;46380:620;-1:-1:-1;46984:4:0;46208:799;;;;;;:::o;11808:269::-;11877:7;12063:4;12010:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;12000:69;;;;;;11993:76;;11808:269;;;:::o;8006:231::-;8084:7;8105:17;8124:18;8146:27;8157:4;8163:9;8146:10;:27::i;:::-;8104:69;;;;8184:18;8196:5;8184:11;:18::i;:::-;-1:-1:-1;8220:9:0;8006:231;-1:-1:-1;;;8006:231:0:o;42844:439::-;-1:-1:-1;;;;;42924:16:0;;42916:61;;;;-1:-1:-1;;;42916:61:0;;;;;;;:::i;:::-;42997:16;43005:7;42997;:16::i;:::-;42996:17;42988:58;;;;-1:-1:-1;;;42988:58:0;;;;;;;:::i;:::-;43059:45;43088:1;43092:2;43096:7;43059:20;:45::i;:::-;-1:-1:-1;;;;;43117:13:0;;;;;;:9;:13;;;;;:18;;43134:1;;43117:13;:18;;43134:1;;43117:18;:::i;:::-;;;;-1:-1:-1;;43146:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43146:21:0;-1:-1:-1;;;;;43146:21:0;;;;;;;;43185:33;;43146:16;;;43185:33;;43146:16;;43185:33;43231:44;43259:1;43263:2;43267:7;43231:19;:44::i;17779:326::-;-1:-1:-1;;;;;18074:19:0;;:23;;;17779:326::o;5896:1308::-;5977:7;5986:12;6211:9;:16;6231:2;6211:22;6207:990;;;6507:4;6492:20;;6486:27;6557:4;6542:20;;6536:27;6615:4;6600:20;;6594:27;6250:9;6586:36;6658:25;6669:4;6586:36;6486:27;6536;6658:10;:25::i;:::-;6651:32;;;;;;;;;6207:990;6705:9;:16;6725:2;6705:22;6701:496;;;6980:4;6965:20;;6959:27;7031:4;7016:20;;7010:27;7073:23;7084:4;6959:27;7010;7073:10;:23::i;:::-;7066:30;;;;;;;;6701:496;-1:-1:-1;7145:1:0;;-1:-1:-1;7149:35:0;6701:496;5896:1308;;;;;:::o;4167:643::-;4245:20;4236:5;:29;;;;;;-1:-1:-1;;;4236:29:0;;;;;;;;;;4232:571;;;4282:7;;4232:571;4343:29;4334:5;:38;;;;;;-1:-1:-1;;;4334:38:0;;;;;;;;;;4330:473;;;4389:34;;-1:-1:-1;;;4389:34:0;;;;;;;:::i;4330:473::-;4454:35;4445:5;:44;;;;;;-1:-1:-1;;;4445:44:0;;;;;;;;;;4441:362;;;4506:41;;-1:-1:-1;;;4506:41:0;;;;;;;:::i;4441:362::-;4578:30;4569:5;:39;;;;;;-1:-1:-1;;;4569:39:0;;;;;;;;;;4565:238;;;4625:44;;-1:-1:-1;;;4625:44:0;;;;;;;:::i;4565:238::-;4700:30;4691:5;:39;;;;;;-1:-1:-1;;;4691:39:0;;;;;;;;;;4687:116;;;4747:44;;-1:-1:-1;;;4747:44:0;;;;;;;:::i;9458:1632::-;9589:7;;10523:66;10510:79;;10506:163;;;-1:-1:-1;10622:1:0;;-1:-1:-1;10626:30:0;10606:51;;10506:163;10683:1;:7;;10688:2;10683:7;;:18;;;;;10694:1;:7;;10699:2;10694:7;;10683:18;10679:102;;;-1:-1:-1;10734:1:0;;-1:-1:-1;10738:30:0;10718:51;;10679:102;10878:14;10895:24;10905:4;10911:1;10914;10917;10895:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10895:24:0;;-1:-1:-1;;10895:24:0;;;-1:-1:-1;;;;;;;10934:20:0;;10930:103;;10987:1;10991:29;10971:50;;;;;;;10930:103;11053:6;-1:-1:-1;11061:20:0;;-1:-1:-1;9458:1632:0;;;;;;;;:::o;8500:344::-;8614:7;;-1:-1:-1;;;;;8660:80:0;;8614:7;8767:25;8783:3;8768:18;;;8790:2;8767:25;:::i;:::-;8751:42;;8811:25;8822:4;8828:1;8831;8834;8811:10;:25::i;:::-;8804:32;;;;;;8500:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:633:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;232:2;226:9;200:2;286:15;;-1:-1:-1;;282:24:1;;;308:2;278:33;274:42;262:55;;;332:18;;;352:22;;;329:46;326:2;;;378:18;;:::i;:::-;418:10;414:2;407:22;447:6;438:15;;477:6;469;462:22;517:3;508:6;503:3;499:16;496:25;493:2;;;534:1;531;524:12;493:2;584:6;579:3;572:4;564:6;560:17;547:44;639:1;632:4;623:6;615;611:19;607:30;600:41;;;;90:557;;;;;:::o;652:175::-;722:20;;-1:-1:-1;;;;;771:31:1;;761:42;;751:2;;817:1;814;807:12;832:198;;944:2;932:9;923:7;919:23;915:32;912:2;;;965:6;957;950:22;912:2;993:31;1014:9;993:31;:::i;1035:274::-;;;1164:2;1152:9;1143:7;1139:23;1135:32;1132:2;;;1185:6;1177;1170:22;1132:2;1213:31;1234:9;1213:31;:::i;:::-;1203:41;;1263:40;1299:2;1288:9;1284:18;1263:40;:::i;:::-;1253:50;;1122:187;;;;;:::o;1314:342::-;;;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;1481:6;1473;1466:22;1428:2;1509:31;1530:9;1509:31;:::i;:::-;1499:41;;1559:40;1595:2;1584:9;1580:18;1559:40;:::i;:::-;1549:50;;1646:2;1635:9;1631:18;1618:32;1608:42;;1418:238;;;;;:::o;1661:702::-;;;;;1833:3;1821:9;1812:7;1808:23;1804:33;1801:2;;;1855:6;1847;1840:22;1801:2;1883:31;1904:9;1883:31;:::i;:::-;1873:41;;1933:40;1969:2;1958:9;1954:18;1933:40;:::i;:::-;1923:50;;2020:2;2009:9;2005:18;1992:32;1982:42;;2075:2;2064:9;2060:18;2047:32;2102:18;2094:6;2091:30;2088:2;;;2139:6;2131;2124:22;2088:2;2167:22;;2220:4;2212:13;;2208:27;-1:-1:-1;2198:2:1;;2254:6;2246;2239:22;2198:2;2282:75;2349:7;2344:2;2331:16;2326:2;2322;2318:11;2282:75;:::i;:::-;2272:85;;;1791:572;;;;;;;:::o;2368:369::-;;;2494:2;2482:9;2473:7;2469:23;2465:32;2462:2;;;2515:6;2507;2500:22;2462:2;2543:31;2564:9;2543:31;:::i;:::-;2533:41;;2624:2;2613:9;2609:18;2596:32;2671:5;2664:13;2657:21;2650:5;2647:32;2637:2;;2698:6;2690;2683:22;2637:2;2726:5;2716:15;;;2452:285;;;;;:::o;2742:266::-;;;2871:2;2859:9;2850:7;2846:23;2842:32;2839:2;;;2892:6;2884;2877:22;2839:2;2920:31;2941:9;2920:31;:::i;:::-;2910:41;2998:2;2983:18;;;;2970:32;;-1:-1:-1;;;2829:179:1:o;3013:666::-;;;3160:2;3148:9;3139:7;3135:23;3131:32;3128:2;;;3181:6;3173;3166:22;3128:2;3226:9;3213:23;3255:18;3296:2;3288:6;3285:14;3282:2;;;3317:6;3309;3302:22;3282:2;3360:6;3349:9;3345:22;3335:32;;3405:7;3398:4;3394:2;3390:13;3386:27;3376:2;;3432:6;3424;3417:22;3376:2;3477;3464:16;3503:2;3495:6;3492:14;3489:2;;;3524:6;3516;3509:22;3489:2;3583:7;3578:2;3572;3564:6;3560:15;3556:2;3552:24;3548:33;3545:46;3542:2;;;3609:6;3601;3594:22;3542:2;3645;3637:11;;;;;3667:6;;-1:-1:-1;3118:561:1;;-1:-1:-1;;;;3118:561:1:o;3684:257::-;;3795:2;3783:9;3774:7;3770:23;3766:32;3763:2;;;3816:6;3808;3801:22;3763:2;3860:9;3847:23;3879:32;3905:5;3879:32;:::i;3946:261::-;;4068:2;4056:9;4047:7;4043:23;4039:32;4036:2;;;4089:6;4081;4074:22;4036:2;4126:9;4120:16;4145:32;4171:5;4145:32;:::i;4212:482::-;;4334:2;4322:9;4313:7;4309:23;4305:32;4302:2;;;4355:6;4347;4340:22;4302:2;4400:9;4387:23;4433:18;4425:6;4422:30;4419:2;;;4470:6;4462;4455:22;4419:2;4498:22;;4551:4;4543:13;;4539:27;-1:-1:-1;4529:2:1;;4585:6;4577;4570:22;4529:2;4613:75;4680:7;4675:2;4662:16;4657:2;4653;4649:11;4613:75;:::i;4699:190::-;;4811:2;4799:9;4790:7;4786:23;4782:32;4779:2;;;4832:6;4824;4817:22;4779:2;-1:-1:-1;4860:23:1;;4769:120;-1:-1:-1;4769:120:1:o;4894:266::-;;;5023:2;5011:9;5002:7;4998:23;4994:32;4991:2;;;5044:6;5036;5029:22;4991:2;5085:9;5072:23;5062:33;;5114:40;5150:2;5139:9;5135:18;5114:40;:::i;5165:709::-;;;;5313:2;5301:9;5292:7;5288:23;5284:32;5281:2;;;5334:6;5326;5319:22;5281:2;5375:9;5362:23;5352:33;;5436:2;5425:9;5421:18;5408:32;5459:18;5500:2;5492:6;5489:14;5486:2;;;5521:6;5513;5506:22;5486:2;5564:6;5553:9;5549:22;5539:32;;5609:7;5602:4;5598:2;5594:13;5590:27;5580:2;;5636:6;5628;5621:22;5580:2;5681;5668:16;5707:2;5699:6;5696:14;5693:2;;;5728:6;5720;5713:22;5693:2;5778:7;5773:2;5764:6;5760:2;5756:15;5752:24;5749:37;5746:2;;;5804:6;5796;5789:22;5746:2;5840;5836;5832:11;5822:21;;5862:6;5852:16;;;;;5271:603;;;;;:::o;5879:259::-;;5960:5;5954:12;5987:6;5982:3;5975:19;6003:63;6059:6;6052:4;6047:3;6043:14;6036:4;6029:5;6025:16;6003:63;:::i;:::-;6120:2;6099:15;-1:-1:-1;;6095:29:1;6086:39;;;;6127:4;6082:50;;5930:208;-1:-1:-1;;5930:208:1:o;6143:333::-;-1:-1:-1;;6370:2:1;6366:15;;;6362:24;;6350:37;;6421:15;;;;6417:24;6412:2;6403:12;;6396:46;6467:2;6458:12;;6290:186::o;6481:637::-;;6799:6;6793:13;6815:53;6861:6;6856:3;6849:4;6841:6;6837:17;6815:53;:::i;:::-;6931:13;;6890:16;;;;6953:57;6931:13;6890:16;6987:4;6975:17;;6953:57;:::i;:::-;-1:-1:-1;;;7032:20:1;;7061:22;;;7110:1;7099:13;;6769:349;-1:-1:-1;;;;6769:349:1:o;7123:380::-;7365:66;7353:79;;7457:2;7448:12;;7441:28;;;;7494:2;7485:12;;7343:160::o;7508:203::-;-1:-1:-1;;;;;7672:32:1;;;;7654:51;;7642:2;7627:18;;7609:102::o;7716:490::-;-1:-1:-1;;;;;7985:15:1;;;7967:34;;8037:15;;8032:2;8017:18;;8010:43;8084:2;8069:18;;8062:34;;;8132:3;8127:2;8112:18;;8105:31;;;7716:490;;8153:47;;8180:19;;8172:6;8153:47;:::i;:::-;8145:55;7919:287;-1:-1:-1;;;;;;7919:287:1:o;8211:187::-;8376:14;;8369:22;8351:41;;8339:2;8324:18;;8306:92::o;8403:398::-;8630:25;;;8703:4;8691:17;;;;8686:2;8671:18;;8664:45;8740:2;8725:18;;8718:34;8783:2;8768:18;;8761:34;8617:3;8602:19;;8584:217::o;8806:347::-;8957:2;8942:18;;8990:1;8979:13;;8969:2;;9035:10;9030:3;9026:20;9023:1;9016:31;9070:4;9067:1;9060:15;9098:4;9095:1;9088:15;8969:2;9122:25;;;8924:229;:::o;9158:221::-;;9307:2;9296:9;9289:21;9327:46;9369:2;9358:9;9354:18;9346:6;9327:46;:::i;9384:348::-;9586:2;9568:21;;;9625:2;9605:18;;;9598:30;9664:26;9659:2;9644:18;;9637:54;9723:2;9708:18;;9558:174::o;9737:409::-;9939:2;9921:21;;;9978:2;9958:18;;;9951:30;10017:34;10012:2;9997:18;;9990:62;-1:-1:-1;;;10083:2:1;10068:18;;10061:43;10136:3;10121:19;;9911:235::o;10151:355::-;10353:2;10335:21;;;10392:2;10372:18;;;10365:30;10431:33;10426:2;10411:18;;10404:61;10497:2;10482:18;;10325:181::o;10511:414::-;10713:2;10695:21;;;10752:2;10732:18;;;10725:30;10791:34;10786:2;10771:18;;10764:62;-1:-1:-1;;;10857:2:1;10842:18;;10835:48;10915:3;10900:19;;10685:240::o;10930:420::-;11132:2;11114:21;;;11171:2;11151:18;;;11144:30;11210:34;11205:2;11190:18;;11183:62;11281:26;11276:2;11261:18;;11254:54;11340:3;11325:19;;11104:246::o;11355:402::-;11557:2;11539:21;;;11596:2;11576:18;;;11569:30;11635:34;11630:2;11615:18;;11608:62;-1:-1:-1;;;11701:2:1;11686:18;;11679:36;11747:3;11732:19;;11529:228::o;11762:413::-;11964:2;11946:21;;;12003:2;11983:18;;;11976:30;12042:34;12037:2;12022:18;;12015:62;-1:-1:-1;;;12108:2:1;12093:18;;12086:47;12165:3;12150:19;;11936:239::o;12180:401::-;12382:2;12364:21;;;12421:2;12401:18;;;12394:30;12460:34;12455:2;12440:18;;12433:62;-1:-1:-1;;;12526:2:1;12511:18;;12504:35;12571:3;12556:19;;12354:227::o;12586:352::-;12788:2;12770:21;;;12827:2;12807:18;;;12800:30;12866;12861:2;12846:18;;12839:58;12929:2;12914:18;;12760:178::o;12943:405::-;13145:2;13127:21;;;13184:2;13164:18;;;13157:30;13223:34;13218:2;13203:18;;13196:62;-1:-1:-1;;;13289:2:1;13274:18;;13267:39;13338:3;13323:19;;13117:231::o;13353:400::-;13555:2;13537:21;;;13594:2;13574:18;;;13567:30;13633:34;13628:2;13613:18;;13606:62;-1:-1:-1;;;13699:2:1;13684:18;;13677:34;13743:3;13728:19;;13527:226::o;13758:349::-;13960:2;13942:21;;;13999:2;13979:18;;;13972:30;14038:27;14033:2;14018:18;;14011:55;14098:2;14083:18;;13932:175::o;14112:474::-;14314:2;14296:21;;;14353:2;14333:18;;;14326:30;14392:34;14387:2;14372:18;;14365:62;14463:34;14458:2;14443:18;;14436:62;-1:-1:-1;;;14529:3:1;14514:19;;14507:37;14576:3;14561:19;;14286:300::o;14591:416::-;14793:2;14775:21;;;14832:2;14812:18;;;14805:30;14871:34;14866:2;14851:18;;14844:62;-1:-1:-1;;;14937:2:1;14922:18;;14915:50;14997:3;14982:19;;14765:242::o;15012:405::-;15214:2;15196:21;;;15253:2;15233:18;;;15226:30;15292:34;15287:2;15272:18;;15265:62;-1:-1:-1;;;15358:2:1;15343:18;;15336:39;15407:3;15392:19;;15186:231::o;15422:398::-;15624:2;15606:21;;;15663:2;15643:18;;;15636:30;15702:34;15697:2;15682:18;;15675:62;-1:-1:-1;;;15768:2:1;15753:18;;15746:32;15810:3;15795:19;;15596:224::o;15825:408::-;16027:2;16009:21;;;16066:2;16046:18;;;16039:30;16105:34;16100:2;16085:18;;16078:62;-1:-1:-1;;;16171:2:1;16156:18;;16149:42;16223:3;16208:19;;15999:234::o;16238:351::-;16440:2;16422:21;;;16479:2;16459:18;;;16452:30;16518:29;16513:2;16498:18;;16491:57;16580:2;16565:18;;16412:177::o;16594:423::-;16796:2;16778:21;;;16835:2;16815:18;;;16808:30;16874:34;16869:2;16854:18;;16847:62;16945:29;16940:2;16925:18;;16918:57;17007:3;16992:19;;16768:249::o;17022:420::-;17224:2;17206:21;;;17263:2;17243:18;;;17236:30;17302:34;17297:2;17282:18;;17275:62;17373:26;17368:2;17353:18;;17346:54;17432:3;17417:19;;17196:246::o;17447:406::-;17649:2;17631:21;;;17688:2;17668:18;;;17661:30;17727:34;17722:2;17707:18;;17700:62;-1:-1:-1;;;17793:2:1;17778:18;;17771:40;17843:3;17828:19;;17621:232::o;17858:405::-;18060:2;18042:21;;;18099:2;18079:18;;;18072:30;18138:34;18133:2;18118:18;;18111:62;-1:-1:-1;;;18204:2:1;18189:18;;18182:39;18253:3;18238:19;;18032:231::o;18268:343::-;18470:2;18452:21;;;18509:2;18489:18;;;18482:30;-1:-1:-1;;;18543:2:1;18528:18;;18521:49;18602:2;18587:18;;18442:169::o;18616:398::-;18818:2;18800:21;;;18857:2;18837:18;;;18830:30;18896:34;18891:2;18876:18;;18869:62;-1:-1:-1;;;18962:2:1;18947:18;;18940:32;19004:3;18989:19;;18790:224::o;19019:356::-;19221:2;19203:21;;;19240:18;;;19233:30;19299:34;19294:2;19279:18;;19272:62;19366:2;19351:18;;19193:182::o;19380:408::-;19582:2;19564:21;;;19621:2;19601:18;;;19594:30;19660:34;19655:2;19640:18;;19633:62;-1:-1:-1;;;19726:2:1;19711:18;;19704:42;19778:3;19763:19;;19554:234::o;19793:356::-;19995:2;19977:21;;;20014:18;;;20007:30;20073:34;20068:2;20053:18;;20046:62;20140:2;20125:18;;19967:182::o;20154:346::-;20356:2;20338:21;;;20395:2;20375:18;;;20368:30;-1:-1:-1;;;20429:2:1;20414:18;;20407:52;20491:2;20476:18;;20328:172::o;20505:416::-;20707:2;20689:21;;;20746:2;20726:18;;;20719:30;20785:34;20780:2;20765:18;;20758:62;-1:-1:-1;;;20851:2:1;20836:18;;20829:50;20911:3;20896:19;;20679:242::o;20926:409::-;21128:2;21110:21;;;21167:2;21147:18;;;21140:30;21206:34;21201:2;21186:18;;21179:62;-1:-1:-1;;;21272:2:1;21257:18;;21250:43;21325:3;21310:19;;21100:235::o;21340:397::-;21542:2;21524:21;;;21581:2;21561:18;;;21554:30;21620:34;21615:2;21600:18;;21593:62;-1:-1:-1;;;21686:2:1;21671:18;;21664:31;21727:3;21712:19;;21514:223::o;21742:356::-;21944:2;21926:21;;;21963:18;;;21956:30;22022:34;22017:2;22002:18;;21995:62;22089:2;22074:18;;21916:182::o;22103:413::-;22305:2;22287:21;;;22344:2;22324:18;;;22317:30;22383:34;22378:2;22363:18;;22356:62;-1:-1:-1;;;22449:2:1;22434:18;;22427:47;22506:3;22491:19;;22277:239::o;22521:355::-;22723:2;22705:21;;;22762:2;22742:18;;;22735:30;22801:33;22796:2;22781:18;;22774:61;22867:2;22852:18;;22695:181::o;22881:412::-;23083:2;23065:21;;;23122:2;23102:18;;;23095:30;23161:34;23156:2;23141:18;;23134:62;-1:-1:-1;;;23227:2:1;23212:18;;23205:46;23283:3;23268:19;;23055:238::o;23298:177::-;23444:25;;;23432:2;23417:18;;23399:76::o;23480:128::-;;23551:1;23547:6;23544:1;23541:13;23538:2;;;23557:18;;:::i;:::-;-1:-1:-1;23593:9:1;;23528:80::o;23613:120::-;;23679:1;23669:2;;23684:18;;:::i;:::-;-1:-1:-1;23718:9:1;;23659:74::o;23738:168::-;;23844:1;23840;23836:6;23832:14;23829:1;23826:21;23821:1;23814:9;23807:17;23803:45;23800:2;;;23851:18;;:::i;:::-;-1:-1:-1;23891:9:1;;23790:116::o;23911:125::-;;23979:1;23976;23973:8;23970:2;;;23984:18;;:::i;:::-;-1:-1:-1;24021:9:1;;23960:76::o;24041:258::-;24113:1;24123:113;24137:6;24134:1;24131:13;24123:113;;;24213:11;;;24207:18;24194:11;;;24187:39;24159:2;24152:10;24123:113;;;24254:6;24251:1;24248:13;24245:2;;;-1:-1:-1;;24289:1:1;24271:16;;24264:27;24094:205::o;24304:380::-;24389:1;24379:12;;24436:1;24426:12;;;24447:2;;24501:4;24493:6;24489:17;24479:27;;24447:2;24554;24546:6;24543:14;24523:18;24520:38;24517:2;;;24600:10;24595:3;24591:20;24588:1;24581:31;24635:4;24632:1;24625:15;24663:4;24660:1;24653:15;24517:2;;24359:325;;;:::o;24689:135::-;;-1:-1:-1;;24749:17:1;;24746:2;;;24769:18;;:::i;:::-;-1:-1:-1;24816:1:1;24805:13;;24736:88::o;24829:112::-;;24887:1;24877:2;;24892:18;;:::i;:::-;-1:-1:-1;24926:9:1;;24867:74::o;24946:127::-;25007:10;25002:3;24998:20;24995:1;24988:31;25038:4;25035:1;25028:15;25062:4;25059:1;25052:15;25078:127;25139:10;25134:3;25130:20;25127:1;25120:31;25170:4;25167:1;25160:15;25194:4;25191:1;25184:15;25210:127;25271:10;25266:3;25262:20;25259:1;25252:31;25302:4;25299:1;25292:15;25326:4;25323:1;25316:15;25342:133;-1:-1:-1;;;;;;25418:32:1;;25408:43;;25398:2;;25465:1;25462;25455:12

Swarm Source

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