ETH Price: $3,395.14 (+0.59%)

Token

CryptoBeauties (CRYPTOBEAUTIES)
 

Overview

Max Total Supply

2,189 CRYPTOBEAUTIES

Holders

874

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
politechsguy.eth
Balance
1 CRYPTOBEAUTIES
0x0aaf37c3eaaa42d417434fd2cec555846d46415c
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:
CryptoBeauties

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1111 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier:MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/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: contracts/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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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: contracts/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: contracts/IERC165.sol


pragma solidity ^0.8.0;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: contracts/ERC165.sol


pragma solidity ^0.8.0;


contract ERC165 is IERC165 {

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        _registerInterface(bytes4(keccak256('supportsInterface(bytes4)')));
    }

    function supportsInterface(bytes4 interfaceID) external view override virtual  returns (bool) {
        return _supportedInterfaces[interfaceID];
    }

    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, 'Invalid interface request');
        _supportedInterfaces[interfaceId] = true;
    }



}
// File: contracts/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: contracts/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: contracts/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: contracts/ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: contracts/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: contracts/ERC721A.sol


pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. 
 * uint128 is a number with a maximum value of 2^127-1 or 340,282,366,920,938,463,463,374,607,431,768,211,455.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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(),'.json'))
                : "";
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: contracts/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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: contracts/CryptoBeauties.sol



//\_________                            __            __________                          __   .__                 
//\_   ___ \ _______  ___.__.______  _/  |_   ____   \______   \  ____  _____    __ __ _/  |_ |__|  ____    ______
///    \  \/ \_  __ \<   |  |\____ \ \   __\ /  _ \   |    |  _/_/ __ \ \__  \  |  |  \\   __\|  |_/ __ \  /  ___/
//\     \____ |  | \/ \___  ||  |_> > |  |  (  <_> )  |    |   \\  ___/  / __ \_|  |  / |  |  |  |\  ___/  \___ \ 
// \______  / |__|    / ____||   __/  |__|   \____/   |______  / \___  >(____  /|____/  |__|  |__| \___  >/____  >
 //       \/          \/     |__|                            \/      \/      \/                        \/      \/ 



pragma solidity ^0.8.0;






contract CryptoBeauties is Ownable, ERC721A, ReentrancyGuard {
    uint256 public amountForDevsRemaining;
    uint256 public freeRemaining; 
    uint256 public constant mintPrice = 0.029 ether;

    bytes32 private _freeMintRoot = "INSERT ROOT HERE";
    bytes32 private _whitelistRoot = "INSERT ROOT HERE";
    
    address public Promoter = 0x414508c939B0B78347a22d1F2dE5A7747C1426A5;
    address public Developer = 0x64d556cAae3eD6Df460F9CA7A93470722D04bE05;
    address public DAO = 0x402881BAd73d3932C2472Ab0453E0b03B32C52F0;
    address public Project = 0x421b0B0603fD45719B480CF71670EC00aE64b309;

    mapping(address => bool) public freeMintUsed;
    mapping(address => uint256) public whitelistMintsUsed;

    constructor( 
        uint256 maxBatchSize_,
        uint256 collectionSize_, 
        uint256 amountForFreeList_, 
        uint256 amountForDevs_
    ) ERC721A("CryptoBeauties", "CRYPTOBEAUTIES", maxBatchSize_, collectionSize_) {
        freeRemaining = amountForFreeList_; 
        amountForDevsRemaining = amountForDevs_;

        require(
            amountForFreeList_ <= collectionSize_, "Collection is not large enough."
        );
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "Caller is another contract."); 
        _;
    }

    //Status of Sale that is going on.

    enum SaleState {
        Paused, // 0
        Presale, // 1
        Public // 2
    }

    SaleState public saleState;

    //Merkle Implementation for ease of access

    function _verifyFreeMintStatus(address _account, bytes32[] calldata _merkleProof) private view returns (bool){
        bytes32 node = keccak256(abi.encodePacked(_account));
        return MerkleProof.verify(_merkleProof, _freeMintRoot, node); 
    }

    function _verifyWhitelistStatus(address _account, bytes32[] calldata _merkleProof) private view returns (bool) {
        bytes32 node = keccak256(abi.encodePacked(_account)); 
        return MerkleProof.verify(_merkleProof, _whitelistRoot, node); 
    }

    // Start of whitelist and free mint implementation

    function FreeWhitelistMint (uint256 _beautyAmount, bytes32[] calldata _merkleProof) external payable callerIsUser {
        require(_beautyAmount > 0);
        require(saleState == SaleState.Presale, "Presale has not begun yet!");
        require(whitelistMintsUsed[msg.sender] + _beautyAmount < 6, "Amount exceeds your allocation.");
        require(totalSupply() + _beautyAmount + amountForDevsRemaining <= collectionSize, "Exceeds max supply.");
        require(_verifyFreeMintStatus(msg.sender, _merkleProof), "Address not on Whitelist.");

        if (freeMintUsed[msg.sender] == false && freeRemaining != 0) {
            require(msg.value == mintPrice * (_beautyAmount - 1), "Incorrect ETH amount.");
            freeMintUsed[msg.sender] = true;
            freeRemaining -= 1;
    }
        else {
            require(msg.value == mintPrice * _beautyAmount, "Incorrect ETH amount.");
    }

        whitelistMintsUsed[msg.sender] += _beautyAmount;

        _safeMint(msg.sender, _beautyAmount);
}

    function WhiteListMint(uint256 _beautyAmount, bytes32[] calldata _merkleProof) external payable callerIsUser {
        require(_beautyAmount > 0);
        require(saleState == SaleState.Presale, "Presale has not begun yet!");
        require(whitelistMintsUsed[msg.sender] + _beautyAmount < 6, "Amount exceeds your allocation.");
        require(totalSupply() + _beautyAmount + amountForDevsRemaining <= collectionSize, "Exceeds max supply.");
        require(_verifyWhitelistStatus(msg.sender, _merkleProof), "Address not on Whitelist.");
        require(msg.value == mintPrice * _beautyAmount, "Incorrect ETH amount.");

        whitelistMintsUsed[msg.sender] += _beautyAmount;

        _safeMint(msg.sender, _beautyAmount);
}

    //Owner Mint function

    function AllowOwnerMint(uint256 _beautyAmount) external onlyOwner {
        require(_beautyAmount > 0);
        require(_beautyAmount <= amountForDevsRemaining, "Not Enough Dev Tokens left");
        amountForDevsRemaining -= _beautyAmount;
        require(totalSupply() + _beautyAmount <= collectionSize, "Reached Max Supply.");
        _safeMint(msg.sender, _beautyAmount); 
    }

    function publicSaleMint(uint256 _beautyAmount) external payable callerIsUser {
        require(_beautyAmount > 0); 
        require(saleState == SaleState.Public, "Presale is still active!");
        require(msg.value == mintPrice * _beautyAmount, "Please send more ETH!");
        require(totalSupply() + _beautyAmount + amountForDevsRemaining <= collectionSize, "Reached Max Supply.");

        _safeMint(msg.sender, _beautyAmount); 
    }

    function setRootFreeList(bytes32 _freeRoot) external onlyOwner {
        _freeMintRoot = _freeRoot; 
    }

    function setRootWL(bytes32 _rootWL) external onlyOwner {
        _whitelistRoot = _rootWL; 
    }

    function setSaleState(SaleState _newState) external onlyOwner {
        saleState = _newState;
    }

    //Metadata URI

    string private _baseTokenURI = "https://ipfs.cryptobeauties.io/metadata/";

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

    function setupBaseURI(string calldata _baseURIz) external onlyOwner {
        _baseTokenURI = _baseURIz;
    }

    // Withdrawal functions

    function setWithdrawAddress(address _DAO, address _Promoter, address _Developer, address _Project ) external onlyOwner {
    DAO = _DAO;
    Promoter = _Promoter;
    Developer = _Developer;
    Project = _Project;

    }

    function withdrawMoney() external onlyOwner nonReentrant {
    uint256 balance = address(this).balance;
    uint256 toPartner = 405*balance/1000;
    uint256 toDAO = 14*balance/100;
    uint256 toProject = 4*balance/100;
    (bool sent1,) = payable(Promoter).call{value: toPartner}("");
    (bool sent2,) = payable(Developer).call{value: toPartner}("");
    (bool sent3,) = payable(DAO).call{value: toDAO}("");
    (bool sent4,) = payable(Project).call{value: toProject}("");
    require(sent1 && sent2 && sent3 && sent4, "Failed to send Ether");
  
    }

    function withdrawFinal() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        uint256 toPartner = 405*balance/1000;
        uint256 toDAO = 14*balance/100;
        uint256 toOwner = balance - 2*toPartner - toDAO;
        (bool pt, ) = payable(Promoter).call{value: toPartner}("");
        (bool dv, ) = payable(Developer).call{value: toPartner}("");
        (bool da, ) = payable(DAO).call{value: toDAO}("");
        (bool os, ) = payable(msg.sender).call{value: toOwner}("");
        require(pt && dv && da && os, "Failed to send Ether");
    }


    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
    {
        _setOwnersExplicit(quantity);
    }




    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForFreeList_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"}],"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":[{"internalType":"uint256","name":"_beautyAmount","type":"uint256"}],"name":"AllowOwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Developer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_beautyAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"FreeWhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Project","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Promoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_beautyAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"WhiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountForDevsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_beautyAmount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","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":"saleState","outputs":[{"internalType":"enum CryptoBeauties.SaleState","name":"","type":"uint8"}],"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":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freeRoot","type":"bytes32"}],"name":"setRootFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootWL","type":"bytes32"}],"name":"setRootWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CryptoBeauties.SaleState","name":"_newState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_Promoter","type":"address"},{"internalType":"address","name":"_Developer","type":"address"},{"internalType":"address","name":"_Project","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURIz","type":"string"}],"name":"setupBaseURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"whitelistMintsUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600060028190556009556f494e5345525420524f4f54204845524560801b600d819055600e55600f80546001600160a01b031990811673414508c939b0b78347a22d1f2de5a7747c1426a5179091556010805482167364d556caae3ed6df460f9ca7a93470722d04be0517905560118054821673402881bad73d3932c2472ab0453e0b03b32c52f01790556012805490911673421b0b0603fd45719b480cf71670ec00ae64b309179055610120604052602860c08181529062003ee460e0398051620000d491601691602090910190620003e3565b50348015620000e257600080fd5b5060405162003f0c38038062003f0c833981016040819052620001059162000489565b6040518060400160405280600e81526020016d43727970746f426561757469657360901b8152506040518060400160405280600e81526020016d43525950544f424541555449455360901b81525085856200016f620001696200030b60201b60201c565b6200030f565b6200019a7f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e26200035f565b60008111620002075760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002695760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001fe565b83516200027e906003906020870190620003e3565b50825162000294906004906020860190620003e3565b5060a09190915260805250506001600a55600c829055600b81905582821115620003015760405162461bcd60e51b815260206004820152601f60248201527f436f6c6c656374696f6e206973206e6f74206c6172676520656e6f7567682e006044820152606401620001fe565b50505050620004fd565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160e01b03198082161415620003bb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420696e746572666163652072657175657374000000000000006044820152606401620001fe565b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b828054620003f190620004c0565b90600052602060002090601f01602090048101928262000415576000855562000460565b82601f106200043057805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200046057825182559160200191906001019062000443565b506200046e92915062000472565b5090565b5b808211156200046e576000815560010162000473565b60008060008060808587031215620004a057600080fd5b505082516020840151604085015160609095015191969095509092509050565b600181811c90821680620004d557607f821691505b60208210811415620004f757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613990620005546000396000818161298c015281816129b60152612f2c01526000818161108f015281816114df01528181611c6a01528181611f98015281816126c301526126f501526139906000f3fe6080604052600436106102dc5760003560e01c806368feaa1d11610184578063ac446002116100d6578063cc6465c01161008a578063e985e9c511610064578063e985e9c5146107f8578063ee25e4ca14610841578063f2fde38b1461085457600080fd5b8063cc6465c014610795578063d7224ba0146107c2578063dcc29571146107d857600080fd5b8063b4ae7f80116100bb578063b4ae7f8014610735578063b88d4fde14610755578063c87b56dd1461077557600080fd5b8063ac4460021461070d578063b3ab66b01461072257600080fd5b80639231ab2a1161013857806399ca65581161011257806399ca6558146106b85780639ebb1250146106d8578063a22cb465146106ed57600080fd5b80639231ab2a1461063557806395d89b411461068357806398fabd3a1461069857600080fd5b8063715018a611610169578063715018a6146105e2578063721770e5146105f75780638da5cb5b1461061757600080fd5b806368feaa1d146105a257806370a08231146105c257600080fd5b80632f745c591161023d5780635a67de07116101f157806361a43d52116101cb57806361a43d52146105545780636352211e146105675780636817c76c1461058757600080fd5b80635a67de07146104f75780635a781a6b14610517578063603f4d521461052d57600080fd5b8063436e275811610222578063436e275814610487578063456cc814146104a75780634f6ccce7146104d757600080fd5b80632f745c591461044757806342842e0e1461046757600080fd5b8063169888a21161029457806323b872dd1161027957806323b872dd146103f157806327524e66146104115780632d20fb601461042757600080fd5b8063169888a2146103b257806318160ddd146103d257600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b31461037057806315bf430d1461039257600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461352e565b610874565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610911565b60405161030d9190613761565b34801561034457600080fd5b50610358610353366004613515565b6109a3565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b5061039061038b3660046134eb565b610a43565b005b34801561039e57600080fd5b50601254610358906001600160a01b031681565b3480156103be57600080fd5b50600f54610358906001600160a01b031681565b3480156103de57600080fd5b506002545b60405190815260200161030d565b3480156103fd57600080fd5b5061039061040c366004613397565b610b76565b34801561041d57600080fd5b506103e3600b5481565b34801561043357600080fd5b50610390610442366004613515565b610b81565b34801561045357600080fd5b506103e36104623660046134eb565b610be7565b34801561047357600080fd5b50610390610482366004613397565b610d8a565b34801561049357600080fd5b506103906104a2366004613343565b610da5565b3480156104b357600080fd5b506103016104c23660046132f5565b60136020526000908152604090205460ff1681565b3480156104e357600080fd5b506103e36104f2366004613515565b610e5c565b34801561050357600080fd5b50610390610512366004613568565b610edf565b34801561052357600080fd5b506103e3600c5481565b34801561053957600080fd5b506015546105479060ff1681565b60405161030d9190613739565b6103906105623660046135fb565b610f60565b34801561057357600080fd5b50610358610582366004613515565b611202565b34801561059357600080fd5b506103e366670758aa7c800081565b3480156105ae57600080fd5b506103906105bd366004613589565b611214565b3480156105ce57600080fd5b506103e36105dd3660046132f5565b61127a565b3480156105ee57600080fd5b5061039061131d565b34801561060357600080fd5b50610390610612366004613515565b611383565b34801561062357600080fd5b506000546001600160a01b0316610358565b34801561064157600080fd5b50610655610650366004613515565b6113e2565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff16928101929092520161030d565b34801561068f57600080fd5b5061032b6113ff565b3480156106a457600080fd5b50601154610358906001600160a01b031681565b3480156106c457600080fd5b506103906106d3366004613515565b61140e565b3480156106e457600080fd5b5061039061156c565b3480156106f957600080fd5b506103906107083660046134af565b611854565b34801561071957600080fd5b50610390611919565b610390610730366004613515565b611b47565b34801561074157600080fd5b50601054610358906001600160a01b031681565b34801561076157600080fd5b506103906107703660046133d3565b611ca0565b34801561078157600080fd5b5061032b610790366004613515565b611d2f565b3480156107a157600080fd5b506103e36107b03660046132f5565b60146020526000908152604090205481565b3480156107ce57600080fd5b506103e360095481565b3480156107e457600080fd5b506103906107f3366004613515565b611e0a565b34801561080457600080fd5b50610301610813366004613310565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61039061084f3660046135fb565b611e69565b34801561086057600080fd5b5061039061086f3660046132f5565b612148565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108d757506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061090b57506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b92915050565b6060600380546109209061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461094c9061386c565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905090565b60006109b0826002541190565b610a275760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610a4e82611202565b9050806001600160a01b0316836001600160a01b03161415610ad85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b336001600160a01b0382161480610af45750610af48133610813565b610b665760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a1e565b610b71838383612227565b505050565b610b71838383612290565b6000546001600160a01b03163314610bdb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b610be481612652565b50565b6000610bf28361127a565b8210610c665760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6000610c7160025490565b905060008060005b83811015610d1b576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ccc57805192505b876001600160a01b0316836001600160a01b03161415610d085786841415610cfa5750935061090b92505050565b83610d04816138a7565b9450505b5080610d13816138a7565b915050610c79565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610a1e565b610b7183838360405180602001604052806000815250611ca0565b6000546001600160a01b03163314610dff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b601180546001600160a01b0395861673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f805494861694821694909417909355601080549285169284169290921790915560128054919093169116179055565b6000610e6760025490565b8210610edb5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b5090565b6000546001600160a01b03163314610f395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6015805482919060ff19166001836002811115610f5857610f58613902565b021790555050565b323314610faf5760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008311610fbc57600080fd5b600160155460ff166002811115610fd557610fd5613902565b146110225760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520686173206e6f7420626567756e20796574210000000000006044820152606401610a1e565b3360009081526014602052604090205460069061104090859061379f565b1061108d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320796f757220616c6c6f636174696f6e2e006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000000000600b54846110bb60025490565b6110c5919061379f565b6110cf919061379f565b111561111d5760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c792e000000000000000000000000006044820152606401610a1e565b611128338383612853565b6111745760405162461bcd60e51b815260206004820152601960248201527f41646472657373206e6f74206f6e2057686974656c6973742e000000000000006044820152606401610a1e565b6111858366670758aa7c80006137cb565b34146111d35760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742045544820616d6f756e742e00000000000000000000006044820152606401610a1e565b33600090815260146020526040812080548592906111f290849061379f565b90915550610b71905033846128d9565b600061120d826128f7565b5192915050565b6000546001600160a01b0316331461126e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b610b7160168383613249565b60006001600160a01b0382166112f85760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a1e565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146113775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6113816000612ac2565b565b6000546001600160a01b031633146113dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b600d55565b604080518082019091526000808252602082015261090b826128f7565b6060600480546109209061386c565b6000546001600160a01b031633146114685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6000811161147557600080fd5b600b548111156114c75760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420456e6f7567682044657620546f6b656e73206c6566740000000000006044820152606401610a1e565b80600b60008282546114d99190613812565b909155507f000000000000000000000000000000000000000000000000000000000000000090508161150a60025490565b611514919061379f565b11156115625760405162461bcd60e51b815260206004820152601360248201527f52656163686564204d617820537570706c792e000000000000000000000000006044820152606401610a1e565b610be433826128d9565b6000546001600160a01b031633146115c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6002600a5414156116195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1e565b6002600a554760006103e8611630836101956137cb565b61163a91906137b7565b90506000606461164b84600e6137cb565b61165591906137b7565b90506000816116658460026137cb565b61166f9086613812565b6116799190613812565b600f546040519192506000916001600160a01b039091169085908381818185875af1925050503d80600081146116cb576040519150601f19603f3d011682016040523d82523d6000602084013e6116d0565b606091505b50506010546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611724576040519150601f19603f3d011682016040523d82523d6000602084013e611729565b606091505b50506011546040519192506000916001600160a01b039091169086908381818185875af1925050503d806000811461177d576040519150601f19603f3d011682016040523d82523d6000602084013e611782565b606091505b505090506000336001600160a01b0316856040515b60006040518083038185875af1925050503d80600081146117d4576040519150601f19603f3d011682016040523d82523d6000602084013e6117d9565b606091505b505090508380156117e75750825b80156117f05750815b80156117f95750805b6118455760405162461bcd60e51b815260206004820152601460248201527f4661696c656420746f2073656e642045746865720000000000000000000000006044820152606401610a1e565b50506001600a55505050505050565b6001600160a01b0382163314156118ad5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a1e565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146119735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6002600a5414156119c65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1e565b6002600a554760006103e86119dd836101956137cb565b6119e791906137b7565b9050600060646119f884600e6137cb565b611a0291906137b7565b905060006064611a138560046137cb565b611a1d91906137b7565b600f546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114611a6f576040519150601f19603f3d011682016040523d82523d6000602084013e611a74565b606091505b50506010546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611ac8576040519150601f19603f3d011682016040523d82523d6000602084013e611acd565b606091505b50506011546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611b21576040519150601f19603f3d011682016040523d82523d6000602084013e611b26565b606091505b50506012546040519192506000916001600160a01b03909116908690611797565b323314611b965760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008111611ba357600080fd5b600260155460ff166002811115611bbc57611bbc613902565b14611c095760405162461bcd60e51b815260206004820152601860248201527f50726573616c65206973207374696c6c206163746976652100000000000000006044820152606401610a1e565b611c1a8166670758aa7c80006137cb565b3414611c685760405162461bcd60e51b815260206004820152601560248201527f506c656173652073656e64206d6f7265204554482100000000000000000000006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000000000600b5482611c9660025490565b61150a919061379f565b611cab848484612290565b611cb784848484612b1f565b611d295760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b50505050565b6060611d3c826002541190565b611dae5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a1e565b6000611db8612c83565b90506000815111611dd85760405180602001604052806000815250611e03565b80611de284612c92565b604051602001611df39291906136a6565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b600e55565b323314611eb85760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008311611ec557600080fd5b600160155460ff166002811115611ede57611ede613902565b14611f2b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520686173206e6f7420626567756e20796574210000000000006044820152606401610a1e565b33600090815260146020526040902054600690611f4990859061379f565b10611f965760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320796f757220616c6c6f636174696f6e2e006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000000000600b5484611fc460025490565b611fce919061379f565b611fd8919061379f565b11156120265760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c792e000000000000000000000000006044820152606401610a1e565b612031338383612dc4565b61207d5760405162461bcd60e51b815260206004820152601960248201527f41646472657373206e6f74206f6e2057686974656c6973742e000000000000006044820152606401610a1e565b3360009081526013602052604090205460ff1615801561209e5750600c5415155b15611174576120ae600184613812565b6120bf9066670758aa7c80006137cb565b341461210d5760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742045544820616d6f756e742e00000000000000000000006044820152606401610a1e565b336000908152601360205260408120805460ff19166001908117909155600c80549192909161213d908490613812565b909155506111d39050565b6000546001600160a01b031633146121a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6001600160a01b03811661221e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a1e565b610be481612ac2565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061229b826128f7565b80519091506000906001600160a01b0316336001600160a01b031614806122d25750336122c7846109a3565b6001600160a01b0316145b806122e4575081516122e49033610813565b9050806123595760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610a1e565b846001600160a01b031682600001516001600160a01b0316146123e45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610a1e565b6001600160a01b0384166124605760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6124706000848460000151612227565b6001600160a01b03851660009081526006602052604081208054600192906124a29084906001600160801b03166137ea565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260066020526040812080546001945090926124ee91859116613774565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561257684600161379f565b6000818152600560205260409020549091506001600160a01b0316612608576125a0816002541190565b156126085760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600954816126a25760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610a1e565b600060016126b0848461379f565b6126ba9190613812565b90506126e760017f0000000000000000000000000000000000000000000000000000000000000000613812565b81111561271c5761271960017f0000000000000000000000000000000000000000000000000000000000000000613812565b90505b612727816002541190565b6127995760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201527f6c65616e757000000000000000000000000000000000000000000000000000006064820152608401610a1e565b815b81811161283f576000818152600560205260409020546001600160a01b031661282d5760006127c9826128f7565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600590965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612837816138a7565b91505061279b565b5061284b81600161379f565b600955505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506128d084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612e3d565b95945050505050565b6128f3828260405180602001604052806000815250612e53565b5050565b6040805180820190915260008082526020820152612916826002541190565b6129885760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610a1e565b60007f000000000000000000000000000000000000000000000000000000000000000083106129e9576129db7f000000000000000000000000000000000000000000000000000000000000000084613812565b6129e690600161379f565b90505b825b818110612a53576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612a4057949350505050565b5080612a4b81613855565b9150506129eb565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610a1e565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612c7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b639033908990889088906004016136fd565b602060405180830381600087803b158015612b7d57600080fd5b505af1925050508015612bad575060408051601f3d908101601f19168201909252612baa9181019061354b565b60015b612c5d573d808015612bdb576040519150601f19603f3d011682016040523d82523d6000602084013e612be0565b606091505b508051612c555760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c7b565b5060015b949350505050565b6060601680546109209061386c565b606081612cd257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612cfc5780612ce6816138a7565b9150612cf59050600a836137b7565b9150612cd6565b60008167ffffffffffffffff811115612d1757612d1761392e565b6040519080825280601f01601f191660200182016040528015612d41576020820181803683370190505b5090505b8415612c7b57612d56600183613812565b9150612d63600a866138c2565b612d6e90603061379f565b60f81b818381518110612d8357612d83613918565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dbd600a866137b7565b9450612d45565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506128d084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490505b600082612e4a85846131d5565b14949350505050565b6002546001600160a01b038416612ed25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b612edd816002541190565b15612f2a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000000000831115612fc05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b0380821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190613029908790613774565b6001600160801b031681526020018583602001516130479190613774565b6001600160801b039081169091526001600160a01b03808816600081815260066020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156131ca5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131386000888488612b1f565b6131aa5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b816131b4816138a7565b92505080806131c2906138a7565b9150506130eb565b50600281905561264a565b600081815b84518110156132415760008582815181106131f7576131f7613918565b6020026020010151905080831161321d576000838152602082905260409020925061322e565b600081815260208490526040902092505b5080613239816138a7565b9150506131da565b509392505050565b8280546132559061386c565b90600052602060002090601f01602090048101928261327757600085556132bd565b82601f106132905782800160ff198235161785556132bd565b828001600101855582156132bd579182015b828111156132bd5782358255916020019190600101906132a2565b50610edb9291505b80821115610edb57600081556001016132c5565b80356001600160a01b03811681146132f057600080fd5b919050565b60006020828403121561330757600080fd5b611e03826132d9565b6000806040838503121561332357600080fd5b61332c836132d9565b915061333a602084016132d9565b90509250929050565b6000806000806080858703121561335957600080fd5b613362856132d9565b9350613370602086016132d9565b925061337e604086016132d9565b915061338c606086016132d9565b905092959194509250565b6000806000606084860312156133ac57600080fd5b6133b5846132d9565b92506133c3602085016132d9565b9150604084013590509250925092565b600080600080608085870312156133e957600080fd5b6133f2856132d9565b9350613400602086016132d9565b925060408501359150606085013567ffffffffffffffff8082111561342457600080fd5b818701915087601f83011261343857600080fd5b81358181111561344a5761344a61392e565b604051601f8201601f19908116603f011681019083821181831017156134725761347261392e565b816040528281528a602084870101111561348b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156134c257600080fd5b6134cb836132d9565b9150602083013580151581146134e057600080fd5b809150509250929050565b600080604083850312156134fe57600080fd5b613507836132d9565b946020939093013593505050565b60006020828403121561352757600080fd5b5035919050565b60006020828403121561354057600080fd5b8135611e0381613944565b60006020828403121561355d57600080fd5b8151611e0381613944565b60006020828403121561357a57600080fd5b813560038110611e0357600080fd5b6000806020838503121561359c57600080fd5b823567ffffffffffffffff808211156135b457600080fd5b818501915085601f8301126135c857600080fd5b8135818111156135d757600080fd5b8660208285010111156135e957600080fd5b60209290920196919550909350505050565b60008060006040848603121561361057600080fd5b83359250602084013567ffffffffffffffff8082111561362f57600080fd5b818601915086601f83011261364357600080fd5b81358181111561365257600080fd5b8760208260051b850101111561366757600080fd5b6020830194508093505050509250925092565b60008151808452613692816020860160208601613829565b601f01601f19169290920160200192915050565b600083516136b8818460208801613829565b8351908301906136cc818360208801613829565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372f608083018461367a565b9695505050505050565b602081016003831061375b57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611e03602083018461367a565b60006001600160801b03808316818516808303821115613796576137966138d6565b01949350505050565b600082198211156137b2576137b26138d6565b500190565b6000826137c6576137c66138ec565b500490565b60008160001904831182151516156137e5576137e56138d6565b500290565b60006001600160801b038381169083168181101561380a5761380a6138d6565b039392505050565b600082821015613824576138246138d6565b500390565b60005b8381101561384457818101518382015260200161382c565b83811115611d295750506000910152565b600081613864576138646138d6565b506000190190565b600181811c9082168061388057607f821691505b602082108114156138a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138bb576138bb6138d6565b5060010190565b6000826138d1576138d16138ec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be457600080fdfea26469706673582212207a3c20c32e1c7de0d2d43582a2a6385b1070506260e629e6e16f54361ce371bb64736f6c6343000807003368747470733a2f2f697066732e63727970746f62656175746965732e696f2f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000002b6700000000000000000000000000000000000000000000000000000000000004570000000000000000000000000000000000000000000000000000000000000096

Deployed Bytecode

0x6080604052600436106102dc5760003560e01c806368feaa1d11610184578063ac446002116100d6578063cc6465c01161008a578063e985e9c511610064578063e985e9c5146107f8578063ee25e4ca14610841578063f2fde38b1461085457600080fd5b8063cc6465c014610795578063d7224ba0146107c2578063dcc29571146107d857600080fd5b8063b4ae7f80116100bb578063b4ae7f8014610735578063b88d4fde14610755578063c87b56dd1461077557600080fd5b8063ac4460021461070d578063b3ab66b01461072257600080fd5b80639231ab2a1161013857806399ca65581161011257806399ca6558146106b85780639ebb1250146106d8578063a22cb465146106ed57600080fd5b80639231ab2a1461063557806395d89b411461068357806398fabd3a1461069857600080fd5b8063715018a611610169578063715018a6146105e2578063721770e5146105f75780638da5cb5b1461061757600080fd5b806368feaa1d146105a257806370a08231146105c257600080fd5b80632f745c591161023d5780635a67de07116101f157806361a43d52116101cb57806361a43d52146105545780636352211e146105675780636817c76c1461058757600080fd5b80635a67de07146104f75780635a781a6b14610517578063603f4d521461052d57600080fd5b8063436e275811610222578063436e275814610487578063456cc814146104a75780634f6ccce7146104d757600080fd5b80632f745c591461044757806342842e0e1461046757600080fd5b8063169888a21161029457806323b872dd1161027957806323b872dd146103f157806327524e66146104115780632d20fb601461042757600080fd5b8063169888a2146103b257806318160ddd146103d257600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b31461037057806315bf430d1461039257600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461352e565b610874565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610911565b60405161030d9190613761565b34801561034457600080fd5b50610358610353366004613515565b6109a3565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b5061039061038b3660046134eb565b610a43565b005b34801561039e57600080fd5b50601254610358906001600160a01b031681565b3480156103be57600080fd5b50600f54610358906001600160a01b031681565b3480156103de57600080fd5b506002545b60405190815260200161030d565b3480156103fd57600080fd5b5061039061040c366004613397565b610b76565b34801561041d57600080fd5b506103e3600b5481565b34801561043357600080fd5b50610390610442366004613515565b610b81565b34801561045357600080fd5b506103e36104623660046134eb565b610be7565b34801561047357600080fd5b50610390610482366004613397565b610d8a565b34801561049357600080fd5b506103906104a2366004613343565b610da5565b3480156104b357600080fd5b506103016104c23660046132f5565b60136020526000908152604090205460ff1681565b3480156104e357600080fd5b506103e36104f2366004613515565b610e5c565b34801561050357600080fd5b50610390610512366004613568565b610edf565b34801561052357600080fd5b506103e3600c5481565b34801561053957600080fd5b506015546105479060ff1681565b60405161030d9190613739565b6103906105623660046135fb565b610f60565b34801561057357600080fd5b50610358610582366004613515565b611202565b34801561059357600080fd5b506103e366670758aa7c800081565b3480156105ae57600080fd5b506103906105bd366004613589565b611214565b3480156105ce57600080fd5b506103e36105dd3660046132f5565b61127a565b3480156105ee57600080fd5b5061039061131d565b34801561060357600080fd5b50610390610612366004613515565b611383565b34801561062357600080fd5b506000546001600160a01b0316610358565b34801561064157600080fd5b50610655610650366004613515565b6113e2565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff16928101929092520161030d565b34801561068f57600080fd5b5061032b6113ff565b3480156106a457600080fd5b50601154610358906001600160a01b031681565b3480156106c457600080fd5b506103906106d3366004613515565b61140e565b3480156106e457600080fd5b5061039061156c565b3480156106f957600080fd5b506103906107083660046134af565b611854565b34801561071957600080fd5b50610390611919565b610390610730366004613515565b611b47565b34801561074157600080fd5b50601054610358906001600160a01b031681565b34801561076157600080fd5b506103906107703660046133d3565b611ca0565b34801561078157600080fd5b5061032b610790366004613515565b611d2f565b3480156107a157600080fd5b506103e36107b03660046132f5565b60146020526000908152604090205481565b3480156107ce57600080fd5b506103e360095481565b3480156107e457600080fd5b506103906107f3366004613515565b611e0a565b34801561080457600080fd5b50610301610813366004613310565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61039061084f3660046135fb565b611e69565b34801561086057600080fd5b5061039061086f3660046132f5565b612148565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108d757506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061090b57506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b92915050565b6060600380546109209061386c565b80601f016020809104026020016040519081016040528092919081815260200182805461094c9061386c565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905090565b60006109b0826002541190565b610a275760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610a4e82611202565b9050806001600160a01b0316836001600160a01b03161415610ad85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b336001600160a01b0382161480610af45750610af48133610813565b610b665760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a1e565b610b71838383612227565b505050565b610b71838383612290565b6000546001600160a01b03163314610bdb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b610be481612652565b50565b6000610bf28361127a565b8210610c665760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6000610c7160025490565b905060008060005b83811015610d1b576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ccc57805192505b876001600160a01b0316836001600160a01b03161415610d085786841415610cfa5750935061090b92505050565b83610d04816138a7565b9450505b5080610d13816138a7565b915050610c79565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610a1e565b610b7183838360405180602001604052806000815250611ca0565b6000546001600160a01b03163314610dff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b601180546001600160a01b0395861673ffffffffffffffffffffffffffffffffffffffff1991821617909155600f805494861694821694909417909355601080549285169284169290921790915560128054919093169116179055565b6000610e6760025490565b8210610edb5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b5090565b6000546001600160a01b03163314610f395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6015805482919060ff19166001836002811115610f5857610f58613902565b021790555050565b323314610faf5760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008311610fbc57600080fd5b600160155460ff166002811115610fd557610fd5613902565b146110225760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520686173206e6f7420626567756e20796574210000000000006044820152606401610a1e565b3360009081526014602052604090205460069061104090859061379f565b1061108d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320796f757220616c6c6f636174696f6e2e006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000002b67600b54846110bb60025490565b6110c5919061379f565b6110cf919061379f565b111561111d5760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c792e000000000000000000000000006044820152606401610a1e565b611128338383612853565b6111745760405162461bcd60e51b815260206004820152601960248201527f41646472657373206e6f74206f6e2057686974656c6973742e000000000000006044820152606401610a1e565b6111858366670758aa7c80006137cb565b34146111d35760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742045544820616d6f756e742e00000000000000000000006044820152606401610a1e565b33600090815260146020526040812080548592906111f290849061379f565b90915550610b71905033846128d9565b600061120d826128f7565b5192915050565b6000546001600160a01b0316331461126e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b610b7160168383613249565b60006001600160a01b0382166112f85760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a1e565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b031633146113775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6113816000612ac2565b565b6000546001600160a01b031633146113dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b600d55565b604080518082019091526000808252602082015261090b826128f7565b6060600480546109209061386c565b6000546001600160a01b031633146114685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6000811161147557600080fd5b600b548111156114c75760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420456e6f7567682044657620546f6b656e73206c6566740000000000006044820152606401610a1e565b80600b60008282546114d99190613812565b909155507f0000000000000000000000000000000000000000000000000000000000002b6790508161150a60025490565b611514919061379f565b11156115625760405162461bcd60e51b815260206004820152601360248201527f52656163686564204d617820537570706c792e000000000000000000000000006044820152606401610a1e565b610be433826128d9565b6000546001600160a01b031633146115c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6002600a5414156116195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1e565b6002600a554760006103e8611630836101956137cb565b61163a91906137b7565b90506000606461164b84600e6137cb565b61165591906137b7565b90506000816116658460026137cb565b61166f9086613812565b6116799190613812565b600f546040519192506000916001600160a01b039091169085908381818185875af1925050503d80600081146116cb576040519150601f19603f3d011682016040523d82523d6000602084013e6116d0565b606091505b50506010546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611724576040519150601f19603f3d011682016040523d82523d6000602084013e611729565b606091505b50506011546040519192506000916001600160a01b039091169086908381818185875af1925050503d806000811461177d576040519150601f19603f3d011682016040523d82523d6000602084013e611782565b606091505b505090506000336001600160a01b0316856040515b60006040518083038185875af1925050503d80600081146117d4576040519150601f19603f3d011682016040523d82523d6000602084013e6117d9565b606091505b505090508380156117e75750825b80156117f05750815b80156117f95750805b6118455760405162461bcd60e51b815260206004820152601460248201527f4661696c656420746f2073656e642045746865720000000000000000000000006044820152606401610a1e565b50506001600a55505050505050565b6001600160a01b0382163314156118ad5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a1e565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146119735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6002600a5414156119c65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1e565b6002600a554760006103e86119dd836101956137cb565b6119e791906137b7565b9050600060646119f884600e6137cb565b611a0291906137b7565b905060006064611a138560046137cb565b611a1d91906137b7565b600f546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114611a6f576040519150601f19603f3d011682016040523d82523d6000602084013e611a74565b606091505b50506010546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611ac8576040519150601f19603f3d011682016040523d82523d6000602084013e611acd565b606091505b50506011546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611b21576040519150601f19603f3d011682016040523d82523d6000602084013e611b26565b606091505b50506012546040519192506000916001600160a01b03909116908690611797565b323314611b965760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008111611ba357600080fd5b600260155460ff166002811115611bbc57611bbc613902565b14611c095760405162461bcd60e51b815260206004820152601860248201527f50726573616c65206973207374696c6c206163746976652100000000000000006044820152606401610a1e565b611c1a8166670758aa7c80006137cb565b3414611c685760405162461bcd60e51b815260206004820152601560248201527f506c656173652073656e64206d6f7265204554482100000000000000000000006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000002b67600b5482611c9660025490565b61150a919061379f565b611cab848484612290565b611cb784848484612b1f565b611d295760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b50505050565b6060611d3c826002541190565b611dae5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a1e565b6000611db8612c83565b90506000815111611dd85760405180602001604052806000815250611e03565b80611de284612c92565b604051602001611df39291906136a6565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611e645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b600e55565b323314611eb85760405162461bcd60e51b815260206004820152601b60248201527f43616c6c657220697320616e6f7468657220636f6e74726163742e00000000006044820152606401610a1e565b60008311611ec557600080fd5b600160155460ff166002811115611ede57611ede613902565b14611f2b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6520686173206e6f7420626567756e20796574210000000000006044820152606401610a1e565b33600090815260146020526040902054600690611f4990859061379f565b10611f965760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320796f757220616c6c6f636174696f6e2e006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000002b67600b5484611fc460025490565b611fce919061379f565b611fd8919061379f565b11156120265760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c792e000000000000000000000000006044820152606401610a1e565b612031338383612dc4565b61207d5760405162461bcd60e51b815260206004820152601960248201527f41646472657373206e6f74206f6e2057686974656c6973742e000000000000006044820152606401610a1e565b3360009081526013602052604090205460ff1615801561209e5750600c5415155b15611174576120ae600184613812565b6120bf9066670758aa7c80006137cb565b341461210d5760405162461bcd60e51b815260206004820152601560248201527f496e636f72726563742045544820616d6f756e742e00000000000000000000006044820152606401610a1e565b336000908152601360205260408120805460ff19166001908117909155600c80549192909161213d908490613812565b909155506111d39050565b6000546001600160a01b031633146121a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a1e565b6001600160a01b03811661221e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a1e565b610be481612ac2565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061229b826128f7565b80519091506000906001600160a01b0316336001600160a01b031614806122d25750336122c7846109a3565b6001600160a01b0316145b806122e4575081516122e49033610813565b9050806123595760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610a1e565b846001600160a01b031682600001516001600160a01b0316146123e45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610a1e565b6001600160a01b0384166124605760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6124706000848460000151612227565b6001600160a01b03851660009081526006602052604081208054600192906124a29084906001600160801b03166137ea565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260066020526040812080546001945090926124ee91859116613774565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561257684600161379f565b6000818152600560205260409020549091506001600160a01b0316612608576125a0816002541190565b156126085760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600954816126a25760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610a1e565b600060016126b0848461379f565b6126ba9190613812565b90506126e760017f0000000000000000000000000000000000000000000000000000000000002b67613812565b81111561271c5761271960017f0000000000000000000000000000000000000000000000000000000000002b67613812565b90505b612727816002541190565b6127995760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201527f6c65616e757000000000000000000000000000000000000000000000000000006064820152608401610a1e565b815b81811161283f576000818152600560205260409020546001600160a01b031661282d5760006127c9826128f7565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600590965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612837816138a7565b91505061279b565b5061284b81600161379f565b600955505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506128d084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612e3d565b95945050505050565b6128f3828260405180602001604052806000815250612e53565b5050565b6040805180820190915260008082526020820152612916826002541190565b6129885760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610a1e565b60007f000000000000000000000000000000000000000000000000000000000000003283106129e9576129db7f000000000000000000000000000000000000000000000000000000000000003284613812565b6129e690600161379f565b90505b825b818110612a53576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612a4057949350505050565b5080612a4b81613855565b9150506129eb565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610a1e565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b15612c7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b639033908990889088906004016136fd565b602060405180830381600087803b158015612b7d57600080fd5b505af1925050508015612bad575060408051601f3d908101601f19168201909252612baa9181019061354b565b60015b612c5d573d808015612bdb576040519150601f19603f3d011682016040523d82523d6000602084013e612be0565b606091505b508051612c555760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c7b565b5060015b949350505050565b6060601680546109209061386c565b606081612cd257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612cfc5780612ce6816138a7565b9150612cf59050600a836137b7565b9150612cd6565b60008167ffffffffffffffff811115612d1757612d1761392e565b6040519080825280601f01601f191660200182016040528015612d41576020820181803683370190505b5090505b8415612c7b57612d56600183613812565b9150612d63600a866138c2565b612d6e90603061379f565b60f81b818381518110612d8357612d83613918565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dbd600a866137b7565b9450612d45565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506128d084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490505b600082612e4a85846131d5565b14949350505050565b6002546001600160a01b038416612ed25760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b612edd816002541190565b15612f2a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610a1e565b7f0000000000000000000000000000000000000000000000000000000000000032831115612fc05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610a1e565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b0380821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190613029908790613774565b6001600160801b031681526020018583602001516130479190613774565b6001600160801b039081169091526001600160a01b03808816600081815260066020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156131ca5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131386000888488612b1f565b6131aa5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610a1e565b816131b4816138a7565b92505080806131c2906138a7565b9150506130eb565b50600281905561264a565b600081815b84518110156132415760008582815181106131f7576131f7613918565b6020026020010151905080831161321d576000838152602082905260409020925061322e565b600081815260208490526040902092505b5080613239816138a7565b9150506131da565b509392505050565b8280546132559061386c565b90600052602060002090601f01602090048101928261327757600085556132bd565b82601f106132905782800160ff198235161785556132bd565b828001600101855582156132bd579182015b828111156132bd5782358255916020019190600101906132a2565b50610edb9291505b80821115610edb57600081556001016132c5565b80356001600160a01b03811681146132f057600080fd5b919050565b60006020828403121561330757600080fd5b611e03826132d9565b6000806040838503121561332357600080fd5b61332c836132d9565b915061333a602084016132d9565b90509250929050565b6000806000806080858703121561335957600080fd5b613362856132d9565b9350613370602086016132d9565b925061337e604086016132d9565b915061338c606086016132d9565b905092959194509250565b6000806000606084860312156133ac57600080fd5b6133b5846132d9565b92506133c3602085016132d9565b9150604084013590509250925092565b600080600080608085870312156133e957600080fd5b6133f2856132d9565b9350613400602086016132d9565b925060408501359150606085013567ffffffffffffffff8082111561342457600080fd5b818701915087601f83011261343857600080fd5b81358181111561344a5761344a61392e565b604051601f8201601f19908116603f011681019083821181831017156134725761347261392e565b816040528281528a602084870101111561348b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156134c257600080fd5b6134cb836132d9565b9150602083013580151581146134e057600080fd5b809150509250929050565b600080604083850312156134fe57600080fd5b613507836132d9565b946020939093013593505050565b60006020828403121561352757600080fd5b5035919050565b60006020828403121561354057600080fd5b8135611e0381613944565b60006020828403121561355d57600080fd5b8151611e0381613944565b60006020828403121561357a57600080fd5b813560038110611e0357600080fd5b6000806020838503121561359c57600080fd5b823567ffffffffffffffff808211156135b457600080fd5b818501915085601f8301126135c857600080fd5b8135818111156135d757600080fd5b8660208285010111156135e957600080fd5b60209290920196919550909350505050565b60008060006040848603121561361057600080fd5b83359250602084013567ffffffffffffffff8082111561362f57600080fd5b818601915086601f83011261364357600080fd5b81358181111561365257600080fd5b8760208260051b850101111561366757600080fd5b6020830194508093505050509250925092565b60008151808452613692816020860160208601613829565b601f01601f19169290920160200192915050565b600083516136b8818460208801613829565b8351908301906136cc818360208801613829565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372f608083018461367a565b9695505050505050565b602081016003831061375b57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611e03602083018461367a565b60006001600160801b03808316818516808303821115613796576137966138d6565b01949350505050565b600082198211156137b2576137b26138d6565b500190565b6000826137c6576137c66138ec565b500490565b60008160001904831182151516156137e5576137e56138d6565b500290565b60006001600160801b038381169083168181101561380a5761380a6138d6565b039392505050565b600082821015613824576138246138d6565b500390565b60005b8381101561384457818101518382015260200161382c565b83811115611d295750506000910152565b600081613864576138646138d6565b506000190190565b600181811c9082168061388057607f821691505b602082108114156138a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138bb576138bb6138d6565b5060010190565b6000826138d1576138d16138ec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be457600080fdfea26469706673582212207a3c20c32e1c7de0d2d43582a2a6385b1070506260e629e6e16f54361ce371bb64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000002b6700000000000000000000000000000000000000000000000000000000000004570000000000000000000000000000000000000000000000000000000000000096

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 50
Arg [1] : collectionSize_ (uint256): 11111
Arg [2] : amountForFreeList_ (uint256): 1111
Arg [3] : amountForDevs_ (uint256): 150

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002b67
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000457
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000096


Deployed Bytecode Sourcemap

45735:7231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28755:369;;;;;;;;;;-1:-1:-1;28755:369:0;;;;;:::i;:::-;;:::i;:::-;;;7866:14:1;;7859:22;7841:41;;7829:2;7814:18;28755:369:0;;;;;;;;30663:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32366:292::-;;;;;;;;;;-1:-1:-1;32366:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7118:55:1;;;7100:74;;7088:2;7073:18;32366:292:0;6954:226:1;31887:413:0;;;;;;;;;;-1:-1:-1;31887:413:0;;;;;:::i;:::-;;:::i;:::-;;46281:67;;;;;;;;;;-1:-1:-1;46281:67:0;;;;-1:-1:-1;;;;;46281:67:0;;;46060:68;;;;;;;;;;-1:-1:-1;46060:68:0;;;;-1:-1:-1;;;;;46060:68:0;;;27111:100;;;;;;;;;;-1:-1:-1;27191:12:0;;27111:100;;;22111:25:1;;;22099:2;22084:18;27111:100:0;21965:177:1;33393:162:0;;;;;;;;;;-1:-1:-1;33393:162:0;;;;;:::i;:::-;;:::i;45803:37::-;;;;;;;;;;;;;;;;52648:134;;;;;;;;;;-1:-1:-1;52648:134:0;;;;;:::i;:::-;;:::i;27819:864::-;;;;;;;;;;-1:-1:-1;27819:864:0;;;;;:::i;:::-;;:::i;33626:177::-;;;;;;;;;;-1:-1:-1;33626:177:0;;;;;:::i;:::-;;:::i;51236:227::-;;;;;;;;;;-1:-1:-1;51236:227:0;;;;;:::i;:::-;;:::i;46357:44::-;;;;;;;;;;-1:-1:-1;46357:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27288:228;;;;;;;;;;-1:-1:-1;27288:228:0;;;;;:::i;:::-;;:::i;50749:102::-;;;;;;;;;;-1:-1:-1;50749:102:0;;;;;:::i;:::-;;:::i;45847:28::-;;;;;;;;;;;;;;;;47200:26;;;;;;;;;;-1:-1:-1;47200:26:0;;;;;;;;;;;;;;;:::i;48898:739::-;;;;;;:::i;:::-;;:::i;30472:124::-;;;;;;;;;;-1:-1:-1;30472:124:0;;;;;:::i;:::-;;:::i;45883:47::-;;;;;;;;;;;;45919:11;45883:47;;51085:112;;;;;;;;;;-1:-1:-1;51085:112:0;;;;;:::i;:::-;;:::i;29188:258::-;;;;;;;;;;-1:-1:-1;29188:258:0;;;;;:::i;:::-;;:::i;44286:94::-;;;;;;;;;;;;;:::i;50526:108::-;;;;;;;;;;-1:-1:-1;50526:108:0;;;;;:::i;:::-;;:::i;43635:87::-;;;;;;;;;;-1:-1:-1;43681:7:0;43708:6;-1:-1:-1;;;;;43708:6:0;43635:87;;52796:167;;;;;;;;;;-1:-1:-1;52796:167:0;;;;;:::i;:::-;;:::i;:::-;;;;21807:13:1;;-1:-1:-1;;;;;21803:62:1;21785:81;;21926:4;21914:17;;;21908:24;21934:18;21904:49;21882:20;;;21875:79;;;;21758:18;52796:167:0;21577:383:1;30832:104:0;;;;;;;;;;;;;:::i;46211:63::-;;;;;;;;;;-1:-1:-1;46211:63:0;;;;-1:-1:-1;;;;;46211:63:0;;;49674:388;;;;;;;;;;-1:-1:-1;49674:388:0;;;;;:::i;:::-;;:::i;52045:593::-;;;;;;;;;;;;;:::i;32730:311::-;;;;;;;;;;-1:-1:-1;32730:311:0;;;;;:::i;:::-;;:::i;51471:566::-;;;;;;;;;;;;;:::i;50070:448::-;;;;;;:::i;:::-;;:::i;46135:69::-;;;;;;;;;;-1:-1:-1;46135:69:0;;;;-1:-1:-1;;;;;46135:69:0;;;33874:355;;;;;;;;;;-1:-1:-1;33874:355:0;;;;;:::i;:::-;;:::i;31007:476::-;;;;;;;;;;-1:-1:-1;31007:476:0;;;;;:::i;:::-;;:::i;46408:53::-;;;;;;;;;;-1:-1:-1;46408:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;38755:43;;;;;;;;;;;;;;;;50642:99;;;;;;;;;;-1:-1:-1;50642:99:0;;;;;:::i;:::-;;:::i;33112:214::-;;;;;;;;;;-1:-1:-1;33112:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;33283:25:0;;;33254:4;33283:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33112:214;47867:1023;;;;;;:::i;:::-;;:::i;44535:229::-;;;;;;;;;;-1:-1:-1;44535:229:0;;;;;:::i;:::-;;:::i;28755:369::-;28901:4;-1:-1:-1;;;;;;28943:40:0;;28958:25;28943:40;;:105;;-1:-1:-1;;;;;;;29000:48:0;;29015:33;29000:48;28943:105;:172;;;-1:-1:-1;;;;;;;29065:50:0;;29080:35;29065:50;28943:172;28923:192;28755:369;-1:-1:-1;;28755:369:0:o;30663:100::-;30717:13;30750:5;30743:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30663:100;:::o;32366:292::-;32470:7;32517:16;32525:7;34575:12;;-1:-1:-1;34565:22:0;34484:111;32517:16;32495:111;;;;-1:-1:-1;;;32495:111:0;;20962:2:1;32495:111:0;;;20944:21:1;21001:2;20981:18;;;20974:30;21040:34;21020:18;;;21013:62;21111:15;21091:18;;;21084:43;21144:19;;32495:111:0;;;;;;;;;-1:-1:-1;32626:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32626:24:0;;32366:292::o;31887:413::-;31960:13;31976:24;31992:7;31976:15;:24::i;:::-;31960:40;;32025:5;-1:-1:-1;;;;;32019:11:0;:2;-1:-1:-1;;;;;32019:11:0;;;32011:58;;;;-1:-1:-1;;;32011:58:0;;16366:2:1;32011:58:0;;;16348:21:1;16405:2;16385:18;;;16378:30;16444:34;16424:18;;;16417:62;16515:4;16495:18;;;16488:32;16537:19;;32011:58:0;16164:398:1;32011:58:0;24402:10;-1:-1:-1;;;;;32104:21:0;;;;:62;;-1:-1:-1;32129:37:0;32146:5;24402:10;33112:214;:::i;32129:37::-;32082:169;;;;-1:-1:-1;;;32082:169:0;;11805:2:1;32082:169:0;;;11787:21:1;11844:2;11824:18;;;11817:30;11883:34;11863:18;;;11856:62;11954:27;11934:18;;;11927:55;11999:19;;32082:169:0;11603:421:1;32082:169:0;32264:28;32273:2;32277:7;32286:5;32264:8;:28::i;:::-;31949:351;31887:413;;:::o;33393:162::-;33519:28;33529:4;33535:2;33539:7;33519:9;:28::i;52648:134::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;52746:28:::1;52765:8;52746:18;:28::i;:::-;52648:134:::0;:::o;27819:864::-;27944:7;27985:16;27995:5;27985:9;:16::i;:::-;27977:5;:24;27969:71;;;;-1:-1:-1;;;27969:71:0;;8723:2:1;27969:71:0;;;8705:21:1;8762:2;8742:18;;;8735:30;8801:34;8781:18;;;8774:62;8872:4;8852:18;;;8845:32;8894:19;;27969:71:0;8521:398:1;27969:71:0;28051:22;28076:13;27191:12;;;27111:100;28076:13;28051:38;;28100:19;28134:25;28188:9;28183:426;28207:14;28203:1;:18;28183:426;;;28243:31;28277:14;;;:11;:14;;;;;;;;;28243:48;;;;;;;;;-1:-1:-1;;;;;28243:48:0;;;;;-1:-1:-1;;;28243:48:0;;;;;;;;;;;;28310:28;28306:103;;28379:14;;;-1:-1:-1;28306:103:0;28448:5;-1:-1:-1;;;;;28427:26:0;:17;-1:-1:-1;;;;;28427:26:0;;28423:175;;;28493:5;28478:11;:20;28474:77;;;-1:-1:-1;28530:1:0;-1:-1:-1;28523:8:0;;-1:-1:-1;;;28523:8:0;28474:77;28569:13;;;;:::i;:::-;;;;28423:175;-1:-1:-1;28223:3:0;;;;:::i;:::-;;;;28183:426;;;-1:-1:-1;28619:56:0;;-1:-1:-1;;;28619:56:0;;19014:2:1;28619:56:0;;;18996:21:1;19053:2;19033:18;;;19026:30;19092:34;19072:18;;;19065:62;19163:16;19143:18;;;19136:44;19197:19;;28619:56:0;18812:410:1;33626:177:0;33756:39;33773:4;33779:2;33783:7;33756:39;;;;;;;;;;;;:16;:39::i;51236:227::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;51362:3:::1;:10:::0;;-1:-1:-1;;;;;51362:10:0;;::::1;-1:-1:-1::0;;51362:10:0;;::::1;;::::0;;;51379:8:::1;:20:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;51406:9:::1;:22:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;51435:7:::1;:18:::0;;;;;::::1;::::0;::::1;;::::0;;51236:227::o;27288:228::-;27391:7;27432:13;27191:12;;;27111:100;27432:13;27424:5;:21;27416:69;;;;-1:-1:-1;;;27416:69:0;;9944:2:1;27416:69:0;;;9926:21:1;9983:2;9963:18;;;9956:30;10022:34;10002:18;;;9995:62;10093:5;10073:18;;;10066:33;10116:19;;27416:69:0;9742:399:1;27416:69:0;-1:-1:-1;27503:5:0;27288:228::o;50749:102::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;50822:9:::1;:21:::0;;50834:9;;50822;-1:-1:-1;;50822:21:0::1;::::0;50834:9;50822:21:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;50749:102:::0;:::o;48898:739::-;46977:9;46990:10;46977:23;46969:63;;;;-1:-1:-1;;;46969:63:0;;13351:2:1;46969:63:0;;;13333:21:1;13390:2;13370:18;;;13363:30;13429:29;13409:18;;;13402:57;13476:18;;46969:63:0;13149:351:1;46969:63:0;49042:1:::1;49026:13;:17;49018:26;;;::::0;::::1;;49076:17;49063:9;::::0;::::1;;:30;::::0;::::1;;;;;;:::i;:::-;;49055:69;;;::::0;-1:-1:-1;;;49055:69:0;;12996:2:1;49055:69:0::1;::::0;::::1;12978:21:1::0;13035:2;13015:18;;;13008:30;13074:28;13054:18;;;13047:56;13120:18;;49055:69:0::1;12794:350:1::0;49055:69:0::1;49162:10;49143:30;::::0;;;:18:::1;:30;::::0;;;;;49192:1:::1;::::0;49143:46:::1;::::0;49176:13;;49143:46:::1;:::i;:::-;:50;49135:94;;;::::0;-1:-1:-1;;;49135:94:0;;18654:2:1;49135:94:0::1;::::0;::::1;18636:21:1::0;18693:2;18673:18;;;18666:30;18732:33;18712:18;;;18705:61;18783:18;;49135:94:0::1;18452:355:1::0;49135:94:0::1;49306:14;49280:22;;49264:13;49248;27191:12:::0;;;27111:100;49248:13:::1;:29;;;;:::i;:::-;:54;;;;:::i;:::-;:72;;49240:104;;;::::0;-1:-1:-1;;;49240:104:0;;16018:2:1;49240:104:0::1;::::0;::::1;16000:21:1::0;16057:2;16037:18;;;16030:30;16096:21;16076:18;;;16069:49;16135:18;;49240:104:0::1;15816:343:1::0;49240:104:0::1;49363:48;49386:10;49398:12;;49363:22;:48::i;:::-;49355:86;;;::::0;-1:-1:-1;;;49355:86:0;;11451:2:1;49355:86:0::1;::::0;::::1;11433:21:1::0;11490:2;11470:18;;;11463:30;11529:27;11509:18;;;11502:55;11574:18;;49355:86:0::1;11249:349:1::0;49355:86:0::1;49473:25;49485:13:::0;45919:11:::1;49473:25;:::i;:::-;49460:9;:38;49452:72;;;::::0;-1:-1:-1;;;49452:72:0;;20612:2:1;49452:72:0::1;::::0;::::1;20594:21:1::0;20651:2;20631:18;;;20624:30;20690:23;20670:18;;;20663:51;20731:18;;49452:72:0::1;20410:345:1::0;49452:72:0::1;49556:10;49537:30;::::0;;;:18:::1;:30;::::0;;;;:47;;49571:13;;49537:30;:47:::1;::::0;49571:13;;49537:47:::1;:::i;:::-;::::0;;;-1:-1:-1;49597:36:0::1;::::0;-1:-1:-1;49607:10:0::1;49619:13:::0;49597:9:::1;:36::i;30472:124::-:0;30536:7;30563:20;30575:7;30563:11;:20::i;:::-;:25;;30472:124;-1:-1:-1;;30472:124:0:o;51085:112::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;51164:25:::1;:13;51180:9:::0;;51164:25:::1;:::i;29188:258::-:0;29252:7;-1:-1:-1;;;;;29294:19:0;;29272:112;;;;-1:-1:-1;;;29272:112:0;;12584:2:1;29272:112:0;;;12566:21:1;12623:2;12603:18;;;12596:30;12662:34;12642:18;;;12635:62;12733:13;12713:18;;;12706:41;12764:19;;29272:112:0;12382:407:1;29272:112:0;-1:-1:-1;;;;;;29410:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29410:27:0;;29188:258::o;44286:94::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;44351:21:::1;44369:1;44351:9;:21::i;:::-;44286:94::o:0;50526:108::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;50600:13:::1;:25:::0;50526:108::o;52796:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;52935:20:0;52947:7;52935:11;:20::i;30832:104::-;30888:13;30921:7;30914:14;;;;;:::i;49674:388::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;49775:1:::1;49759:13;:17;49751:26;;;::::0;::::1;;49813:22;;49796:13;:39;;49788:78;;;::::0;-1:-1:-1;;;49788:78:0;;18299:2:1;49788:78:0::1;::::0;::::1;18281:21:1::0;18338:2;18318:18;;;18311:30;18377:28;18357:18;;;18350:56;18423:18;;49788:78:0::1;18097:350:1::0;49788:78:0::1;49903:13;49877:22;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;49968:14:0::1;::::0;-1:-1:-1;49951:13:0;49935::::1;27191:12:::0;;;27111:100;49935:13:::1;:29;;;;:::i;:::-;:47;;49927:79;;;::::0;-1:-1:-1;;;49927:79:0;;11103:2:1;49927:79:0::1;::::0;::::1;11085:21:1::0;11142:2;11122:18;;;11115:30;11181:21;11161:18;;;11154:49;11220:18;;49927:79:0::1;10901:343:1::0;49927:79:0::1;50017:36;50027:10;50039:13;50017:9;:36::i;52045:593::-:0;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;22775:1:::1;23371:7;;:19;;23363:63;;;::::0;-1:-1:-1;;;23363:63:0;;19836:2:1;23363:63:0::1;::::0;::::1;19818:21:1::0;19875:2;19855:18;;;19848:30;19914:33;19894:18;;;19887:61;19965:18;;23363:63:0::1;19634:355:1::0;23363:63:0::1;22775:1;23504:7;:18:::0;52131:21:::2;52113:15;52195:4;52183:11;52131:21:::0;52183:3:::2;:11;:::i;:::-;:16;;;;:::i;:::-;52163:36:::0;-1:-1:-1;52210:13:0::2;52237:3;52226:10;52229:7:::0;52226:2:::2;:10;:::i;:::-;:14;;;;:::i;:::-;52210:30:::0;-1:-1:-1;52251:15:0::2;52210:30:::0;52279:11:::2;52281:9:::0;52279:1:::2;:11;:::i;:::-;52269:21;::::0;:7;:21:::2;:::i;:::-;:29;;;;:::i;:::-;52331:8;::::0;52323:44:::2;::::0;52251:47;;-1:-1:-1;52310:7:0::2;::::0;-1:-1:-1;;;;;52331:8:0;;::::2;::::0;52353:9;;52310:7;52323:44;52310:7;52323:44;52353:9;52331:8;52323:44:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;52400:9:0::2;::::0;52392:45:::2;::::0;52309:58;;-1:-1:-1;52379:7:0::2;::::0;-1:-1:-1;;;;;52400:9:0;;::::2;::::0;52423;;52379:7;52392:45;52379:7;52392:45;52423:9;52400;52392:45:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;52470:3:0::2;::::0;52462:35:::2;::::0;52378:59;;-1:-1:-1;52449:7:0::2;::::0;-1:-1:-1;;;;;52470:3:0;;::::2;::::0;52487:5;;52449:7;52462:35;52449:7;52462:35;52487:5;52470:3;52462:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52448:49;;;52509:7;52530:10;-1:-1:-1::0;;;;;52522:24:0::2;52554:7;52522:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52508:58;;;52585:2;:8;;;;;52591:2;52585:8;:14;;;;;52597:2;52585:14;:20;;;;;52603:2;52585:20;52577:53;;;::::0;-1:-1:-1;;;52577:53:0;;10348:2:1;52577:53:0::2;::::0;::::2;10330:21:1::0;10387:2;10367:18;;;10360:30;10426:22;10406:18;;;10399:50;10466:18;;52577:53:0::2;10146:344:1::0;52577:53:0::2;-1:-1:-1::0;;22731:1:0::1;23683:7;:22:::0;-1:-1:-1;;;;;;52045:593:0:o;32730:311::-;-1:-1:-1;;;;;32848:24:0;;24402:10;32848:24;;32840:63;;;;-1:-1:-1;;;32840:63:0;;14891:2:1;32840:63:0;;;14873:21:1;14930:2;14910:18;;;14903:30;14969:28;14949:18;;;14942:56;15015:18;;32840:63:0;14689:350:1;32840:63:0;24402:10;32916:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32916:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32916:53:0;;;;;;;;;;32985:48;;7841:41:1;;;32916:42:0;;24402:10;32985:48;;7814:18:1;32985:48:0;;;;;;;32730:311;;:::o;51471:566::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;22775:1:::1;23371:7;;:19;;23363:63;;;::::0;-1:-1:-1;;;23363:63:0;;19836:2:1;23363:63:0::1;::::0;::::1;19818:21:1::0;19875:2;19855:18;;;19848:30;19914:33;19894:18;;;19887:61;19965:18;;23363:63:0::1;19634:355:1::0;23363:63:0::1;22775:1;23504:7;:18:::0;51553:21:::2;51535:15;51613:4;51601:11;51553:21:::0;51601:3:::2;:11;:::i;:::-;:16;;;;:::i;:::-;51581:36:::0;-1:-1:-1;51624:13:0::2;51651:3;51640:10;51643:7:::0;51640:2:::2;:10;:::i;:::-;:14;;;;:::i;:::-;51624:30:::0;-1:-1:-1;51661:17:0::2;51691:3;51681:9;51683:7:::0;51681:1:::2;:9;:::i;:::-;:13;;;;:::i;:::-;51725:8;::::0;51717:44:::2;::::0;51661:33;;-1:-1:-1;51702:10:0::2;::::0;-1:-1:-1;;;;;51725:8:0;;::::2;::::0;51747:9;;51702:10;51717:44;51702:10;51717:44;51747:9;51725:8;51717:44:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;51792:9:0::2;::::0;51784:45:::2;::::0;51701:60;;-1:-1:-1;51769:10:0::2;::::0;-1:-1:-1;;;;;51792:9:0;;::::2;::::0;51815;;51769:10;51784:45;51769:10;51784:45;51815:9;51792;51784:45:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;51860:3:0::2;::::0;51852:35:::2;::::0;51768:61;;-1:-1:-1;51837:10:0::2;::::0;-1:-1:-1;;;;;51860:3:0;;::::2;::::0;51877:5;;51837:10;51852:35;51837:10;51852:35;51877:5;51860:3;51852:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;51918:7:0::2;::::0;51910:43:::2;::::0;51836:51;;-1:-1:-1;51895:10:0::2;::::0;-1:-1:-1;;;;;51918:7:0;;::::2;::::0;51939:9;;51910:43:::2;6744:205:1::0;50070:448:0;46977:9;46990:10;46977:23;46969:63;;;;-1:-1:-1;;;46969:63:0;;13351:2:1;46969:63:0;;;13333:21:1;13390:2;13370:18;;;13363:30;13429:29;13409:18;;;13402:57;13476:18;;46969:63:0;13149:351:1;46969:63:0;50182:1:::1;50166:13;:17;50158:26;;;::::0;::::1;;50217:16;50204:9;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;50196:66;;;::::0;-1:-1:-1;;;50196:66:0;;15246:2:1;50196:66:0::1;::::0;::::1;15228:21:1::0;15285:2;15265:18;;;15258:30;15324:26;15304:18;;;15297:54;15368:18;;50196:66:0::1;15044:348:1::0;50196:66:0::1;50294:25;50306:13:::0;45919:11:::1;50294:25;:::i;:::-;50281:9;:38;50273:72;;;::::0;-1:-1:-1;;;50273:72:0;;16769:2:1;50273:72:0::1;::::0;::::1;16751:21:1::0;16808:2;16788:18;;;16781:30;16847:23;16827:18;;;16820:51;16888:18;;50273:72:0::1;16567:345:1::0;50273:72:0::1;50422:14;50396:22;;50380:13;50364;27191:12:::0;;;27111:100;50364:13:::1;:29;;;;:::i;33874:355::-:0;34033:28;34043:4;34049:2;34053:7;34033:9;:28::i;:::-;34094:48;34117:4;34123:2;34127:7;34136:5;34094:22;:48::i;:::-;34072:149;;;;-1:-1:-1;;;34072:149:0;;17119:2:1;34072:149:0;;;17101:21:1;17158:2;17138:18;;;17131:30;17197:34;17177:18;;;17170:62;17268:21;17248:18;;;17241:49;17307:19;;34072:149:0;16917:415:1;34072:149:0;33874:355;;;;:::o;31007:476::-;31125:13;31178:16;31186:7;34575:12;;-1:-1:-1;34565:22:0;34484:111;31178:16;31156:113;;;;-1:-1:-1;;;31156:113:0;;14475:2:1;31156:113:0;;;14457:21:1;14514:2;14494:18;;;14487:30;14553:34;14533:18;;;14526:62;14624:17;14604:18;;;14597:45;14659:19;;31156:113:0;14273:411:1;31156:113:0;31282:21;31306:10;:8;:10::i;:::-;31282:34;;31371:1;31353:7;31347:21;:25;:128;;;;;;;;;;;;;;;;;31416:7;31425:18;:7;:16;:18::i;:::-;31399:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31347:128;31327:148;31007:476;-1:-1:-1;;;31007:476:0:o;50642:99::-;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;50708:14:::1;:24:::0;50642:99::o;47867:1023::-;46977:9;46990:10;46977:23;46969:63;;;;-1:-1:-1;;;46969:63:0;;13351:2:1;46969:63:0;;;13333:21:1;13390:2;13370:18;;;13363:30;13429:29;13409:18;;;13402:57;13476:18;;46969:63:0;13149:351:1;46969:63:0;48016:1:::1;48000:13;:17;47992:26;;;::::0;::::1;;48050:17;48037:9;::::0;::::1;;:30;::::0;::::1;;;;;;:::i;:::-;;48029:69;;;::::0;-1:-1:-1;;;48029:69:0;;12996:2:1;48029:69:0::1;::::0;::::1;12978:21:1::0;13035:2;13015:18;;;13008:30;13074:28;13054:18;;;13047:56;13120:18;;48029:69:0::1;12794:350:1::0;48029:69:0::1;48136:10;48117:30;::::0;;;:18:::1;:30;::::0;;;;;48166:1:::1;::::0;48117:46:::1;::::0;48150:13;;48117:46:::1;:::i;:::-;:50;48109:94;;;::::0;-1:-1:-1;;;48109:94:0;;18654:2:1;48109:94:0::1;::::0;::::1;18636:21:1::0;18693:2;18673:18;;;18666:30;18732:33;18712:18;;;18705:61;18783:18;;48109:94:0::1;18452:355:1::0;48109:94:0::1;48280:14;48254:22;;48238:13;48222;27191:12:::0;;;27111:100;48222:13:::1;:29;;;;:::i;:::-;:54;;;;:::i;:::-;:72;;48214:104;;;::::0;-1:-1:-1;;;48214:104:0;;16018:2:1;48214:104:0::1;::::0;::::1;16000:21:1::0;16057:2;16037:18;;;16030:30;16096:21;16076:18;;;16069:49;16135:18;;48214:104:0::1;15816:343:1::0;48214:104:0::1;48337:47;48359:10;48371:12;;48337:21;:47::i;:::-;48329:85;;;::::0;-1:-1:-1;;;48329:85:0;;11451:2:1;48329:85:0::1;::::0;::::1;11433:21:1::0;11490:2;11470:18;;;11463:30;11529:27;11509:18;;;11502:55;11574:18;;48329:85:0::1;11249:349:1::0;48329:85:0::1;48444:10;48431:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;:33;::::0;::::1;:55;;-1:-1:-1::0;48468:13:0::1;::::0;:18;::::1;48431:55;48427:351;;;48537:17;48553:1;48537:13:::0;:17:::1;:::i;:::-;48524:31;::::0;45919:11:::1;48524:31;:::i;:::-;48511:9;:44;48503:78;;;::::0;-1:-1:-1;;;48503:78:0;;20612:2:1;48503:78:0::1;::::0;::::1;20594:21:1::0;20651:2;20631:18;;;20624:30;20690:23;20670:18;;;20663:51;20731:18;;48503:78:0::1;20410:345:1::0;48503:78:0::1;48609:10;48596:24;::::0;;;:12:::1;:24;::::0;;;;:31;;-1:-1:-1;;48596:31:0::1;48623:4;48596:31:::0;;::::1;::::0;;;48642:13:::1;:18:::0;;48623:4;;48642:13;;:18:::1;::::0;48623:4;;48642:18:::1;:::i;:::-;::::0;;;-1:-1:-1;48427:351:0::1;::::0;-1:-1:-1;48427:351:0::1;44535:229:::0;43681:7;43708:6;-1:-1:-1;;;;;43708:6:0;24402:10;43855:23;43847:68;;;;-1:-1:-1;;;43847:68:0;;14114:2:1;43847:68:0;;;14096:21:1;;;14133:18;;;14126:30;14192:34;14172:18;;;14165:62;14244:18;;43847:68:0;13912:356:1;43847:68:0;-1:-1:-1;;;;;44638:22:0;::::1;44616:110;;;::::0;-1:-1:-1;;;44616:110:0;;9126:2:1;44616:110:0::1;::::0;::::1;9108:21:1::0;9165:2;9145:18;;;9138:30;9204:34;9184:18;;;9177:62;9275:8;9255:18;;;9248:36;9301:19;;44616:110:0::1;8924:402:1::0;44616:110:0::1;44737:19;44747:8;44737:9;:19::i;38551:196::-:0;38666:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;38666:29:0;-1:-1:-1;;;;;38666:29:0;;;;;;;;;38711:28;;38666:24;;38711:28;;;;;;;38551:196;;;:::o;36724:1709::-;36839:35;36877:20;36889:7;36877:11;:20::i;:::-;36952:18;;36839:58;;-1:-1:-1;36910:22:0;;-1:-1:-1;;;;;36936:34:0;24402:10;-1:-1:-1;;;;;36936:34:0;;:87;;;-1:-1:-1;24402:10:0;36987:20;36999:7;36987:11;:20::i;:::-;-1:-1:-1;;;;;36987:36:0;;36936:87;:154;;;-1:-1:-1;37057:18:0;;37040:50;;24402:10;33112:214;:::i;37040:50::-;36910:181;;37126:17;37104:117;;;;-1:-1:-1;;;37104:117:0;;15599:2:1;37104:117:0;;;15581:21:1;15638:2;15618:18;;;15611:30;15677:34;15657:18;;;15650:62;15748:20;15728:18;;;15721:48;15786:19;;37104:117:0;15397:414:1;37104:117:0;37278:4;-1:-1:-1;;;;;37256:26:0;:13;:18;;;-1:-1:-1;;;;;37256:26:0;;37234:114;;;;-1:-1:-1;;;37234:114:0;;13707:2:1;37234:114:0;;;13689:21:1;13746:2;13726:18;;;13719:30;13785:34;13765:18;;;13758:62;13856:8;13836:18;;;13829:36;13882:19;;37234:114:0;13505:402:1;37234:114:0;-1:-1:-1;;;;;37367:16:0;;37359:66;;;;-1:-1:-1;;;37359:66:0;;10697:2:1;37359:66:0;;;10679:21:1;10736:2;10716:18;;;10709:30;10775:34;10755:18;;;10748:62;10846:7;10826:18;;;10819:35;10871:19;;37359:66:0;10495:401:1;37359:66:0;37546:49;37563:1;37567:7;37576:13;:18;;;37546:8;:49::i;:::-;-1:-1:-1;;;;;37608:18:0;;;;;;:12;:18;;;;;:31;;37638:1;;37608:18;:31;;37638:1;;-1:-1:-1;;;;;37608:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;37608:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37650:16:0;;-1:-1:-1;37650:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;37650:16:0;;:29;;-1:-1:-1;;37650:29:0;;:::i;:::-;;;-1:-1:-1;;;;;37650:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37713:43:0;;;;;;;;-1:-1:-1;;;;;37713:43:0;;;;;;37739:15;37713:43;;;;;;;;;-1:-1:-1;37690:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;37690:66:0;-1:-1:-1;;;;;;37690:66:0;;;;;;;;;;;38018:11;37702:7;-1:-1:-1;38018:11:0;:::i;:::-;38085:1;38044:24;;;:11;:24;;;;;:29;37996:33;;-1:-1:-1;;;;;;38044:29:0;38040:288;;38108:20;38116:11;34575:12;;-1:-1:-1;34565:22:0;34484:111;38108:20;38104:213;;;38176:125;;;;;;;;38213:18;;-1:-1:-1;;;;;38176:125:0;;;;;;38254:28;;;;38176:125;;;;;;;;;;-1:-1:-1;38149:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;38149:152:0;-1:-1:-1;;;;;;38149:152:0;;;;;;;;;;;;38104:213;38364:7;38360:2;-1:-1:-1;;;;;38345:27:0;38354:4;-1:-1:-1;;;;;38345:27:0;;;;;;;;;;;38383:42;36828:1605;;;36724:1709;;;:::o;38911:950::-;39005:24;;39048:12;39040:49;;;;-1:-1:-1;;;39040:49:0;;12231:2:1;39040:49:0;;;12213:21:1;12270:2;12250:18;;;12243:30;12309:26;12289:18;;;12282:54;12353:18;;39040:49:0;12029:348:1;39040:49:0;39100:16;39150:1;39119:28;39139:8;39119:17;:28;:::i;:::-;:32;;;;:::i;:::-;39100:51;-1:-1:-1;39177:18:0;39194:1;39177:14;:18;:::i;:::-;39166:8;:29;39162:91;;;39223:18;39240:1;39223:14;:18;:::i;:::-;39212:29;;39162:91;39376:17;39384:8;34575:12;;-1:-1:-1;34565:22:0;34484:111;39376:17;39368:68;;;;-1:-1:-1;;;39368:68:0;;19429:2:1;39368:68:0;;;19411:21:1;19468:2;19448:18;;;19441:30;19507:34;19487:18;;;19480:62;19578:8;19558:18;;;19551:36;19604:19;;39368:68:0;19227:402:1;39368:68:0;39464:17;39447:357;39488:8;39483:1;:13;39447:357;;39553:1;39522:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;39522:19:0;39518:275;;39576:31;39610:14;39622:1;39610:11;:14::i;:::-;39660:117;;;;;;;;39697:14;;-1:-1:-1;;;;;39660:117:0;;;;;;39734:24;;;;39660:117;;;;;;;;;;-1:-1:-1;39643:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;39643:134:0;-1:-1:-1;;;;;;39643:134:0;;;;;;;;;;;;-1:-1:-1;39518:275:0;39498:3;;;;:::i;:::-;;;;39447:357;;;-1:-1:-1;39841:12:0;:8;39852:1;39841:12;:::i;:::-;39814:24;:39;-1:-1:-1;;;38911:950:0:o;47545:256::-;47692:26;;-1:-1:-1;;6017:2:1;6013:15;;;6009:53;47692:26:0;;;5997:66:1;47650:4:0;;;;6079:12:1;;47692:26:0;;;;;;;;;;;;47682:37;;;;;;47667:52;;47738:54;47757:12;;47738:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47771:14:0;;;-1:-1:-1;47787:4:0;;-1:-1:-1;47738:18:0;:54::i;:::-;47731:61;47545:256;-1:-1:-1;;;;;47545:256:0:o;34603:104::-;34672:27;34682:2;34686:8;34672:27;;;;;;;;;;;;:9;:27::i;:::-;34603:104;;:::o;29728:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;29863:16:0;29871:7;34575:12;;-1:-1:-1;34565:22:0;34484:111;29863:16;29855:71;;;;-1:-1:-1;;;29855:71:0;;9533:2:1;29855:71:0;;;9515:21:1;9572:2;9552:18;;;9545:30;9611:34;9591:18;;;9584:62;9682:12;9662:18;;;9655:40;9712:19;;29855:71:0;9331:406:1;29855:71:0;29939:26;29991:12;29980:7;:23;29976:103;;30041:22;30051:12;30041:7;:22;:::i;:::-;:26;;30066:1;30041:26;:::i;:::-;30020:47;;29976:103;30111:7;30091:242;30128:18;30120:4;:26;30091:242;;30171:31;30205:17;;;:11;:17;;;;;;;;;30171:51;;;;;;;;;-1:-1:-1;;;;;30171:51:0;;;;;-1:-1:-1;;;30171:51:0;;;;;;;;;;;;30241:28;30237:85;;30297:9;29728:682;-1:-1:-1;;;;29728:682:0:o;30237:85::-;-1:-1:-1;30148:6:0;;;;:::i;:::-;;;;30091:242;;;-1:-1:-1;30345:57:0;;-1:-1:-1;;;30345:57:0;;20196:2:1;30345:57:0;;;20178:21:1;20235:2;20215:18;;;20208:30;20274:34;20254:18;;;20247:62;20345:17;20325:18;;;20318:45;20380:19;;30345:57:0;19994:411:1;44772:173:0;44828:16;44847:6;;-1:-1:-1;;;;;44864:17:0;;;-1:-1:-1;;44864:17:0;;;;;;44897:40;;44847:6;;;;;;;44897:40;;44828:16;44897:40;44817:128;44772:173;:::o;40426:985::-;40581:4;-1:-1:-1;;;;;40602:13:0;;5539:20;5587:8;40598:806;;40655:175;;-1:-1:-1;;;40655:175:0;;-1:-1:-1;;;;;40655:36:0;;;;;:175;;24402:10;;40749:4;;40776:7;;40806:5;;40655:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40655:175:0;;;;;;;;-1:-1:-1;;40655:175:0;;;;;;;;;;;;:::i;:::-;;;40634:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41017:13:0;;41013:321;;41060:109;;-1:-1:-1;;;41060:109:0;;17119:2:1;41060:109:0;;;17101:21:1;17158:2;17138:18;;;17131:30;17197:34;17177:18;;;17170:62;17268:21;17248:18;;;17241:49;17307:19;;41060:109:0;16917:415:1;41013:321:0;41284:6;41278:13;41269:6;41265:2;41261:15;41254:38;40634:715;-1:-1:-1;;;;;;40894:55:0;-1:-1:-1;;;40894:55:0;;-1:-1:-1;40887:62:0;;40598:806;-1:-1:-1;41388:4:0;40598:806;40426:985;;;;;;:::o;50963:114::-;51023:13;51056;51049:20;;;;;:::i;2711:723::-;2767:13;2988:10;2984:53;;-1:-1:-1;;3015:10:0;;;;;;;;;;;;;;;;;;2711:723::o;2984:53::-;3062:5;3047:12;3103:78;3110:9;;3103:78;;3136:8;;;;:::i;:::-;;-1:-1:-1;3159:10:0;;-1:-1:-1;3167:2:0;3159:10;;:::i;:::-;;;3103:78;;;3191:19;3223:6;3213:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3213:17:0;;3191:39;;3241:154;3248:10;;3241:154;;3275:11;3285:1;3275:11;;:::i;:::-;;-1:-1:-1;3344:10:0;3352:2;3344:5;:10;:::i;:::-;3331:24;;:2;:24;:::i;:::-;3318:39;;3301:6;3308;3301:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3372:11:0;3381:2;3372:11;;:::i;:::-;;;3241:154;;47285:252;47430:26;;-1:-1:-1;;6017:2:1;6013:15;;;6009:53;47430:26:0;;;5997:66:1;47389:4:0;;;;6079:12:1;;47430:26:0;;;;;;;;;;;;47420:37;;;;;;47405:52;;47475:53;47494:12;;47475:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47508:13:0;;;-1:-1:-1;47523:4:0;;-1:-1:-1;954:190:0;1079:4;1132;1103:25;1116:5;1123:4;1103:12;:25::i;:::-;:33;;954:190;-1:-1:-1;;;;954:190:0:o;35070:1400::-;35216:12;;-1:-1:-1;;;;;35247:16:0;;35239:62;;;;-1:-1:-1;;;35239:62:0;;17897:2:1;35239:62:0;;;17879:21:1;17936:2;17916:18;;;17909:30;17975:34;17955:18;;;17948:62;18046:3;18026:18;;;18019:31;18067:19;;35239:62:0;17695:397:1;35239:62:0;35446:21;35454:12;34575;;-1:-1:-1;34565:22:0;34484:111;35446:21;35445:22;35437:64;;;;-1:-1:-1;;;35437:64:0;;17539:2:1;35437:64:0;;;17521:21:1;17578:2;17558:18;;;17551:30;17617:31;17597:18;;;17590:59;17666:18;;35437:64:0;17337:353:1;35437:64:0;35532:12;35520:8;:24;;35512:71;;;;-1:-1:-1;;;35512:71:0;;21376:2:1;35512:71:0;;;21358:21:1;21415:2;21395:18;;;21388:30;21454:34;21434:18;;;21427:62;21525:4;21505:18;;;21498:32;21547:19;;35512:71:0;21174:398:1;35512:71:0;-1:-1:-1;;;;;35703:16:0;;35670:30;35703:16;;;:12;:16;;;;;;;;;35670:49;;;;;;;;;-1:-1:-1;;;;;35670:49:0;;;;;;;;;;;;;;;;;35749:135;;;;;;;;35775:19;;35670:49;;35749:135;;;35775:39;;35805:8;;35775:39;:::i;:::-;-1:-1:-1;;;;;35749:135:0;;;;;35864:8;35829:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;35749:135:0;;;;;;-1:-1:-1;;;;;35730:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;35923:43;;;;;;;;;;;35949:15;35923:43;;;;;;;;35895:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;35895:71:0;-1:-1:-1;;;;;;35895:71:0;;;;;;;;;;;;;;;;;;35907:12;;36027:325;36051:8;36047:1;:12;36027:325;;;36086:38;;36111:12;;-1:-1:-1;;;;;36086:38:0;;;36103:1;;36086:38;;36103:1;;36086:38;36165:59;36196:1;36200:2;36204:12;36218:5;36165:22;:59::i;:::-;36139:172;;;;-1:-1:-1;;;36139:172:0;;17119:2:1;36139:172:0;;;17101:21:1;17158:2;17138:18;;;17131:30;17197:34;17177:18;;;17170:62;17268:21;17248:18;;;17241:49;17307:19;;36139:172:0;16917:415:1;36139:172:0;36326:14;;;;:::i;:::-;;;;36061:3;;;;;:::i;:::-;;;;36027:325;;;-1:-1:-1;36364:12:0;:27;;;36402:60;33874:355;1506:675;1589:7;1632:4;1589:7;1647:497;1671:5;:12;1667:1;:16;1647:497;;;1705:20;1728:5;1734:1;1728:8;;;;;;;;:::i;:::-;;;;;;;1705:31;;1771:12;1755;:28;1751:382;;2257:13;2307:15;;;2343:4;2336:15;;;2390:4;2374:21;;1883:57;;1751:382;;;2257:13;2307:15;;;2343:4;2336:15;;;2390:4;2374:21;;2060:57;;1751:382;-1:-1:-1;1685:3:0;;;;:::i;:::-;;;;1647:497;;;-1:-1:-1;2161:12:0;1506:675;-1:-1:-1;;;1506:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:260::-;474:6;482;535:2;523:9;514:7;510:23;506:32;503:52;;;551:1;548;541:12;503:52;574:29;593:9;574:29;:::i;:::-;564:39;;622:38;656:2;645:9;641:18;622:38;:::i;:::-;612:48;;406:260;;;;;:::o;671:409::-;757:6;765;773;781;834:3;822:9;813:7;809:23;805:33;802:53;;;851:1;848;841:12;802:53;874:29;893:9;874:29;:::i;:::-;864:39;;922:38;956:2;945:9;941:18;922:38;:::i;:::-;912:48;;979:38;1013:2;1002:9;998:18;979:38;:::i;:::-;969:48;;1036:38;1070:2;1059:9;1055:18;1036:38;:::i;:::-;1026:48;;671:409;;;;;;;:::o;1085:328::-;1162:6;1170;1178;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1270:29;1289:9;1270:29;:::i;:::-;1260:39;;1318:38;1352:2;1341:9;1337:18;1318:38;:::i;:::-;1308:48;;1403:2;1392:9;1388:18;1375:32;1365:42;;1085:328;;;;;:::o;1418:1138::-;1513:6;1521;1529;1537;1590:3;1578:9;1569:7;1565:23;1561:33;1558:53;;;1607:1;1604;1597:12;1558:53;1630:29;1649:9;1630:29;:::i;:::-;1620:39;;1678:38;1712:2;1701:9;1697:18;1678:38;:::i;:::-;1668:48;;1763:2;1752:9;1748:18;1735:32;1725:42;;1818:2;1807:9;1803:18;1790:32;1841:18;1882:2;1874:6;1871:14;1868:34;;;1898:1;1895;1888:12;1868:34;1936:6;1925:9;1921:22;1911:32;;1981:7;1974:4;1970:2;1966:13;1962:27;1952:55;;2003:1;2000;1993:12;1952:55;2039:2;2026:16;2061:2;2057;2054:10;2051:36;;;2067:18;;:::i;:::-;2142:2;2136:9;2110:2;2196:13;;-1:-1:-1;;2192:22:1;;;2216:2;2188:31;2184:40;2172:53;;;2240:18;;;2260:22;;;2237:46;2234:72;;;2286:18;;:::i;:::-;2326:10;2322:2;2315:22;2361:2;2353:6;2346:18;2401:7;2396:2;2391;2387;2383:11;2379:20;2376:33;2373:53;;;2422:1;2419;2412:12;2373:53;2478:2;2473;2469;2465:11;2460:2;2452:6;2448:15;2435:46;2523:1;2518:2;2513;2505:6;2501:15;2497:24;2490:35;2544:6;2534:16;;;;;;;1418:1138;;;;;;;:::o;2561:347::-;2626:6;2634;2687:2;2675:9;2666:7;2662:23;2658:32;2655:52;;;2703:1;2700;2693:12;2655:52;2726:29;2745:9;2726:29;:::i;:::-;2716:39;;2805:2;2794:9;2790:18;2777:32;2852:5;2845:13;2838:21;2831:5;2828:32;2818:60;;2874:1;2871;2864:12;2818:60;2897:5;2887:15;;;2561:347;;;;;:::o;2913:254::-;2981:6;2989;3042:2;3030:9;3021:7;3017:23;3013:32;3010:52;;;3058:1;3055;3048:12;3010:52;3081:29;3100:9;3081:29;:::i;:::-;3071:39;3157:2;3142:18;;;;3129:32;;-1:-1:-1;;;2913:254:1:o;3172:180::-;3231:6;3284:2;3272:9;3263:7;3259:23;3255:32;3252:52;;;3300:1;3297;3290:12;3252:52;-1:-1:-1;3323:23:1;;3172:180;-1:-1:-1;3172:180:1:o;3357:245::-;3415:6;3468:2;3456:9;3447:7;3443:23;3439:32;3436:52;;;3484:1;3481;3474:12;3436:52;3523:9;3510:23;3542:30;3566:5;3542:30;:::i;3607:249::-;3676:6;3729:2;3717:9;3708:7;3704:23;3700:32;3697:52;;;3745:1;3742;3735:12;3697:52;3777:9;3771:16;3796:30;3820:5;3796:30;:::i;3861:270::-;3934:6;3987:2;3975:9;3966:7;3962:23;3958:32;3955:52;;;4003:1;4000;3993:12;3955:52;4042:9;4029:23;4081:1;4074:5;4071:12;4061:40;;4097:1;4094;4087:12;4136:592;4207:6;4215;4268:2;4256:9;4247:7;4243:23;4239:32;4236:52;;;4284:1;4281;4274:12;4236:52;4324:9;4311:23;4353:18;4394:2;4386:6;4383:14;4380:34;;;4410:1;4407;4400:12;4380:34;4448:6;4437:9;4433:22;4423:32;;4493:7;4486:4;4482:2;4478:13;4474:27;4464:55;;4515:1;4512;4505:12;4464:55;4555:2;4542:16;4581:2;4573:6;4570:14;4567:34;;;4597:1;4594;4587:12;4567:34;4642:7;4637:2;4628:6;4624:2;4620:15;4616:24;4613:37;4610:57;;;4663:1;4660;4653:12;4610:57;4694:2;4686:11;;;;;4716:6;;-1:-1:-1;4136:592:1;;-1:-1:-1;;;;4136:592:1:o;4918:683::-;5013:6;5021;5029;5082:2;5070:9;5061:7;5057:23;5053:32;5050:52;;;5098:1;5095;5088:12;5050:52;5134:9;5121:23;5111:33;;5195:2;5184:9;5180:18;5167:32;5218:18;5259:2;5251:6;5248:14;5245:34;;;5275:1;5272;5265:12;5245:34;5313:6;5302:9;5298:22;5288:32;;5358:7;5351:4;5347:2;5343:13;5339:27;5329:55;;5380:1;5377;5370:12;5329:55;5420:2;5407:16;5446:2;5438:6;5435:14;5432:34;;;5462:1;5459;5452:12;5432:34;5515:7;5510:2;5500:6;5497:1;5493:14;5489:2;5485:23;5481:32;5478:45;5475:65;;;5536:1;5533;5526:12;5475:65;5567:2;5563;5559:11;5549:21;;5589:6;5579:16;;;;;4918:683;;;;;:::o;5606:257::-;5647:3;5685:5;5679:12;5712:6;5707:3;5700:19;5728:63;5784:6;5777:4;5772:3;5768:14;5761:4;5754:5;5750:16;5728:63;:::i;:::-;5845:2;5824:15;-1:-1:-1;;5820:29:1;5811:39;;;;5852:4;5807:50;;5606:257;-1:-1:-1;;5606:257:1:o;6102:637::-;6382:3;6420:6;6414:13;6436:53;6482:6;6477:3;6470:4;6462:6;6458:17;6436:53;:::i;:::-;6552:13;;6511:16;;;;6574:57;6552:13;6511:16;6608:4;6596:17;;6574:57;:::i;:::-;6696:7;6653:20;;6682:22;;;6731:1;6720:13;;6102:637;-1:-1:-1;;;;6102:637:1:o;7185:511::-;7379:4;-1:-1:-1;;;;;7489:2:1;7481:6;7477:15;7466:9;7459:34;7541:2;7533:6;7529:15;7524:2;7513:9;7509:18;7502:43;;7581:6;7576:2;7565:9;7561:18;7554:34;7624:3;7619:2;7608:9;7604:18;7597:31;7645:45;7685:3;7674:9;7670:19;7662:6;7645:45;:::i;:::-;7637:53;7185:511;-1:-1:-1;;;;;;7185:511:1:o;7893:399::-;8039:2;8024:18;;8072:1;8061:13;;8051:201;;-1:-1:-1;;;8105:1:1;8098:88;8209:4;8206:1;8199:15;8237:4;8234:1;8227:15;8051:201;8261:25;;;7893:399;:::o;8297:219::-;8446:2;8435:9;8428:21;8409:4;8466:44;8506:2;8495:9;8491:18;8483:6;8466:44;:::i;22147:253::-;22187:3;-1:-1:-1;;;;;22276:2:1;22273:1;22269:10;22306:2;22303:1;22299:10;22337:3;22333:2;22329:12;22324:3;22321:21;22318:47;;;22345:18;;:::i;:::-;22381:13;;22147:253;-1:-1:-1;;;;22147:253:1:o;22405:128::-;22445:3;22476:1;22472:6;22469:1;22466:13;22463:39;;;22482:18;;:::i;:::-;-1:-1:-1;22518:9:1;;22405:128::o;22538:120::-;22578:1;22604;22594:35;;22609:18;;:::i;:::-;-1:-1:-1;22643:9:1;;22538:120::o;22663:168::-;22703:7;22769:1;22765;22761:6;22757:14;22754:1;22751:21;22746:1;22739:9;22732:17;22728:45;22725:71;;;22776:18;;:::i;:::-;-1:-1:-1;22816:9:1;;22663:168::o;22836:246::-;22876:4;-1:-1:-1;;;;;22989:10:1;;;;22959;;23011:12;;;23008:38;;;23026:18;;:::i;:::-;23063:13;;22836:246;-1:-1:-1;;;22836:246:1:o;23087:125::-;23127:4;23155:1;23152;23149:8;23146:34;;;23160:18;;:::i;:::-;-1:-1:-1;23197:9:1;;23087:125::o;23217:258::-;23289:1;23299:113;23313:6;23310:1;23307:13;23299:113;;;23389:11;;;23383:18;23370:11;;;23363:39;23335:2;23328:10;23299:113;;;23430:6;23427:1;23424:13;23421:48;;;-1:-1:-1;;23465:1:1;23447:16;;23440:27;23217:258::o;23480:136::-;23519:3;23547:5;23537:39;;23556:18;;:::i;:::-;-1:-1:-1;;;23592:18:1;;23480:136::o;23621:437::-;23700:1;23696:12;;;;23743;;;23764:61;;23818:4;23810:6;23806:17;23796:27;;23764:61;23871:2;23863:6;23860:14;23840:18;23837:38;23834:218;;;-1:-1:-1;;;23905:1:1;23898:88;24009:4;24006:1;23999:15;24037:4;24034:1;24027:15;23834:218;;23621:437;;;:::o;24063:135::-;24102:3;-1:-1:-1;;24123:17:1;;24120:43;;;24143:18;;:::i;:::-;-1:-1:-1;24190:1:1;24179:13;;24063:135::o;24203:112::-;24235:1;24261;24251:35;;24266:18;;:::i;:::-;-1:-1:-1;24300:9:1;;24203:112::o;24320:184::-;-1:-1:-1;;;24369:1:1;24362:88;24469:4;24466:1;24459:15;24493:4;24490:1;24483:15;24509:184;-1:-1:-1;;;24558:1:1;24551:88;24658:4;24655:1;24648:15;24682:4;24679:1;24672:15;24698:184;-1:-1:-1;;;24747:1:1;24740:88;24847:4;24844:1;24837:15;24871:4;24868:1;24861:15;24887:184;-1:-1:-1;;;24936:1:1;24929:88;25036:4;25033:1;25026:15;25060:4;25057:1;25050:15;25076:184;-1:-1:-1;;;25125:1:1;25118:88;25225:4;25222:1;25215:15;25249:4;25246:1;25239:15;25265:177;-1:-1:-1;;;;;;25343:5:1;25339:78;25332:5;25329:89;25319:117;;25432:1;25429;25422:12

Swarm Source

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