ETH Price: $3,553.47 (+7.77%)

Token

Cosmo Creatures (CC)
 

Overview

Max Total Supply

999 CC

Holders

393

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kennyshen.eth
Balance
1 CC
0x4a1ac24ae6140fe2de46784e9e2e74b3568d5adc
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:
CosmoCreatures

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// 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/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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev 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 v4.4.1 (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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 {}
}

// File: contracts/CC_Final_Contract.sol

//SPDX-License-Identifier: UNLICENSED

//====================================================================================================
//============================     =====    =====      ===  =====  ====    ===========================
//===========================  ===  ===  ==  ===  ====  ==   ===   ===  ==  ==========================
//==========================  ========  ====  ==  ====  ==  =   =  ==  ====  =========================
//==========================  ========  ====  ===  =======  == ==  ==  ====  =========================
//==========================  ========  ====  =====  =====  =====  ==  ====  =========================
//==========================  ========  ====  =======  ===  =====  ==  ====  =========================
//==========================  ========  ====  ==  ====  ==  =====  ==  ====  =========================
//===========================  ===  ===  ==  ===  ====  ==  =====  ===  ==  ==========================
//============================     =====    =====      ===  =====  ====    ===========================
//====================================================================================================
//==================================================================================================== 
//========     ===       ===        =====  =====        ==  ====  ==       ===        ===      ======= 
//=======  ===  ==  ====  ==  ==========    =======  =====  ====  ==  ====  ==  ========  ====  ====== 
//======  ========  ====  ==  =========  ==  ======  =====  ====  ==  ====  ==  ========  ====  ====== 
//======  ========  ===   ==  ========  ====  =====  =====  ====  ==  ===   ==  =========  =========== 
//======  ========      ====      ====  ====  =====  =====  ====  ==      ====      =======  ========= 
//======  ========  ====  ==  ========        =====  =====  ====  ==  ====  ==  =============  ======= 
//======  ========  ====  ==  ========  ====  =====  =====  ====  ==  ====  ==  ========  ====  ====== 
//=======  ===  ==  ====  ==  ========  ====  =====  =====   ==   ==  ====  ==  ========  ====  ====== 
//========     ===  ====  ==        ==  ====  =====  ======      ===  ====  ==        ===      ======= 
//==================================================================================================== 
pragma solidity >=0.7.0 <0.9.0;






contract CosmoCreatures is ERC721, Ownable {
  using Counters for Counters.Counter;
  using SafeMath for uint256;

  Counters.Counter private supply;
  
  uint256 public cost = .1 ether;
  uint256 public maxSupplyPlusOne = 1000;
  uint256 public maxMintAmountPlusOne = 11;
  uint256 public presalemaxMintAmountPlusOne = 3;

  string public PROVENANCE;
  string private _baseURIextended;

  bool public saleIsActive;
  bool public presaleIsActive;

  // TODO: UPDATE
  address payable public immutable creatorAddress = payable(0xef2722dc49c30CAc62AdA0a8D7Bca1847c0DCaAC);
  address payable public immutable devAddress = payable(0x15C560d2D9Eb3AF98524aA73BeCBA43E9e6ceF02);

  mapping(address => uint256) public whitelistBalances;

  bytes32 public merkleRoot;

  constructor() ERC721("Cosmo Creatures", "CC") {
    _mintLoop(msg.sender, 35);
    saleIsActive = false;
    presaleIsActive = false;
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount < maxMintAmountPlusOne, "Invalid mint amount!");
    require(supply.current() + _mintAmount < maxSupplyPlusOne, "Max supply exceeded!");
    require(msg.value >= cost * _mintAmount, "Not enough eth sent!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    // require(merkleRoot == bytes32(0), "Merkle root already set!");
    merkleRoot = _merkleRoot;
  }

  function whitelistMint(uint256 _mintAmount, bytes32[] calldata merkleProof) public payable mintCompliance(_mintAmount) {
    require (presaleIsActive, "Presale inactive");
    require(balanceOf(msg.sender) + _mintAmount < presalemaxMintAmountPlusOne, "Attempting to mint too many creatures for pre-sale");
    require(whitelistBalances[msg.sender] + _mintAmount < presalemaxMintAmountPlusOne, "Attempting to mint too many creatures for pre-sale (balance transferred out)");

    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "You're not whitelisted for presale!");
    _mintLoop(msg.sender, _mintAmount);
    whitelistBalances[msg.sender] += _mintAmount;
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require (saleIsActive, "Public sale inactive");
    _mintLoop(msg.sender, _mintAmount);
  }

  function setSale(bool newState) public onlyOwner {
    saleIsActive = newState;
  }

  function setPreSale(bool newState) public onlyOwner {
    presaleIsActive = newState;
  }

  function setProvenance(string memory provenance) public onlyOwner {
    PROVENANCE = provenance;
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

  function setBaseURI(string memory baseURI_) external onlyOwner() {
    _baseURIextended = baseURI_;
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return _baseURIextended;
  }

  function withdraw() public onlyOwner {
      uint256 balance = address(this).balance;
      Address.sendValue(creatorAddress, balance.mul(95).div(100));
      Address.sendValue(devAddress, balance.mul(5).div(100));
  }

}

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":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPlusOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyPlusOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalemaxMintAmountPlusOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSale","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405267016345785d8a00006008556103e8600955600b600a556003600b5573ef2722dc49c30cac62ada0a8d7bca1847c0dcaac73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b8152507315c560d2d9eb3af98524aa73becba43e9e6cef0273ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff1660601b815250348015620000c157600080fd5b506040518060400160405280600f81526020017f436f736d6f2043726561747572657300000000000000000000000000000000008152506040518060400160405280600281526020017f4343000000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000146929190620007e1565b5080600190805190602001906200015f929190620007e1565b5050506200018262000176620001d160201b60201c565b620001d960201b60201c565b620001953360236200029f60201b60201c565b6000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555062000d14565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156200030057620002c260076200030560201b62001bd31760201c565b620002ea83620002de60076200031b60201b62001be91760201c565b6200032960201b60201c565b8080620002f79062000c3d565b915050620002a2565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6200034b8282604051806020016040528060008152506200034f60201b60201c565b5050565b620003618383620003bd60201b60201c565b620003766000848484620005a360201b60201c565b620003b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003af9062000a77565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004279062000abb565b60405180910390fd5b62000441816200075d60201b60201c565b1562000484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200047b9062000a99565b60405180910390fd5b6200049860008383620007c960201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004ea919062000b0a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005d18473ffffffffffffffffffffffffffffffffffffffff16620007ce60201b62001bf71760201c565b1562000750578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000603620001d160201b60201c565b8786866040518563ffffffff1660e01b815260040162000627949392919062000a23565b602060405180830381600087803b1580156200064257600080fd5b505af19250505080156200067657506040513d601f19601f82011682018060405250810190620006739190620008a8565b60015b620006ff573d8060008114620006a9576040519150601f19603f3d011682016040523d82523d6000602084013e620006ae565b606091505b50600081511415620006f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ee9062000a77565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000755565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620007ef9062000c07565b90600052602060002090601f0160209004810192826200081357600085556200085f565b82601f106200082e57805160ff19168380011785556200085f565b828001600101855582156200085f579182015b828111156200085e57825182559160200191906001019062000841565b5b5090506200086e919062000872565b5090565b5b808211156200088d57600081600090555060010162000873565b5090565b600081519050620008a28162000cfa565b92915050565b600060208284031215620008bb57600080fd5b6000620008cb8482850162000891565b91505092915050565b620008df8162000b67565b82525050565b6000620008f28262000add565b620008fe818562000ae8565b93506200091081856020860162000bd1565b6200091b8162000ce9565b840191505092915050565b60006200093560328362000af9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006200099d601c8362000af9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000620009df60208362000af9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b62000a1d8162000bc7565b82525050565b600060808201905062000a3a6000830187620008d4565b62000a496020830186620008d4565b62000a58604083018562000a12565b818103606083015262000a6c8184620008e5565b905095945050505050565b6000602082019050818103600083015262000a928162000926565b9050919050565b6000602082019050818103600083015262000ab4816200098e565b9050919050565b6000602082019050818103600083015262000ad681620009d0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000b178262000bc7565b915062000b248362000bc7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b5c5762000b5b62000c8b565b5b828201905092915050565b600062000b748262000ba7565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000bf157808201518184015260208101905062000bd4565b8381111562000c01576000848401525b50505050565b6000600282049050600182168062000c2057607f821691505b6020821081141562000c375762000c3662000cba565b5b50919050565b600062000c4a8262000bc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c805762000c7f62000c8b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b62000d058162000b7b565b811462000d1157600080fd5b50565b60805160601c60a05160601c61453862000d4e60003960008181610d510152610e49015260008181610df9015261196401526145386000f3fe60806040526004361061021a5760003560e01c80636373a6b111610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c51461077f578063eb8d2444146107bc578063f2fde38b146107e7578063f7ea21b214610810578063ffe630b51461084d5761021a565b8063b88d4fde146106a7578063c87b56dd146106d0578063d2cab0561461070d578063d4d20d5914610729578063e927fc5c146107545761021a565b80637cb64759116100f25780637cb64759146105e35780638da5cb5b1461060c57806395d89b4114610637578063a0712d6814610662578063a22cb4651461067e5761021a565b80636373a6b11461053957806370a0823114610564578063715018a6146105a15780637759e29f146105b85761021a565b80632b935c0f116101a65780633ccfd60b116101755780633ccfd60b1461046a57806342842e0e1461048157806344a0d68a146104aa57806355f804b3146104d35780636352211e146104fc5761021a565b80632b935c0f146103be5780632eb4a7ab146103e957806330f72cd4146104145780633ad10ef61461043f5761021a565b80630d95ccc9116101ed5780630d95ccc9146102ed57806313faede61461031657806318160ddd146103415780631d2e5a3a1461036c57806323b872dd146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613010565b610876565b6040516102539190613c62565b60405180910390f35b34801561026857600080fd5b50610271610958565b60405161027e9190613c98565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906130a3565b6109ea565b6040516102bb9190613be0565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612f82565b610a6f565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612fbe565b610b87565b005b34801561032257600080fd5b5061032b610c20565b6040516103389190613ffa565b60405180910390f35b34801561034d57600080fd5b50610356610c26565b6040516103639190613ffa565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190612fbe565b610c37565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612e7c565b610cd0565b005b3480156103ca57600080fd5b506103d3610d30565b6040516103e09190613ffa565b60405180910390f35b3480156103f557600080fd5b506103fe610d36565b60405161040b9190613c7d565b60405180910390f35b34801561042057600080fd5b50610429610d3c565b6040516104369190613c62565b60405180910390f35b34801561044b57600080fd5b50610454610d4f565b6040516104619190613bfb565b60405180910390f35b34801561047657600080fd5b5061047f610d73565b005b34801561048d57600080fd5b506104a860048036038101906104a39190612e7c565b610e97565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906130a3565b610eb7565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613062565b610f3d565b005b34801561050857600080fd5b50610523600480360381019061051e91906130a3565b610fd3565b6040516105309190613be0565b60405180910390f35b34801561054557600080fd5b5061054e611085565b60405161055b9190613c98565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190612e17565b611113565b6040516105989190613ffa565b60405180910390f35b3480156105ad57600080fd5b506105b66111cb565b005b3480156105c457600080fd5b506105cd611253565b6040516105da9190613ffa565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190612fe7565b611259565b005b34801561061857600080fd5b506106216112df565b60405161062e9190613be0565b60405180910390f35b34801561064357600080fd5b5061064c611309565b6040516106599190613c98565b60405180910390f35b61067c600480360381019061067791906130a3565b61139b565b005b34801561068a57600080fd5b506106a560048036038101906106a09190612f46565b6114f1565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190612ecb565b611507565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906130a3565b611569565b6040516107049190613c98565b60405180910390f35b610727600480360381019061072291906130cc565b611610565b005b34801561073557600080fd5b5061073e61195c565b60405161074b9190613ffa565b60405180910390f35b34801561076057600080fd5b50610769611962565b6040516107769190613bfb565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190612e40565b611986565b6040516107b39190613c62565b60405180910390f35b3480156107c857600080fd5b506107d1611a1a565b6040516107de9190613c62565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612e17565b611a2d565b005b34801561081c57600080fd5b5061083760048036038101906108329190612e17565b611b25565b6040516108449190613ffa565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613062565b611b3d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610951575061095082611c0a565b5b9050919050565b606060008054610967906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054610993906142db565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b60006109f582611c74565b610a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2b90613e5a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7a82610fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae290613efa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0a611ce0565b73ffffffffffffffffffffffffffffffffffffffff161480610b395750610b3881610b33611ce0565b611986565b5b610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f90613dda565b60405180910390fd5b610b828383611ce8565b505050565b610b8f611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610bad6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613e7a565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b60085481565b6000610c326007611be9565b905090565b610c3f611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610c5d6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613e7a565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610ce1610cdb611ce0565b82611da1565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613f9a565b60405180910390fd5b610d2b838383611e7f565b505050565b600a5481565b60105481565b600e60019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d7b611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610d996112df565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613e7a565b60405180910390fd5b6000479050610e447f0000000000000000000000000000000000000000000000000000000000000000610e3f6064610e31605f866120db90919063ffffffff16565b6120f190919063ffffffff16565b612107565b610e947f0000000000000000000000000000000000000000000000000000000000000000610e8f6064610e816005866120db90919063ffffffff16565b6120f190919063ffffffff16565b612107565b50565b610eb283838360405180602001604052806000815250611507565b505050565b610ebf611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610edd6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613e7a565b60405180910390fd5b8060088190555050565b610f45611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610f636112df565b73ffffffffffffffffffffffffffffffffffffffff1614610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090613e7a565b60405180910390fd5b80600d9080519060200190610fcf929190612bdc565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390613e1a565b60405180910390fd5b80915050919050565b600c8054611092906142db565b80601f01602080910402602001604051908101604052809291908181526020018280546110be906142db565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90613dfa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d3611ce0565b73ffffffffffffffffffffffffffffffffffffffff166111f16112df565b73ffffffffffffffffffffffffffffffffffffffff1614611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613e7a565b60405180910390fd5b61125160006121fb565b565b600b5481565b611261611ce0565b73ffffffffffffffffffffffffffffffffffffffff1661127f6112df565b73ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613e7a565b60405180910390fd5b8060108190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611318906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054611344906142db565b80156113915780601f1061136657610100808354040283529160200191611391565b820191906000526020600020905b81548152906001019060200180831161137457829003601f168201915b5050505050905090565b806000811180156113ad5750600a5481105b6113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613d1a565b60405180910390fd5b600954816113fa6007611be9565b61140491906140f4565b10611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613f7a565b60405180910390fd5b80600854611452919061417b565b341015611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90613fda565b60405180910390fd5b600e60009054906101000a900460ff166114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90613eda565b60405180910390fd5b6114ed33836122c1565b5050565b6115036114fc611ce0565b8383612301565b5050565b611518611512611ce0565b83611da1565b611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613f9a565b60405180910390fd5b6115638484848461246e565b50505050565b606061157482611c74565b6115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613eba565b60405180910390fd5b60006115bd6124ca565b905060008151116115dd5760405180602001604052806000815250611608565b806115e78461255c565b6040516020016115f8929190613ba7565b6040516020818303038152906040525b915050919050565b826000811180156116225750600a5481105b611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613d1a565b60405180910390fd5b6009548161166f6007611be9565b61167991906140f4565b106116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613f7a565b60405180910390fd5b806008546116c7919061417b565b341015611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613fda565b60405180910390fd5b600e60019054906101000a900460ff16611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90613f5a565b60405180910390fd5b600b548461176533611113565b61176f91906140f4565b106117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f3a565b60405180910390fd5b600b5484600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117fd91906140f4565b1061183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613f1a565b60405180910390fd5b6000336040516020016118509190613b60565b6040516020818303038152906040528051906020012090506118b6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612709565b6118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613fba565b60405180910390fd5b6118ff33866122c1565b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461194e91906140f4565b925050819055505050505050565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b611a35611ce0565b73ffffffffffffffffffffffffffffffffffffffff16611a536112df565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613e7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090613cda565b60405180910390fd5b611b22816121fb565b50565b600f6020528060005260406000206000915090505481565b611b45611ce0565b73ffffffffffffffffffffffffffffffffffffffff16611b636112df565b73ffffffffffffffffffffffffffffffffffffffff1614611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb090613e7a565b60405180910390fd5b80600c9080519060200190611bcf929190612bdc565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5b83610fd3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dac82611c74565b611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290613dba565b60405180910390fd5b6000611df683610fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6557508373ffffffffffffffffffffffffffffffffffffffff16611e4d846109ea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e765750611e758185611986565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9f82610fd3565b73ffffffffffffffffffffffffffffffffffffffff1614611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613e9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90613d3a565b60405180910390fd5b611f70838383612720565b611f7b600082611ce8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcb91906141d5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202291906140f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836120e9919061417b565b905092915050565b600081836120ff919061414a565b905092915050565b8047101561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190613d9a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161217090613bcb565b60006040518083038185875af1925050503d80600081146121ad576040519150601f19603f3d011682016040523d82523d6000602084013e6121b2565b606091505b50509050806121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90613d7a565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156122fc576122d66007611bd3565b6122e9836122e46007611be9565b612725565b80806122f49061430d565b9150506122c4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236790613d5a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124619190613c62565b60405180910390a3505050565b612479848484611e7f565b61248584848484612743565b6124c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bb90613cba565b60405180910390fd5b50505050565b6060600d80546124d9906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054612505906142db565b80156125525780601f1061252757610100808354040283529160200191612552565b820191906000526020600020905b81548152906001019060200180831161253557829003601f168201915b5050505050905090565b606060008214156125a4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612704565b600082905060005b600082146125d65780806125bf9061430d565b915050600a826125cf919061414a565b91506125ac565b60008167ffffffffffffffff811115612618577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264a5781602001600182028036833780820191505090505b5090505b600085146126fd5760018261266391906141d5565b9150600a856126729190614384565b603061267e91906140f4565b60f81b8183815181106126ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f6919061414a565b945061264e565b8093505050505b919050565b60008261271685846128da565b1490509392505050565b505050565b61273f8282604051806020016040528060008152506129b3565b5050565b60006127648473ffffffffffffffffffffffffffffffffffffffff16611bf7565b156128cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261278d611ce0565b8786866040518563ffffffff1660e01b81526004016127af9493929190613c16565b602060405180830381600087803b1580156127c957600080fd5b505af19250505080156127fa57506040513d601f19601f820116820180604052508101906127f79190613039565b60015b61287d573d806000811461282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b50600081511415612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90613cba565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d2565b600190505b949350505050565b60008082905060005b84518110156129a8576000858281518110612927577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161296857828160405160200161294b929190613b7b565b604051602081830303815290604052805190602001209250612994565b808360405160200161297b929190613b7b565b6040516020818303038152906040528051906020012092505b5080806129a09061430d565b9150506128e3565b508091505092915050565b6129bd8383612a0e565b6129ca6000848484612743565b612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090613cba565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590613e3a565b60405180910390fd5b612a8781611c74565b15612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe90613cfa565b60405180910390fd5b612ad360008383612720565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2391906140f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612be8906142db565b90600052602060002090601f016020900481019282612c0a5760008555612c51565b82601f10612c2357805160ff1916838001178555612c51565b82800160010185558215612c51579182015b82811115612c50578251825591602001919060010190612c35565b5b509050612c5e9190612c62565b5090565b5b80821115612c7b576000816000905550600101612c63565b5090565b6000612c92612c8d84614046565b614015565b905082815260208101848484011115612caa57600080fd5b612cb5848285614299565b509392505050565b6000612cd0612ccb84614076565b614015565b905082815260208101848484011115612ce857600080fd5b612cf3848285614299565b509392505050565b600081359050612d0a8161448f565b92915050565b60008083601f840112612d2257600080fd5b8235905067ffffffffffffffff811115612d3b57600080fd5b602083019150836020820283011115612d5357600080fd5b9250929050565b600081359050612d69816144a6565b92915050565b600081359050612d7e816144bd565b92915050565b600081359050612d93816144d4565b92915050565b600081519050612da8816144d4565b92915050565b600082601f830112612dbf57600080fd5b8135612dcf848260208601612c7f565b91505092915050565b600082601f830112612de957600080fd5b8135612df9848260208601612cbd565b91505092915050565b600081359050612e11816144eb565b92915050565b600060208284031215612e2957600080fd5b6000612e3784828501612cfb565b91505092915050565b60008060408385031215612e5357600080fd5b6000612e6185828601612cfb565b9250506020612e7285828601612cfb565b9150509250929050565b600080600060608486031215612e9157600080fd5b6000612e9f86828701612cfb565b9350506020612eb086828701612cfb565b9250506040612ec186828701612e02565b9150509250925092565b60008060008060808587031215612ee157600080fd5b6000612eef87828801612cfb565b9450506020612f0087828801612cfb565b9350506040612f1187828801612e02565b925050606085013567ffffffffffffffff811115612f2e57600080fd5b612f3a87828801612dae565b91505092959194509250565b60008060408385031215612f5957600080fd5b6000612f6785828601612cfb565b9250506020612f7885828601612d5a565b9150509250929050565b60008060408385031215612f9557600080fd5b6000612fa385828601612cfb565b9250506020612fb485828601612e02565b9150509250929050565b600060208284031215612fd057600080fd5b6000612fde84828501612d5a565b91505092915050565b600060208284031215612ff957600080fd5b600061300784828501612d6f565b91505092915050565b60006020828403121561302257600080fd5b600061303084828501612d84565b91505092915050565b60006020828403121561304b57600080fd5b600061305984828501612d99565b91505092915050565b60006020828403121561307457600080fd5b600082013567ffffffffffffffff81111561308e57600080fd5b61309a84828501612dd8565b91505092915050565b6000602082840312156130b557600080fd5b60006130c384828501612e02565b91505092915050565b6000806000604084860312156130e157600080fd5b60006130ef86828701612e02565b935050602084013567ffffffffffffffff81111561310c57600080fd5b61311886828701612d10565b92509250509250925092565b61312d8161421b565b82525050565b61313c81614209565b82525050565b61315361314e82614209565b614356565b82525050565b6131628161422d565b82525050565b61317181614239565b82525050565b61318861318382614239565b614368565b82525050565b6000613199826140a6565b6131a381856140bc565b93506131b38185602086016142a8565b6131bc81614471565b840191505092915050565b60006131d2826140b1565b6131dc81856140d8565b93506131ec8185602086016142a8565b6131f581614471565b840191505092915050565b600061320b826140b1565b61321581856140e9565b93506132258185602086016142a8565b80840191505092915050565b600061323e6032836140d8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006132a46026836140d8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061330a601c836140d8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061334a6014836140d8565b91507f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006000830152602082019050919050565b600061338a6024836140d8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f06019836140d8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613430603a836140d8565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613496601d836140d8565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006134d6602c836140d8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353c6038836140d8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006135a2602a836140d8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136086029836140d8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366e6020836140d8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006136ae602c836140d8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137146020836140d8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137546029836140d8565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ba602f836140d8565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006138206014836140d8565b91507f5075626c69632073616c6520696e6163746976650000000000000000000000006000830152602082019050919050565b60006138606021836140d8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c6604c836140d8565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e79206372656160008301527f747572657320666f72207072652d73616c65202862616c616e6365207472616e60208301527f73666572726564206f75742900000000000000000000000000000000000000006040830152606082019050919050565b60006139526032836140d8565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e79206372656160008301527f747572657320666f72207072652d73616c6500000000000000000000000000006020830152604082019050919050565b60006139b86010836140d8565b91507f50726573616c6520696e616374697665000000000000000000000000000000006000830152602082019050919050565b60006139f86000836140cd565b9150600082019050919050565b6000613a126014836140d8565b91507f4d617820737570706c79206578636565646564210000000000000000000000006000830152602082019050919050565b6000613a526031836140d8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613ab86023836140d8565b91507f596f75277265206e6f742077686974656c697374656420666f7220707265736160008301527f6c652100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b1e6014836140d8565b91507f4e6f7420656e6f756768206574682073656e74210000000000000000000000006000830152602082019050919050565b613b5a8161428f565b82525050565b6000613b6c8284613142565b60148201915081905092915050565b6000613b878285613177565b602082019150613b978284613177565b6020820191508190509392505050565b6000613bb38285613200565b9150613bbf8284613200565b91508190509392505050565b6000613bd6826139eb565b9150819050919050565b6000602082019050613bf56000830184613133565b92915050565b6000602082019050613c106000830184613124565b92915050565b6000608082019050613c2b6000830187613133565b613c386020830186613133565b613c456040830185613b51565b8181036060830152613c57818461318e565b905095945050505050565b6000602082019050613c776000830184613159565b92915050565b6000602082019050613c926000830184613168565b92915050565b60006020820190508181036000830152613cb281846131c7565b905092915050565b60006020820190508181036000830152613cd381613231565b9050919050565b60006020820190508181036000830152613cf381613297565b9050919050565b60006020820190508181036000830152613d13816132fd565b9050919050565b60006020820190508181036000830152613d338161333d565b9050919050565b60006020820190508181036000830152613d538161337d565b9050919050565b60006020820190508181036000830152613d73816133e3565b9050919050565b60006020820190508181036000830152613d9381613423565b9050919050565b60006020820190508181036000830152613db381613489565b9050919050565b60006020820190508181036000830152613dd3816134c9565b9050919050565b60006020820190508181036000830152613df38161352f565b9050919050565b60006020820190508181036000830152613e1381613595565b9050919050565b60006020820190508181036000830152613e33816135fb565b9050919050565b60006020820190508181036000830152613e5381613661565b9050919050565b60006020820190508181036000830152613e73816136a1565b9050919050565b60006020820190508181036000830152613e9381613707565b9050919050565b60006020820190508181036000830152613eb381613747565b9050919050565b60006020820190508181036000830152613ed3816137ad565b9050919050565b60006020820190508181036000830152613ef381613813565b9050919050565b60006020820190508181036000830152613f1381613853565b9050919050565b60006020820190508181036000830152613f33816138b9565b9050919050565b60006020820190508181036000830152613f5381613945565b9050919050565b60006020820190508181036000830152613f73816139ab565b9050919050565b60006020820190508181036000830152613f9381613a05565b9050919050565b60006020820190508181036000830152613fb381613a45565b9050919050565b60006020820190508181036000830152613fd381613aab565b9050919050565b60006020820190508181036000830152613ff381613b11565b9050919050565b600060208201905061400f6000830184613b51565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561403c5761403b614442565b5b8060405250919050565b600067ffffffffffffffff82111561406157614060614442565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561409157614090614442565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140ff8261428f565b915061410a8361428f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413f5761413e6143b5565b5b828201905092915050565b60006141558261428f565b91506141608361428f565b9250826141705761416f6143e4565b5b828204905092915050565b60006141868261428f565b91506141918361428f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ca576141c96143b5565b5b828202905092915050565b60006141e08261428f565b91506141eb8361428f565b9250828210156141fe576141fd6143b5565b5b828203905092915050565b60006142148261426f565b9050919050565b60006142268261426f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142c65780820151818401526020810190506142ab565b838111156142d5576000848401525b50505050565b600060028204905060018216806142f357607f821691505b6020821081141561430757614306614413565b5b50919050565b60006143188261428f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561434b5761434a6143b5565b5b600182019050919050565b600061436182614372565b9050919050565b6000819050919050565b600061437d82614482565b9050919050565b600061438f8261428f565b915061439a8361428f565b9250826143aa576143a96143e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61449881614209565b81146144a357600080fd5b50565b6144af8161422d565b81146144ba57600080fd5b50565b6144c681614239565b81146144d157600080fd5b50565b6144dd81614243565b81146144e857600080fd5b50565b6144f48161428f565b81146144ff57600080fd5b5056fea26469706673582212207c171d94be59269c2692a066b814cf7bf8fb07848394ecf662fe4e1e21b7d26164736f6c63430008000033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636373a6b111610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c51461077f578063eb8d2444146107bc578063f2fde38b146107e7578063f7ea21b214610810578063ffe630b51461084d5761021a565b8063b88d4fde146106a7578063c87b56dd146106d0578063d2cab0561461070d578063d4d20d5914610729578063e927fc5c146107545761021a565b80637cb64759116100f25780637cb64759146105e35780638da5cb5b1461060c57806395d89b4114610637578063a0712d6814610662578063a22cb4651461067e5761021a565b80636373a6b11461053957806370a0823114610564578063715018a6146105a15780637759e29f146105b85761021a565b80632b935c0f116101a65780633ccfd60b116101755780633ccfd60b1461046a57806342842e0e1461048157806344a0d68a146104aa57806355f804b3146104d35780636352211e146104fc5761021a565b80632b935c0f146103be5780632eb4a7ab146103e957806330f72cd4146104145780633ad10ef61461043f5761021a565b80630d95ccc9116101ed5780630d95ccc9146102ed57806313faede61461031657806318160ddd146103415780631d2e5a3a1461036c57806323b872dd146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613010565b610876565b6040516102539190613c62565b60405180910390f35b34801561026857600080fd5b50610271610958565b60405161027e9190613c98565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906130a3565b6109ea565b6040516102bb9190613be0565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612f82565b610a6f565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612fbe565b610b87565b005b34801561032257600080fd5b5061032b610c20565b6040516103389190613ffa565b60405180910390f35b34801561034d57600080fd5b50610356610c26565b6040516103639190613ffa565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190612fbe565b610c37565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612e7c565b610cd0565b005b3480156103ca57600080fd5b506103d3610d30565b6040516103e09190613ffa565b60405180910390f35b3480156103f557600080fd5b506103fe610d36565b60405161040b9190613c7d565b60405180910390f35b34801561042057600080fd5b50610429610d3c565b6040516104369190613c62565b60405180910390f35b34801561044b57600080fd5b50610454610d4f565b6040516104619190613bfb565b60405180910390f35b34801561047657600080fd5b5061047f610d73565b005b34801561048d57600080fd5b506104a860048036038101906104a39190612e7c565b610e97565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906130a3565b610eb7565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613062565b610f3d565b005b34801561050857600080fd5b50610523600480360381019061051e91906130a3565b610fd3565b6040516105309190613be0565b60405180910390f35b34801561054557600080fd5b5061054e611085565b60405161055b9190613c98565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190612e17565b611113565b6040516105989190613ffa565b60405180910390f35b3480156105ad57600080fd5b506105b66111cb565b005b3480156105c457600080fd5b506105cd611253565b6040516105da9190613ffa565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190612fe7565b611259565b005b34801561061857600080fd5b506106216112df565b60405161062e9190613be0565b60405180910390f35b34801561064357600080fd5b5061064c611309565b6040516106599190613c98565b60405180910390f35b61067c600480360381019061067791906130a3565b61139b565b005b34801561068a57600080fd5b506106a560048036038101906106a09190612f46565b6114f1565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190612ecb565b611507565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906130a3565b611569565b6040516107049190613c98565b60405180910390f35b610727600480360381019061072291906130cc565b611610565b005b34801561073557600080fd5b5061073e61195c565b60405161074b9190613ffa565b60405180910390f35b34801561076057600080fd5b50610769611962565b6040516107769190613bfb565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190612e40565b611986565b6040516107b39190613c62565b60405180910390f35b3480156107c857600080fd5b506107d1611a1a565b6040516107de9190613c62565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612e17565b611a2d565b005b34801561081c57600080fd5b5061083760048036038101906108329190612e17565b611b25565b6040516108449190613ffa565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613062565b611b3d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610951575061095082611c0a565b5b9050919050565b606060008054610967906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054610993906142db565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b60006109f582611c74565b610a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2b90613e5a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7a82610fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae290613efa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0a611ce0565b73ffffffffffffffffffffffffffffffffffffffff161480610b395750610b3881610b33611ce0565b611986565b5b610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f90613dda565b60405180910390fd5b610b828383611ce8565b505050565b610b8f611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610bad6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613e7a565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b60085481565b6000610c326007611be9565b905090565b610c3f611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610c5d6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613e7a565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610ce1610cdb611ce0565b82611da1565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613f9a565b60405180910390fd5b610d2b838383611e7f565b505050565b600a5481565b60105481565b600e60019054906101000a900460ff1681565b7f00000000000000000000000015c560d2d9eb3af98524aa73becba43e9e6cef0281565b610d7b611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610d996112df565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613e7a565b60405180910390fd5b6000479050610e447f000000000000000000000000ef2722dc49c30cac62ada0a8d7bca1847c0dcaac610e3f6064610e31605f866120db90919063ffffffff16565b6120f190919063ffffffff16565b612107565b610e947f00000000000000000000000015c560d2d9eb3af98524aa73becba43e9e6cef02610e8f6064610e816005866120db90919063ffffffff16565b6120f190919063ffffffff16565b612107565b50565b610eb283838360405180602001604052806000815250611507565b505050565b610ebf611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610edd6112df565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613e7a565b60405180910390fd5b8060088190555050565b610f45611ce0565b73ffffffffffffffffffffffffffffffffffffffff16610f636112df565b73ffffffffffffffffffffffffffffffffffffffff1614610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090613e7a565b60405180910390fd5b80600d9080519060200190610fcf929190612bdc565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390613e1a565b60405180910390fd5b80915050919050565b600c8054611092906142db565b80601f01602080910402602001604051908101604052809291908181526020018280546110be906142db565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90613dfa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d3611ce0565b73ffffffffffffffffffffffffffffffffffffffff166111f16112df565b73ffffffffffffffffffffffffffffffffffffffff1614611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613e7a565b60405180910390fd5b61125160006121fb565b565b600b5481565b611261611ce0565b73ffffffffffffffffffffffffffffffffffffffff1661127f6112df565b73ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613e7a565b60405180910390fd5b8060108190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611318906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054611344906142db565b80156113915780601f1061136657610100808354040283529160200191611391565b820191906000526020600020905b81548152906001019060200180831161137457829003601f168201915b5050505050905090565b806000811180156113ad5750600a5481105b6113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613d1a565b60405180910390fd5b600954816113fa6007611be9565b61140491906140f4565b10611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613f7a565b60405180910390fd5b80600854611452919061417b565b341015611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90613fda565b60405180910390fd5b600e60009054906101000a900460ff166114e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114da90613eda565b60405180910390fd5b6114ed33836122c1565b5050565b6115036114fc611ce0565b8383612301565b5050565b611518611512611ce0565b83611da1565b611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613f9a565b60405180910390fd5b6115638484848461246e565b50505050565b606061157482611c74565b6115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613eba565b60405180910390fd5b60006115bd6124ca565b905060008151116115dd5760405180602001604052806000815250611608565b806115e78461255c565b6040516020016115f8929190613ba7565b6040516020818303038152906040525b915050919050565b826000811180156116225750600a5481105b611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613d1a565b60405180910390fd5b6009548161166f6007611be9565b61167991906140f4565b106116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613f7a565b60405180910390fd5b806008546116c7919061417b565b341015611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613fda565b60405180910390fd5b600e60019054906101000a900460ff16611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90613f5a565b60405180910390fd5b600b548461176533611113565b61176f91906140f4565b106117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f3a565b60405180910390fd5b600b5484600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117fd91906140f4565b1061183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613f1a565b60405180910390fd5b6000336040516020016118509190613b60565b6040516020818303038152906040528051906020012090506118b6848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612709565b6118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613fba565b60405180910390fd5b6118ff33866122c1565b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461194e91906140f4565b925050819055505050505050565b60095481565b7f000000000000000000000000ef2722dc49c30cac62ada0a8d7bca1847c0dcaac81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b611a35611ce0565b73ffffffffffffffffffffffffffffffffffffffff16611a536112df565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613e7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090613cda565b60405180910390fd5b611b22816121fb565b50565b600f6020528060005260406000206000915090505481565b611b45611ce0565b73ffffffffffffffffffffffffffffffffffffffff16611b636112df565b73ffffffffffffffffffffffffffffffffffffffff1614611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb090613e7a565b60405180910390fd5b80600c9080519060200190611bcf929190612bdc565b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5b83610fd3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dac82611c74565b611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290613dba565b60405180910390fd5b6000611df683610fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6557508373ffffffffffffffffffffffffffffffffffffffff16611e4d846109ea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e765750611e758185611986565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9f82610fd3565b73ffffffffffffffffffffffffffffffffffffffff1614611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613e9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90613d3a565b60405180910390fd5b611f70838383612720565b611f7b600082611ce8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fcb91906141d5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202291906140f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836120e9919061417b565b905092915050565b600081836120ff919061414a565b905092915050565b8047101561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190613d9a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161217090613bcb565b60006040518083038185875af1925050503d80600081146121ad576040519150601f19603f3d011682016040523d82523d6000602084013e6121b2565b606091505b50509050806121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90613d7a565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156122fc576122d66007611bd3565b6122e9836122e46007611be9565b612725565b80806122f49061430d565b9150506122c4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236790613d5a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124619190613c62565b60405180910390a3505050565b612479848484611e7f565b61248584848484612743565b6124c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bb90613cba565b60405180910390fd5b50505050565b6060600d80546124d9906142db565b80601f0160208091040260200160405190810160405280929190818152602001828054612505906142db565b80156125525780601f1061252757610100808354040283529160200191612552565b820191906000526020600020905b81548152906001019060200180831161253557829003601f168201915b5050505050905090565b606060008214156125a4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612704565b600082905060005b600082146125d65780806125bf9061430d565b915050600a826125cf919061414a565b91506125ac565b60008167ffffffffffffffff811115612618577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264a5781602001600182028036833780820191505090505b5090505b600085146126fd5760018261266391906141d5565b9150600a856126729190614384565b603061267e91906140f4565b60f81b8183815181106126ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f6919061414a565b945061264e565b8093505050505b919050565b60008261271685846128da565b1490509392505050565b505050565b61273f8282604051806020016040528060008152506129b3565b5050565b60006127648473ffffffffffffffffffffffffffffffffffffffff16611bf7565b156128cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261278d611ce0565b8786866040518563ffffffff1660e01b81526004016127af9493929190613c16565b602060405180830381600087803b1580156127c957600080fd5b505af19250505080156127fa57506040513d601f19601f820116820180604052508101906127f79190613039565b60015b61287d573d806000811461282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b50600081511415612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286c90613cba565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d2565b600190505b949350505050565b60008082905060005b84518110156129a8576000858281518110612927577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161296857828160405160200161294b929190613b7b565b604051602081830303815290604052805190602001209250612994565b808360405160200161297b929190613b7b565b6040516020818303038152906040528051906020012092505b5080806129a09061430d565b9150506128e3565b508091505092915050565b6129bd8383612a0e565b6129ca6000848484612743565b612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090613cba565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590613e3a565b60405180910390fd5b612a8781611c74565b15612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe90613cfa565b60405180910390fd5b612ad360008383612720565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2391906140f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612be8906142db565b90600052602060002090601f016020900481019282612c0a5760008555612c51565b82601f10612c2357805160ff1916838001178555612c51565b82800160010185558215612c51579182015b82811115612c50578251825591602001919060010190612c35565b5b509050612c5e9190612c62565b5090565b5b80821115612c7b576000816000905550600101612c63565b5090565b6000612c92612c8d84614046565b614015565b905082815260208101848484011115612caa57600080fd5b612cb5848285614299565b509392505050565b6000612cd0612ccb84614076565b614015565b905082815260208101848484011115612ce857600080fd5b612cf3848285614299565b509392505050565b600081359050612d0a8161448f565b92915050565b60008083601f840112612d2257600080fd5b8235905067ffffffffffffffff811115612d3b57600080fd5b602083019150836020820283011115612d5357600080fd5b9250929050565b600081359050612d69816144a6565b92915050565b600081359050612d7e816144bd565b92915050565b600081359050612d93816144d4565b92915050565b600081519050612da8816144d4565b92915050565b600082601f830112612dbf57600080fd5b8135612dcf848260208601612c7f565b91505092915050565b600082601f830112612de957600080fd5b8135612df9848260208601612cbd565b91505092915050565b600081359050612e11816144eb565b92915050565b600060208284031215612e2957600080fd5b6000612e3784828501612cfb565b91505092915050565b60008060408385031215612e5357600080fd5b6000612e6185828601612cfb565b9250506020612e7285828601612cfb565b9150509250929050565b600080600060608486031215612e9157600080fd5b6000612e9f86828701612cfb565b9350506020612eb086828701612cfb565b9250506040612ec186828701612e02565b9150509250925092565b60008060008060808587031215612ee157600080fd5b6000612eef87828801612cfb565b9450506020612f0087828801612cfb565b9350506040612f1187828801612e02565b925050606085013567ffffffffffffffff811115612f2e57600080fd5b612f3a87828801612dae565b91505092959194509250565b60008060408385031215612f5957600080fd5b6000612f6785828601612cfb565b9250506020612f7885828601612d5a565b9150509250929050565b60008060408385031215612f9557600080fd5b6000612fa385828601612cfb565b9250506020612fb485828601612e02565b9150509250929050565b600060208284031215612fd057600080fd5b6000612fde84828501612d5a565b91505092915050565b600060208284031215612ff957600080fd5b600061300784828501612d6f565b91505092915050565b60006020828403121561302257600080fd5b600061303084828501612d84565b91505092915050565b60006020828403121561304b57600080fd5b600061305984828501612d99565b91505092915050565b60006020828403121561307457600080fd5b600082013567ffffffffffffffff81111561308e57600080fd5b61309a84828501612dd8565b91505092915050565b6000602082840312156130b557600080fd5b60006130c384828501612e02565b91505092915050565b6000806000604084860312156130e157600080fd5b60006130ef86828701612e02565b935050602084013567ffffffffffffffff81111561310c57600080fd5b61311886828701612d10565b92509250509250925092565b61312d8161421b565b82525050565b61313c81614209565b82525050565b61315361314e82614209565b614356565b82525050565b6131628161422d565b82525050565b61317181614239565b82525050565b61318861318382614239565b614368565b82525050565b6000613199826140a6565b6131a381856140bc565b93506131b38185602086016142a8565b6131bc81614471565b840191505092915050565b60006131d2826140b1565b6131dc81856140d8565b93506131ec8185602086016142a8565b6131f581614471565b840191505092915050565b600061320b826140b1565b61321581856140e9565b93506132258185602086016142a8565b80840191505092915050565b600061323e6032836140d8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006132a46026836140d8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061330a601c836140d8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061334a6014836140d8565b91507f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006000830152602082019050919050565b600061338a6024836140d8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133f06019836140d8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613430603a836140d8565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613496601d836140d8565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006134d6602c836140d8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353c6038836140d8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006135a2602a836140d8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136086029836140d8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366e6020836140d8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006136ae602c836140d8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137146020836140d8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137546029836140d8565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ba602f836140d8565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006138206014836140d8565b91507f5075626c69632073616c6520696e6163746976650000000000000000000000006000830152602082019050919050565b60006138606021836140d8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c6604c836140d8565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e79206372656160008301527f747572657320666f72207072652d73616c65202862616c616e6365207472616e60208301527f73666572726564206f75742900000000000000000000000000000000000000006040830152606082019050919050565b60006139526032836140d8565b91507f417474656d7074696e6720746f206d696e7420746f6f206d616e79206372656160008301527f747572657320666f72207072652d73616c6500000000000000000000000000006020830152604082019050919050565b60006139b86010836140d8565b91507f50726573616c6520696e616374697665000000000000000000000000000000006000830152602082019050919050565b60006139f86000836140cd565b9150600082019050919050565b6000613a126014836140d8565b91507f4d617820737570706c79206578636565646564210000000000000000000000006000830152602082019050919050565b6000613a526031836140d8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613ab86023836140d8565b91507f596f75277265206e6f742077686974656c697374656420666f7220707265736160008301527f6c652100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b1e6014836140d8565b91507f4e6f7420656e6f756768206574682073656e74210000000000000000000000006000830152602082019050919050565b613b5a8161428f565b82525050565b6000613b6c8284613142565b60148201915081905092915050565b6000613b878285613177565b602082019150613b978284613177565b6020820191508190509392505050565b6000613bb38285613200565b9150613bbf8284613200565b91508190509392505050565b6000613bd6826139eb565b9150819050919050565b6000602082019050613bf56000830184613133565b92915050565b6000602082019050613c106000830184613124565b92915050565b6000608082019050613c2b6000830187613133565b613c386020830186613133565b613c456040830185613b51565b8181036060830152613c57818461318e565b905095945050505050565b6000602082019050613c776000830184613159565b92915050565b6000602082019050613c926000830184613168565b92915050565b60006020820190508181036000830152613cb281846131c7565b905092915050565b60006020820190508181036000830152613cd381613231565b9050919050565b60006020820190508181036000830152613cf381613297565b9050919050565b60006020820190508181036000830152613d13816132fd565b9050919050565b60006020820190508181036000830152613d338161333d565b9050919050565b60006020820190508181036000830152613d538161337d565b9050919050565b60006020820190508181036000830152613d73816133e3565b9050919050565b60006020820190508181036000830152613d9381613423565b9050919050565b60006020820190508181036000830152613db381613489565b9050919050565b60006020820190508181036000830152613dd3816134c9565b9050919050565b60006020820190508181036000830152613df38161352f565b9050919050565b60006020820190508181036000830152613e1381613595565b9050919050565b60006020820190508181036000830152613e33816135fb565b9050919050565b60006020820190508181036000830152613e5381613661565b9050919050565b60006020820190508181036000830152613e73816136a1565b9050919050565b60006020820190508181036000830152613e9381613707565b9050919050565b60006020820190508181036000830152613eb381613747565b9050919050565b60006020820190508181036000830152613ed3816137ad565b9050919050565b60006020820190508181036000830152613ef381613813565b9050919050565b60006020820190508181036000830152613f1381613853565b9050919050565b60006020820190508181036000830152613f33816138b9565b9050919050565b60006020820190508181036000830152613f5381613945565b9050919050565b60006020820190508181036000830152613f73816139ab565b9050919050565b60006020820190508181036000830152613f9381613a05565b9050919050565b60006020820190508181036000830152613fb381613a45565b9050919050565b60006020820190508181036000830152613fd381613aab565b9050919050565b60006020820190508181036000830152613ff381613b11565b9050919050565b600060208201905061400f6000830184613b51565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561403c5761403b614442565b5b8060405250919050565b600067ffffffffffffffff82111561406157614060614442565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561409157614090614442565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140ff8261428f565b915061410a8361428f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413f5761413e6143b5565b5b828201905092915050565b60006141558261428f565b91506141608361428f565b9250826141705761416f6143e4565b5b828204905092915050565b60006141868261428f565b91506141918361428f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ca576141c96143b5565b5b828202905092915050565b60006141e08261428f565b91506141eb8361428f565b9250828210156141fe576141fd6143b5565b5b828203905092915050565b60006142148261426f565b9050919050565b60006142268261426f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142c65780820151818401526020810190506142ab565b838111156142d5576000848401525b50505050565b600060028204905060018216806142f357607f821691505b6020821081141561430757614306614413565b5b50919050565b60006143188261428f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561434b5761434a6143b5565b5b600182019050919050565b600061436182614372565b9050919050565b6000819050919050565b600061437d82614482565b9050919050565b600061438f8261428f565b915061439a8361428f565b9250826143aa576143a96143e4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61449881614209565b81146144a357600080fd5b50565b6144af8161422d565b81146144ba57600080fd5b50565b6144c681614239565b81146144d157600080fd5b50565b6144dd81614243565b81146144e857600080fd5b50565b6144f48161428f565b81146144ff57600080fd5b5056fea26469706673582212207c171d94be59269c2692a066b814cf7bf8fb07848394ecf662fe4e1e21b7d26164736f6c63430008000033

Deployed Bytecode Sourcemap

49271:3499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34402:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35347:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36906:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36429:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51814:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49432:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50523:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51723:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37656:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49510:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50026:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49704:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49863:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52543:222;;;;;;;;;;;;;:::i;:::-;;38066:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52019:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52315:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35041:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49608:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34771:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15390:103;;;;;;;;;;;;;:::i;:::-;;49555:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50618:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14739:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35516:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51539:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37199:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38322:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35691:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50793:740;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49467:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49757:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37425:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49675:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15648:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49967:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51911:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34402:305;34504:4;34556:25;34541:40;;;:11;:40;;;;:105;;;;34613:33;34598:48;;;:11;:48;;;;34541:105;:158;;;;34663:36;34687:11;34663:23;:36::i;:::-;34541:158;34521:178;;34402:305;;;:::o;35347:100::-;35401:13;35434:5;35427:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35347:100;:::o;36906:221::-;36982:7;37010:16;37018:7;37010;:16::i;:::-;37002:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37095:15;:24;37111:7;37095:24;;;;;;;;;;;;;;;;;;;;;37088:31;;36906:221;;;:::o;36429:411::-;36510:13;36526:23;36541:7;36526:14;:23::i;:::-;36510:39;;36574:5;36568:11;;:2;:11;;;;36560:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36668:5;36652:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36677:37;36694:5;36701:12;:10;:12::i;:::-;36677:16;:37::i;:::-;36652:62;36630:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36811:21;36820:2;36824:7;36811:8;:21::i;:::-;36429:411;;;:::o;51814:91::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51891:8:::1;51873:15;;:26;;;;;;;;;;;;;;;;;;51814:91:::0;:::o;49432:30::-;;;;:::o;50523:89::-;50567:7;50590:16;:6;:14;:16::i;:::-;50583:23;;50523:89;:::o;51723:85::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51794:8:::1;51779:12;;:23;;;;;;;;;;;;;;;;;;51723:85:::0;:::o;37656:339::-;37851:41;37870:12;:10;:12::i;:::-;37884:7;37851:18;:41::i;:::-;37843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37959:28;37969:4;37975:2;37979:7;37959:9;:28::i;:::-;37656:339;;;:::o;49510:40::-;;;;:::o;50026:25::-;;;;:::o;49704:27::-;;;;;;;;;;;;;:::o;49863:97::-;;;:::o;52543:222::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52589:15:::1;52607:21;52589:39;;52637:59;52655:14;52671:24;52691:3;52671:15;52683:2;52671:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;52637:17;:59::i;:::-;52705:54;52723:10;52735:23;52754:3;52735:14;52747:1;52735:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;52705:17;:54::i;:::-;15030:1;52543:222::o:0;38066:185::-;38204:39;38221:4;38227:2;38231:7;38204:39;;;;;;;;;;;;:16;:39::i;:::-;38066:185;;;:::o;52019:80::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52085:8:::1;52078:4;:15;;;;52019:80:::0;:::o;52315:105::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52406:8:::1;52387:16;:27;;;;;;;;;;;;:::i;:::-;;52315:105:::0;:::o;35041:239::-;35113:7;35133:13;35149:7;:16;35157:7;35149:16;;;;;;;;;;;;;;;;;;;;;35133:32;;35201:1;35184:19;;:5;:19;;;;35176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35267:5;35260:12;;;35041:239;;;:::o;49608:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34771:208::-;34843:7;34888:1;34871:19;;:5;:19;;;;34863:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34955:9;:16;34965:5;34955:16;;;;;;;;;;;;;;;;34948:23;;34771:208;;;:::o;15390:103::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15455:30:::1;15482:1;15455:18;:30::i;:::-;15390:103::o:0;49555:46::-;;;;:::o;50618:169::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50770:11:::1;50757:10;:24;;;;50618:169:::0;:::o;14739:87::-;14785:7;14812:6;;;;;;;;;;;14805:13;;14739:87;:::o;35516:104::-;35572:13;35605:7;35598:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35516:104;:::o;51539:178::-;51604:11;50279:1;50265:11;:15;:53;;;;;50298:20;;50284:11;:34;50265:53;50257:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;50391:16;;50377:11;50358:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:49;50350:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50467:11;50460:4;;:18;;;;:::i;:::-;50447:9;:31;;50439:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51633:12:::1;;;;;;;;;;;51624:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51677:34;51687:10;51699:11;51677:9;:34::i;:::-;51539:178:::0;;:::o;37199:155::-;37294:52;37313:12;:10;:12::i;:::-;37327:8;37337;37294:18;:52::i;:::-;37199:155;;:::o;38322:328::-;38497:41;38516:12;:10;:12::i;:::-;38530:7;38497:18;:41::i;:::-;38489:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38603:39;38617:4;38623:2;38627:7;38636:5;38603:13;:39::i;:::-;38322:328;;;;:::o;35691:334::-;35764:13;35798:16;35806:7;35798;:16::i;:::-;35790:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35879:21;35903:10;:8;:10::i;:::-;35879:34;;35955:1;35937:7;35931:21;:25;:86;;;;;;;;;;;;;;;;;35983:7;35992:18;:7;:16;:18::i;:::-;35966:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35931:86;35924:93;;;35691:334;;;:::o;50793:740::-;50899:11;50279:1;50265:11;:15;:53;;;;;50298:20;;50284:11;:34;50265:53;50257:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;50391:16;;50377:11;50358:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:49;50350:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50467:11;50460:4;;:18;;;;:::i;:::-;50447:9;:31;;50439:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50928:15:::1;;;;;;;;;;;50919:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51017:27;;51003:11;50979:21;50989:10;50979:9;:21::i;:::-;:35;;;;:::i;:::-;:65;50971:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;51160:27;;51146:11;51114:17;:29;51132:10;51114:29;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:73;51106:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;51277:12;51319:10;51302:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51292:39;;;;;;51277:54;;51346:49;51365:11;;51346:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51378:10;;51390:4;51346:18;:49::i;:::-;51338:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51442:34;51452:10;51464:11;51442:9;:34::i;:::-;51516:11;51483:17;:29;51501:10;51483:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;50510:1;50793:740:::0;;;;:::o;49467:38::-;;;;:::o;49757:101::-;;;:::o;37425:164::-;37522:4;37546:18;:25;37565:5;37546:25;;;;;;;;;;;;;;;:35;37572:8;37546:35;;;;;;;;;;;;;;;;;;;;;;;;;37539:42;;37425:164;;;;:::o;49675:24::-;;;;;;;;;;;;;:::o;15648:201::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15757:1:::1;15737:22;;:8;:22;;;;15729:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15813:28;15832:8;15813:18;:28::i;:::-;15648:201:::0;:::o;49967:52::-;;;;;;;;;;;;;;;;;:::o;51911:102::-;14970:12;:10;:12::i;:::-;14959:23;;:7;:5;:7::i;:::-;:23;;;14951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51997:10:::1;51984;:23;;;;;;;;;;;;:::i;:::-;;51911:102:::0;:::o;10189:127::-;10296:1;10278:7;:14;;;:19;;;;;;;;;;;10189:127;:::o;10067:114::-;10132:7;10159;:14;;;10152:21;;10067:114;;;:::o;17027:387::-;17087:4;17295:12;17362:7;17350:20;17342:28;;17405:1;17398:4;:8;17391:15;;;17027:387;;;:::o;27171:157::-;27256:4;27295:25;27280:40;;;:11;:40;;;;27273:47;;27171:157;;;:::o;40160:127::-;40225:4;40277:1;40249:30;;:7;:16;40257:7;40249:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40242:37;;40160:127;;;:::o;13463:98::-;13516:7;13543:10;13536:17;;13463:98;:::o;44142:174::-;44244:2;44217:15;:24;44233:7;44217:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44300:7;44296:2;44262:46;;44271:23;44286:7;44271:14;:23::i;:::-;44262:46;;;;;;;;;;;;44142:174;;:::o;40454:348::-;40547:4;40572:16;40580:7;40572;:16::i;:::-;40564:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40648:13;40664:23;40679:7;40664:14;:23::i;:::-;40648:39;;40717:5;40706:16;;:7;:16;;;:51;;;;40750:7;40726:31;;:20;40738:7;40726:11;:20::i;:::-;:31;;;40706:51;:87;;;;40761:32;40778:5;40785:7;40761:16;:32::i;:::-;40706:87;40698:96;;;40454:348;;;;:::o;43446:578::-;43605:4;43578:31;;:23;43593:7;43578:14;:23::i;:::-;:31;;;43570:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43688:1;43674:16;;:2;:16;;;;43666:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43744:39;43765:4;43771:2;43775:7;43744:20;:39::i;:::-;43848:29;43865:1;43869:7;43848:8;:29::i;:::-;43909:1;43890:9;:15;43900:4;43890:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43938:1;43921:9;:13;43931:2;43921:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43969:2;43950:7;:16;43958:7;43950:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44008:7;44004:2;43989:27;;43998:4;43989:27;;;;;;;;;;;;43446:578;;;:::o;5768:98::-;5826:7;5857:1;5853;:5;;;;:::i;:::-;5846:12;;5768:98;;;;:::o;6167:::-;6225:7;6256:1;6252;:5;;;;:::i;:::-;6245:12;;6167:98;;;;:::o;18349:317::-;18464:6;18439:21;:31;;18431:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18518:12;18536:9;:14;;18558:6;18536:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18517:52;;;18588:7;18580:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;18349:317;;;:::o;16009:191::-;16083:16;16102:6;;;;;;;;;;;16083:25;;16128:8;16119:6;;:17;;;;;;;;;;;;;;;;;;16183:8;16152:40;;16173:8;16152:40;;;;;;;;;;;;16009:191;;:::o;52105:204::-;52185:9;52180:124;52204:11;52200:1;:15;52180:124;;;52231:18;:6;:16;:18::i;:::-;52258:38;52268:9;52279:16;:6;:14;:16::i;:::-;52258:9;:38::i;:::-;52217:3;;;;;:::i;:::-;;;;52180:124;;;;52105:204;;:::o;44458:315::-;44613:8;44604:17;;:5;:17;;;;44596:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44700:8;44662:18;:25;44681:5;44662:25;;;;;;;;;;;;;;;:35;44688:8;44662:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44746:8;44724:41;;44739:5;44724:41;;;44756:8;44724:41;;;;;;:::i;:::-;;;;;;;;44458:315;;;:::o;39532:::-;39689:28;39699:4;39705:2;39709:7;39689:9;:28::i;:::-;39736:48;39759:4;39765:2;39769:7;39778:5;39736:22;:48::i;:::-;39728:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39532:315;;;;:::o;52426:111::-;52486:13;52515:16;52508:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52426:111;:::o;11025:723::-;11081:13;11311:1;11302:5;:10;11298:53;;;11329:10;;;;;;;;;;;;;;;;;;;;;11298:53;11361:12;11376:5;11361:20;;11392:14;11417:78;11432:1;11424:4;:9;11417:78;;11450:8;;;;;:::i;:::-;;;;11481:2;11473:10;;;;;:::i;:::-;;;11417:78;;;11505:19;11537:6;11527:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11505:39;;11555:154;11571:1;11562:5;:10;11555:154;;11599:1;11589:11;;;;;:::i;:::-;;;11666:2;11658:5;:10;;;;:::i;:::-;11645:2;:24;;;;:::i;:::-;11632:39;;11615:6;11622;11615:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;11695:2;11686:11;;;;;:::i;:::-;;;11555:154;;;11733:6;11719:21;;;;;11025:723;;;;:::o;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;1050:40;;908:190;;;;;:::o;46709:126::-;;;;:::o;41144:110::-;41220:26;41230:2;41234:7;41220:26;;;;;;;;;;;;:9;:26::i;:::-;41144:110;;:::o;45338:799::-;45493:4;45514:15;:2;:13;;;:15::i;:::-;45510:620;;;45566:2;45550:36;;;45587:12;:10;:12::i;:::-;45601:4;45607:7;45616:5;45550:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45546:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45809:1;45792:6;:13;:18;45788:272;;;45835:60;;;;;;;;;;:::i;:::-;;;;;;;;45788:272;46010:6;46004:13;45995:6;45991:2;45987:15;45980:38;45546:529;45683:41;;;45673:51;;;:6;:51;;;;45666:58;;;;;45510:620;46114:4;46107:11;;45338:799;;;;;;;:::o;1460:701::-;1543:7;1563:20;1586:4;1563:27;;1606:9;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;;;;;;;;;;;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1879:12;1893;1862:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2069:12;2083;2052:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;1601:523;1639:3;;;;;:::i;:::-;;;;1601:523;;;;2141:12;2134:19;;;1460:701;;;;:::o;41481:321::-;41611:18;41617:2;41621:7;41611:5;:18::i;:::-;41662:54;41693:1;41697:2;41701:7;41710:5;41662:22;:54::i;:::-;41640:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41481:321;;;:::o;42138:382::-;42232:1;42218:16;;:2;:16;;;;42210:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42291:16;42299:7;42291;:16::i;:::-;42290:17;42282:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42353:45;42382:1;42386:2;42390:7;42353:20;:45::i;:::-;42428:1;42411:9;:13;42421:2;42411:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42459:2;42440:7;:16;42448:7;42440:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42504:7;42500:2;42479:33;;42496:1;42479:33;;;;;;;;;;;;42138:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:262::-;;2650:2;2638:9;2629:7;2625:23;2621:32;2618:2;;;2666:1;2663;2656:12;2618:2;2709:1;2734:53;2779:7;2770:6;2759:9;2755:22;2734:53;:::i;:::-;2724:63;;2680:117;2608:196;;;;:::o;2810:407::-;;;2935:2;2923:9;2914:7;2910:23;2906:32;2903:2;;;2951:1;2948;2941:12;2903:2;2994:1;3019:53;3064:7;3055:6;3044:9;3040:22;3019:53;:::i;:::-;3009:63;;2965:117;3121:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3092:118;2893:324;;;;;:::o;3223:552::-;;;;3365:2;3353:9;3344:7;3340:23;3336:32;3333:2;;;3381:1;3378;3371:12;3333:2;3424:1;3449:53;3494:7;3485:6;3474:9;3470:22;3449:53;:::i;:::-;3439:63;;3395:117;3551:2;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3522:118;3679:2;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3650:118;3323:452;;;;;:::o;3781:809::-;;;;;3949:3;3937:9;3928:7;3924:23;3920:33;3917:2;;;3966:1;3963;3956:12;3917:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;4264:2;4290:53;4335:7;4326:6;4315:9;4311:22;4290:53;:::i;:::-;4280:63;;4235:118;4420:2;4409:9;4405:18;4392:32;4451:18;4443:6;4440:30;4437:2;;;4483:1;4480;4473:12;4437:2;4511:62;4565:7;4556:6;4545:9;4541:22;4511:62;:::i;:::-;4501:72;;4363:220;3907:683;;;;;;;:::o;4596:401::-;;;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4748:117;4904:2;4930:50;4972:7;4963:6;4952:9;4948:22;4930:50;:::i;:::-;4920:60;;4875:115;4676:321;;;;;:::o;5003:407::-;;;5128:2;5116:9;5107:7;5103:23;5099:32;5096:2;;;5144:1;5141;5134:12;5096:2;5187:1;5212:53;5257:7;5248:6;5237:9;5233:22;5212:53;:::i;:::-;5202:63;;5158:117;5314:2;5340:53;5385:7;5376:6;5365:9;5361:22;5340:53;:::i;:::-;5330:63;;5285:118;5086:324;;;;;:::o;5416:256::-;;5521:2;5509:9;5500:7;5496:23;5492:32;5489:2;;;5537:1;5534;5527:12;5489:2;5580:1;5605:50;5647:7;5638:6;5627:9;5623:22;5605:50;:::i;:::-;5595:60;;5551:114;5479:193;;;;:::o;5678:262::-;;5786:2;5774:9;5765:7;5761:23;5757:32;5754:2;;;5802:1;5799;5792:12;5754:2;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5744:196;;;;:::o;5946:260::-;;6053:2;6041:9;6032:7;6028:23;6024:32;6021:2;;;6069:1;6066;6059:12;6021:2;6112:1;6137:52;6181:7;6172:6;6161:9;6157:22;6137:52;:::i;:::-;6127:62;;6083:116;6011:195;;;;:::o;6212:282::-;;6330:2;6318:9;6309:7;6305:23;6301:32;6298:2;;;6346:1;6343;6336:12;6298:2;6389:1;6414:63;6469:7;6460:6;6449:9;6445:22;6414:63;:::i;:::-;6404:73;;6360:127;6288:206;;;;:::o;6500:375::-;;6618:2;6606:9;6597:7;6593:23;6589:32;6586:2;;;6634:1;6631;6624:12;6586:2;6705:1;6694:9;6690:17;6677:31;6735:18;6727:6;6724:30;6721:2;;;6767:1;6764;6757:12;6721:2;6795:63;6850:7;6841:6;6830:9;6826:22;6795:63;:::i;:::-;6785:73;;6648:220;6576:299;;;;:::o;6881:262::-;;6989:2;6977:9;6968:7;6964:23;6960:32;6957:2;;;7005:1;7002;6995:12;6957:2;7048:1;7073:53;7118:7;7109:6;7098:9;7094:22;7073:53;:::i;:::-;7063:63;;7019:117;6947:196;;;;:::o;7149:570::-;;;;7309:2;7297:9;7288:7;7284:23;7280:32;7277:2;;;7325:1;7322;7315:12;7277:2;7368:1;7393:53;7438:7;7429:6;7418:9;7414:22;7393:53;:::i;:::-;7383:63;;7339:117;7523:2;7512:9;7508:18;7495:32;7554:18;7546:6;7543:30;7540:2;;;7586:1;7583;7576:12;7540:2;7622:80;7694:7;7685:6;7674:9;7670:22;7622:80;:::i;:::-;7604:98;;;;7466:246;7267:452;;;;;:::o;7725:142::-;7828:32;7854:5;7828:32;:::i;:::-;7823:3;7816:45;7806:61;;:::o;7873:118::-;7960:24;7978:5;7960:24;:::i;:::-;7955:3;7948:37;7938:53;;:::o;7997:157::-;8102:45;8122:24;8140:5;8122:24;:::i;:::-;8102:45;:::i;:::-;8097:3;8090:58;8080:74;;:::o;8160:109::-;8241:21;8256:5;8241:21;:::i;:::-;8236:3;8229:34;8219:50;;:::o;8275:118::-;8362:24;8380:5;8362:24;:::i;:::-;8357:3;8350:37;8340:53;;:::o;8399:157::-;8504:45;8524:24;8542:5;8524:24;:::i;:::-;8504:45;:::i;:::-;8499:3;8492:58;8482:74;;:::o;8562:360::-;;8676:38;8708:5;8676:38;:::i;:::-;8730:70;8793:6;8788:3;8730:70;:::i;:::-;8723:77;;8809:52;8854:6;8849:3;8842:4;8835:5;8831:16;8809:52;:::i;:::-;8886:29;8908:6;8886:29;:::i;:::-;8881:3;8877:39;8870:46;;8652:270;;;;;:::o;8928:364::-;;9044:39;9077:5;9044:39;:::i;:::-;9099:71;9163:6;9158:3;9099:71;:::i;:::-;9092:78;;9179:52;9224:6;9219:3;9212:4;9205:5;9201:16;9179:52;:::i;:::-;9256:29;9278:6;9256:29;:::i;:::-;9251:3;9247:39;9240:46;;9020:272;;;;;:::o;9298:377::-;;9432:39;9465:5;9432:39;:::i;:::-;9487:89;9569:6;9564:3;9487:89;:::i;:::-;9480:96;;9585:52;9630:6;9625:3;9618:4;9611:5;9607:16;9585:52;:::i;:::-;9662:6;9657:3;9653:16;9646:23;;9408:267;;;;;:::o;9681:382::-;;9844:67;9908:2;9903:3;9844:67;:::i;:::-;9837:74;;9941:34;9937:1;9932:3;9928:11;9921:55;10007:20;10002:2;9997:3;9993:12;9986:42;10054:2;10049:3;10045:12;10038:19;;9827:236;;;:::o;10069:370::-;;10232:67;10296:2;10291:3;10232:67;:::i;:::-;10225:74;;10329:34;10325:1;10320:3;10316:11;10309:55;10395:8;10390:2;10385:3;10381:12;10374:30;10430:2;10425:3;10421:12;10414:19;;10215:224;;;:::o;10445:326::-;;10608:67;10672:2;10667:3;10608:67;:::i;:::-;10601:74;;10705:30;10701:1;10696:3;10692:11;10685:51;10762:2;10757:3;10753:12;10746:19;;10591:180;;;:::o;10777:318::-;;10940:67;11004:2;10999:3;10940:67;:::i;:::-;10933:74;;11037:22;11033:1;11028:3;11024:11;11017:43;11086:2;11081:3;11077:12;11070:19;;10923:172;;;:::o;11101:368::-;;11264:67;11328:2;11323:3;11264:67;:::i;:::-;11257:74;;11361:34;11357:1;11352:3;11348:11;11341:55;11427:6;11422:2;11417:3;11413:12;11406:28;11460:2;11455:3;11451:12;11444:19;;11247:222;;;:::o;11475:323::-;;11638:67;11702:2;11697:3;11638:67;:::i;:::-;11631:74;;11735:27;11731:1;11726:3;11722:11;11715:48;11789:2;11784:3;11780:12;11773:19;;11621:177;;;:::o;11804:390::-;;11967:67;12031:2;12026:3;11967:67;:::i;:::-;11960:74;;12064:34;12060:1;12055:3;12051:11;12044:55;12130:28;12125:2;12120:3;12116:12;12109:50;12185:2;12180:3;12176:12;12169:19;;11950:244;;;:::o;12200:327::-;;12363:67;12427:2;12422:3;12363:67;:::i;:::-;12356:74;;12460:31;12456:1;12451:3;12447:11;12440:52;12518:2;12513:3;12509:12;12502:19;;12346:181;;;:::o;12533:376::-;;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12793:34;12789:1;12784:3;12780:11;12773:55;12859:14;12854:2;12849:3;12845:12;12838:36;12900:2;12895:3;12891:12;12884:19;;12679:230;;;:::o;12915:388::-;;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13175:34;13171:1;13166:3;13162:11;13155:55;13241:26;13236:2;13231:3;13227:12;13220:48;13294:2;13289:3;13285:12;13278:19;;13061:242;;;:::o;13309:374::-;;13472:67;13536:2;13531:3;13472:67;:::i;:::-;13465:74;;13569:34;13565:1;13560:3;13556:11;13549:55;13635:12;13630:2;13625:3;13621:12;13614:34;13674:2;13669:3;13665:12;13658:19;;13455:228;;;:::o;13689:373::-;;13852:67;13916:2;13911:3;13852:67;:::i;:::-;13845:74;;13949:34;13945:1;13940:3;13936:11;13929:55;14015:11;14010:2;14005:3;14001:12;13994:33;14053:2;14048:3;14044:12;14037:19;;13835:227;;;:::o;14068:330::-;;14231:67;14295:2;14290:3;14231:67;:::i;:::-;14224:74;;14328:34;14324:1;14319:3;14315:11;14308:55;14389:2;14384:3;14380:12;14373:19;;14214:184;;;:::o;14404:376::-;;14567:67;14631:2;14626:3;14567:67;:::i;:::-;14560:74;;14664:34;14660:1;14655:3;14651:11;14644:55;14730:14;14725:2;14720:3;14716:12;14709:36;14771:2;14766:3;14762:12;14755:19;;14550:230;;;:::o;14786:330::-;;14949:67;15013:2;15008:3;14949:67;:::i;:::-;14942:74;;15046:34;15042:1;15037:3;15033:11;15026:55;15107:2;15102:3;15098:12;15091:19;;14932:184;;;:::o;15122:373::-;;15285:67;15349:2;15344:3;15285:67;:::i;:::-;15278:74;;15382:34;15378:1;15373:3;15369:11;15362:55;15448:11;15443:2;15438:3;15434:12;15427:33;15486:2;15481:3;15477:12;15470:19;;15268:227;;;:::o;15501:379::-;;15664:67;15728:2;15723:3;15664:67;:::i;:::-;15657:74;;15761:34;15757:1;15752:3;15748:11;15741:55;15827:17;15822:2;15817:3;15813:12;15806:39;15871:2;15866:3;15862:12;15855:19;;15647:233;;;:::o;15886:318::-;;16049:67;16113:2;16108:3;16049:67;:::i;:::-;16042:74;;16146:22;16142:1;16137:3;16133:11;16126:43;16195:2;16190:3;16186:12;16179:19;;16032:172;;;:::o;16210:365::-;;16373:67;16437:2;16432:3;16373:67;:::i;:::-;16366:74;;16470:34;16466:1;16461:3;16457:11;16450:55;16536:3;16531:2;16526:3;16522:12;16515:25;16566:2;16561:3;16557:12;16550:19;;16356:219;;;:::o;16581:442::-;;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16841:34;16837:1;16832:3;16828:11;16821:55;16907:34;16902:2;16897:3;16893:12;16886:56;16973:14;16968:2;16963:3;16959:12;16952:36;17014:2;17009:3;17005:12;16998:19;;16727:296;;;:::o;17029:382::-;;17192:67;17256:2;17251:3;17192:67;:::i;:::-;17185:74;;17289:34;17285:1;17280:3;17276:11;17269:55;17355:20;17350:2;17345:3;17341:12;17334:42;17402:2;17397:3;17393:12;17386:19;;17175:236;;;:::o;17417:314::-;;17580:67;17644:2;17639:3;17580:67;:::i;:::-;17573:74;;17677:18;17673:1;17668:3;17664:11;17657:39;17722:2;17717:3;17713:12;17706:19;;17563:168;;;:::o;17737:297::-;;17917:83;17998:1;17993:3;17917:83;:::i;:::-;17910:90;;18026:1;18021:3;18017:11;18010:18;;17900:134;;;:::o;18040:318::-;;18203:67;18267:2;18262:3;18203:67;:::i;:::-;18196:74;;18300:22;18296:1;18291:3;18287:11;18280:43;18349:2;18344:3;18340:12;18333:19;;18186:172;;;:::o;18364:381::-;;18527:67;18591:2;18586:3;18527:67;:::i;:::-;18520:74;;18624:34;18620:1;18615:3;18611:11;18604:55;18690:19;18685:2;18680:3;18676:12;18669:41;18736:2;18731:3;18727:12;18720:19;;18510:235;;;:::o;18751:367::-;;18914:67;18978:2;18973:3;18914:67;:::i;:::-;18907:74;;19011:34;19007:1;19002:3;18998:11;18991:55;19077:5;19072:2;19067:3;19063:12;19056:27;19109:2;19104:3;19100:12;19093:19;;18897:221;;;:::o;19124:318::-;;19287:67;19351:2;19346:3;19287:67;:::i;:::-;19280:74;;19384:22;19380:1;19375:3;19371:11;19364:43;19433:2;19428:3;19424:12;19417:19;;19270:172;;;:::o;19448:118::-;19535:24;19553:5;19535:24;:::i;:::-;19530:3;19523:37;19513:53;;:::o;19572:256::-;;19699:75;19770:3;19761:6;19699:75;:::i;:::-;19799:2;19794:3;19790:12;19783:19;;19819:3;19812:10;;19688:140;;;;:::o;19834:397::-;;19989:75;20060:3;20051:6;19989:75;:::i;:::-;20089:2;20084:3;20080:12;20073:19;;20102:75;20173:3;20164:6;20102:75;:::i;:::-;20202:2;20197:3;20193:12;20186:19;;20222:3;20215:10;;19978:253;;;;;:::o;20237:435::-;;20439:95;20530:3;20521:6;20439:95;:::i;:::-;20432:102;;20551:95;20642:3;20633:6;20551:95;:::i;:::-;20544:102;;20663:3;20656:10;;20421:251;;;;;:::o;20678:379::-;;20884:147;21027:3;20884:147;:::i;:::-;20877:154;;21048:3;21041:10;;20866:191;;;:::o;21063:222::-;;21194:2;21183:9;21179:18;21171:26;;21207:71;21275:1;21264:9;21260:17;21251:6;21207:71;:::i;:::-;21161:124;;;;:::o;21291:254::-;;21438:2;21427:9;21423:18;21415:26;;21451:87;21535:1;21524:9;21520:17;21511:6;21451:87;:::i;:::-;21405:140;;;;:::o;21551:640::-;;21784:3;21773:9;21769:19;21761:27;;21798:71;21866:1;21855:9;21851:17;21842:6;21798:71;:::i;:::-;21879:72;21947:2;21936:9;21932:18;21923:6;21879:72;:::i;:::-;21961;22029:2;22018:9;22014:18;22005:6;21961:72;:::i;:::-;22080:9;22074:4;22070:20;22065:2;22054:9;22050:18;22043:48;22108:76;22179:4;22170:6;22108:76;:::i;:::-;22100:84;;21751:440;;;;;;;:::o;22197:210::-;;22322:2;22311:9;22307:18;22299:26;;22335:65;22397:1;22386:9;22382:17;22373:6;22335:65;:::i;:::-;22289:118;;;;:::o;22413:222::-;;22544:2;22533:9;22529:18;22521:26;;22557:71;22625:1;22614:9;22610:17;22601:6;22557:71;:::i;:::-;22511:124;;;;:::o;22641:313::-;;22792:2;22781:9;22777:18;22769:26;;22841:9;22835:4;22831:20;22827:1;22816:9;22812:17;22805:47;22869:78;22942:4;22933:6;22869:78;:::i;:::-;22861:86;;22759:195;;;;:::o;22960:419::-;;23164:2;23153:9;23149:18;23141:26;;23213:9;23207:4;23203:20;23199:1;23188:9;23184:17;23177:47;23241:131;23367:4;23241:131;:::i;:::-;23233:139;;23131:248;;;:::o;23385:419::-;;23589:2;23578:9;23574:18;23566:26;;23638:9;23632:4;23628:20;23624:1;23613:9;23609:17;23602:47;23666:131;23792:4;23666:131;:::i;:::-;23658:139;;23556:248;;;:::o;23810:419::-;;24014:2;24003:9;23999:18;23991:26;;24063:9;24057:4;24053:20;24049:1;24038:9;24034:17;24027:47;24091:131;24217:4;24091:131;:::i;:::-;24083:139;;23981:248;;;:::o;24235:419::-;;24439:2;24428:9;24424:18;24416:26;;24488:9;24482:4;24478:20;24474:1;24463:9;24459:17;24452:47;24516:131;24642:4;24516:131;:::i;:::-;24508:139;;24406:248;;;:::o;24660:419::-;;24864:2;24853:9;24849:18;24841:26;;24913:9;24907:4;24903:20;24899:1;24888:9;24884:17;24877:47;24941:131;25067:4;24941:131;:::i;:::-;24933:139;;24831:248;;;:::o;25085:419::-;;25289:2;25278:9;25274:18;25266:26;;25338:9;25332:4;25328:20;25324:1;25313:9;25309:17;25302:47;25366:131;25492:4;25366:131;:::i;:::-;25358:139;;25256:248;;;:::o;25510:419::-;;25714:2;25703:9;25699:18;25691:26;;25763:9;25757:4;25753:20;25749:1;25738:9;25734:17;25727:47;25791:131;25917:4;25791:131;:::i;:::-;25783:139;;25681:248;;;:::o;25935:419::-;;26139:2;26128:9;26124:18;26116:26;;26188:9;26182:4;26178:20;26174:1;26163:9;26159:17;26152:47;26216:131;26342:4;26216:131;:::i;:::-;26208:139;;26106:248;;;:::o;26360:419::-;;26564:2;26553:9;26549:18;26541:26;;26613:9;26607:4;26603:20;26599:1;26588:9;26584:17;26577:47;26641:131;26767:4;26641:131;:::i;:::-;26633:139;;26531:248;;;:::o;26785:419::-;;26989:2;26978:9;26974:18;26966:26;;27038:9;27032:4;27028:20;27024:1;27013:9;27009:17;27002:47;27066:131;27192:4;27066:131;:::i;:::-;27058:139;;26956:248;;;:::o;27210:419::-;;27414:2;27403:9;27399:18;27391:26;;27463:9;27457:4;27453:20;27449:1;27438:9;27434:17;27427:47;27491:131;27617:4;27491:131;:::i;:::-;27483:139;;27381:248;;;:::o;27635:419::-;;27839:2;27828:9;27824:18;27816:26;;27888:9;27882:4;27878:20;27874:1;27863:9;27859:17;27852:47;27916:131;28042:4;27916:131;:::i;:::-;27908:139;;27806:248;;;:::o;28060:419::-;;28264:2;28253:9;28249:18;28241:26;;28313:9;28307:4;28303:20;28299:1;28288:9;28284:17;28277:47;28341:131;28467:4;28341:131;:::i;:::-;28333:139;;28231:248;;;:::o;28485:419::-;;28689:2;28678:9;28674:18;28666:26;;28738:9;28732:4;28728:20;28724:1;28713:9;28709:17;28702:47;28766:131;28892:4;28766:131;:::i;:::-;28758:139;;28656:248;;;:::o;28910:419::-;;29114:2;29103:9;29099:18;29091:26;;29163:9;29157:4;29153:20;29149:1;29138:9;29134:17;29127:47;29191:131;29317:4;29191:131;:::i;:::-;29183:139;;29081:248;;;:::o;29335:419::-;;29539:2;29528:9;29524:18;29516:26;;29588:9;29582:4;29578:20;29574:1;29563:9;29559:17;29552:47;29616:131;29742:4;29616:131;:::i;:::-;29608:139;;29506:248;;;:::o;29760:419::-;;29964:2;29953:9;29949:18;29941:26;;30013:9;30007:4;30003:20;29999:1;29988:9;29984:17;29977:47;30041:131;30167:4;30041:131;:::i;:::-;30033:139;;29931:248;;;:::o;30185:419::-;;30389:2;30378:9;30374:18;30366:26;;30438:9;30432:4;30428:20;30424:1;30413:9;30409:17;30402:47;30466:131;30592:4;30466:131;:::i;:::-;30458:139;;30356:248;;;:::o;30610:419::-;;30814:2;30803:9;30799:18;30791:26;;30863:9;30857:4;30853:20;30849:1;30838:9;30834:17;30827:47;30891:131;31017:4;30891:131;:::i;:::-;30883:139;;30781:248;;;:::o;31035:419::-;;31239:2;31228:9;31224:18;31216:26;;31288:9;31282:4;31278:20;31274:1;31263:9;31259:17;31252:47;31316:131;31442:4;31316:131;:::i;:::-;31308:139;;31206:248;;;:::o;31460:419::-;;31664:2;31653:9;31649:18;31641:26;;31713:9;31707:4;31703:20;31699:1;31688:9;31684:17;31677:47;31741:131;31867:4;31741:131;:::i;:::-;31733:139;;31631:248;;;:::o;31885:419::-;;32089:2;32078:9;32074:18;32066:26;;32138:9;32132:4;32128:20;32124:1;32113:9;32109:17;32102:47;32166:131;32292:4;32166:131;:::i;:::-;32158:139;;32056:248;;;:::o;32310:419::-;;32514:2;32503:9;32499:18;32491:26;;32563:9;32557:4;32553:20;32549:1;32538:9;32534:17;32527:47;32591:131;32717:4;32591:131;:::i;:::-;32583:139;;32481:248;;;:::o;32735:419::-;;32939:2;32928:9;32924:18;32916:26;;32988:9;32982:4;32978:20;32974:1;32963:9;32959:17;32952:47;33016:131;33142:4;33016:131;:::i;:::-;33008:139;;32906:248;;;:::o;33160:419::-;;33364:2;33353:9;33349:18;33341:26;;33413:9;33407:4;33403:20;33399:1;33388:9;33384:17;33377:47;33441:131;33567:4;33441:131;:::i;:::-;33433:139;;33331:248;;;:::o;33585:419::-;;33789:2;33778:9;33774:18;33766:26;;33838:9;33832:4;33828:20;33824:1;33813:9;33809:17;33802:47;33866:131;33992:4;33866:131;:::i;:::-;33858:139;;33756:248;;;:::o;34010:222::-;;34141:2;34130:9;34126:18;34118:26;;34154:71;34222:1;34211:9;34207:17;34198:6;34154:71;:::i;:::-;34108:124;;;;:::o;34238:283::-;;34304:2;34298:9;34288:19;;34346:4;34338:6;34334:17;34453:6;34441:10;34438:22;34417:18;34405:10;34402:34;34399:62;34396:2;;;34464:18;;:::i;:::-;34396:2;34504:10;34500:2;34493:22;34278:243;;;;:::o;34527:331::-;;34678:18;34670:6;34667:30;34664:2;;;34700:18;;:::i;:::-;34664:2;34785:4;34781:9;34774:4;34766:6;34762:17;34758:33;34750:41;;34846:4;34840;34836:15;34828:23;;34593:265;;;:::o;34864:332::-;;35016:18;35008:6;35005:30;35002:2;;;35038:18;;:::i;:::-;35002:2;35123:4;35119:9;35112:4;35104:6;35100:17;35096:33;35088:41;;35184:4;35178;35174:15;35166:23;;34931:265;;;:::o;35202:98::-;;35287:5;35281:12;35271:22;;35260:40;;;:::o;35306:99::-;;35392:5;35386:12;35376:22;;35365:40;;;:::o;35411:168::-;;35528:6;35523:3;35516:19;35568:4;35563:3;35559:14;35544:29;;35506:73;;;;:::o;35585:147::-;;35723:3;35708:18;;35698:34;;;;:::o;35738:169::-;;35856:6;35851:3;35844:19;35896:4;35891:3;35887:14;35872:29;;35834:73;;;;:::o;35913:148::-;;36052:3;36037:18;;36027:34;;;;:::o;36067:305::-;;36126:20;36144:1;36126:20;:::i;:::-;36121:25;;36160:20;36178:1;36160:20;:::i;:::-;36155:25;;36314:1;36246:66;36242:74;36239:1;36236:81;36233:2;;;36320:18;;:::i;:::-;36233:2;36364:1;36361;36357:9;36350:16;;36111:261;;;;:::o;36378:185::-;;36435:20;36453:1;36435:20;:::i;:::-;36430:25;;36469:20;36487:1;36469:20;:::i;:::-;36464:25;;36508:1;36498:2;;36513:18;;:::i;:::-;36498:2;36555:1;36552;36548:9;36543:14;;36420:143;;;;:::o;36569:348::-;;36632:20;36650:1;36632:20;:::i;:::-;36627:25;;36666:20;36684:1;36666:20;:::i;:::-;36661:25;;36854:1;36786:66;36782:74;36779:1;36776:81;36771:1;36764:9;36757:17;36753:105;36750:2;;;36861:18;;:::i;:::-;36750:2;36909:1;36906;36902:9;36891:20;;36617:300;;;;:::o;36923:191::-;;36983:20;37001:1;36983:20;:::i;:::-;36978:25;;37017:20;37035:1;37017:20;:::i;:::-;37012:25;;37056:1;37053;37050:8;37047:2;;;37061:18;;:::i;:::-;37047:2;37106:1;37103;37099:9;37091:17;;36968:146;;;;:::o;37120:96::-;;37186:24;37204:5;37186:24;:::i;:::-;37175:35;;37165:51;;;:::o;37222:104::-;;37296:24;37314:5;37296:24;:::i;:::-;37285:35;;37275:51;;;:::o;37332:90::-;;37409:5;37402:13;37395:21;37384:32;;37374:48;;;:::o;37428:77::-;;37494:5;37483:16;;37473:32;;;:::o;37511:149::-;;37587:66;37580:5;37576:78;37565:89;;37555:105;;;:::o;37666:126::-;;37743:42;37736:5;37732:54;37721:65;;37711:81;;;:::o;37798:77::-;;37864:5;37853:16;;37843:32;;;:::o;37881:154::-;37965:6;37960:3;37955;37942:30;38027:1;38018:6;38013:3;38009:16;38002:27;37932:103;;;:::o;38041:307::-;38109:1;38119:113;38133:6;38130:1;38127:13;38119:113;;;38218:1;38213:3;38209:11;38203:18;38199:1;38194:3;38190:11;38183:39;38155:2;38152:1;38148:10;38143:15;;38119:113;;;38250:6;38247:1;38244:13;38241:2;;;38330:1;38321:6;38316:3;38312:16;38305:27;38241:2;38090:258;;;;:::o;38354:320::-;;38435:1;38429:4;38425:12;38415:22;;38482:1;38476:4;38472:12;38503:18;38493:2;;38559:4;38551:6;38547:17;38537:27;;38493:2;38621;38613:6;38610:14;38590:18;38587:38;38584:2;;;38640:18;;:::i;:::-;38584:2;38405:269;;;;:::o;38680:233::-;;38742:24;38760:5;38742:24;:::i;:::-;38733:33;;38788:66;38781:5;38778:77;38775:2;;;38858:18;;:::i;:::-;38775:2;38905:1;38898:5;38894:13;38887:20;;38723:190;;;:::o;38919:100::-;;38987:26;39007:5;38987:26;:::i;:::-;38976:37;;38966:53;;;:::o;39025:79::-;;39093:5;39082:16;;39072:32;;;:::o;39110:94::-;;39178:20;39192:5;39178:20;:::i;:::-;39167:31;;39157:47;;;:::o;39210:176::-;;39259:20;39277:1;39259:20;:::i;:::-;39254:25;;39293:20;39311:1;39293:20;:::i;:::-;39288:25;;39332:1;39322:2;;39337:18;;:::i;:::-;39322:2;39378:1;39375;39371:9;39366:14;;39244:142;;;;:::o;39392:180::-;39440:77;39437:1;39430:88;39537:4;39534:1;39527:15;39561:4;39558:1;39551:15;39578:180;39626:77;39623:1;39616:88;39723:4;39720:1;39713:15;39747:4;39744:1;39737:15;39764:180;39812:77;39809:1;39802:88;39909:4;39906:1;39899:15;39933:4;39930:1;39923:15;39950:180;39998:77;39995:1;39988:88;40095:4;40092:1;40085:15;40119:4;40116:1;40109:15;40136:102;;40228:2;40224:7;40219:2;40212:5;40208:14;40204:28;40194:38;;40184:54;;;:::o;40244:94::-;;40325:5;40321:2;40317:14;40296:35;;40286:52;;;:::o;40344:122::-;40417:24;40435:5;40417:24;:::i;:::-;40410:5;40407:35;40397:2;;40456:1;40453;40446:12;40397:2;40387:79;:::o;40472:116::-;40542:21;40557:5;40542:21;:::i;:::-;40535:5;40532:32;40522:2;;40578:1;40575;40568:12;40522:2;40512:76;:::o;40594:122::-;40667:24;40685:5;40667:24;:::i;:::-;40660:5;40657:35;40647:2;;40706:1;40703;40696:12;40647:2;40637:79;:::o;40722:120::-;40794:23;40811:5;40794:23;:::i;:::-;40787:5;40784:34;40774:2;;40832:1;40829;40822:12;40774:2;40764:78;:::o;40848:122::-;40921:24;40939:5;40921:24;:::i;:::-;40914:5;40911:35;40901:2;;40960:1;40957;40950:12;40901:2;40891:79;:::o

Swarm Source

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