ETH Price: $3,524.08 (+5.05%)

Token

C-01 Official Collection (C-01)
 

Overview

Max Total Supply

8,888 C-01

Holders

3,318

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 C-01
0x716f9432235ce69dd4253cbf3a89f3fe3f399014
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

C-01 represents the synergy between the world of fashion and digital ownership. From the Hands of Warner Bros designer Gilberto Zaragoza. 8888 NFTs

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
C01Project

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.7;

// File @openzeppelin/contracts/utils/introspection/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

/**
 * @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 whiteed 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 whiteed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

/**
 * @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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this whites for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]


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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

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


contract C01Project is ERC721("C-01 Official Collection", "C-01"), ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    string private baseURI;
    string private blindURI;
    uint256 public constant BUY_LIMIT_PER_TX = 2;
    uint256 public constant MAX_NFT_PUBLIC = 8728;
    uint256 private constant MAX_NFT = 8888;
    uint256 public NFTPrice = 250000000000000000;  // 0.25 ETH
    bool public reveal;
    bool public isActive;
    bool public isPresaleActive;
    bool private freeMintActive;
    bytes32 public root;
    uint256 public constant WHITELIST_MAX_MINT = 2;
    mapping(address => uint256) public whiteListClaimed;
    mapping(address => bool) private giveawayMintClaimed;
    uint256 public giveawayCount;


    /*
     * Function to reveal all C-01
    */
    function revealNow() 
        external 
        onlyOwner 
    {
        reveal = true;
    }
    
    
    /*
     * Function setIsActive to activate/desactivate the smart contract
    */
    function setIsActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isActive = _isActive;
    }
    
    /*
     * Function setPresaleActive to activate/desactivate the whitelist/raffle presale  
    */
    function setPresaleActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isPresaleActive = _isActive;
    }

    /*
     * Function setFreeMintActive to activate/desactivate the free mint capability  
    */
    function setFreeMintActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        freeMintActive = _isActive;
    }
    
    /*
     * Function to set Base and Blind URI 
    */
    function setURIs(
        string memory _blindURI, 
        string memory _URI
    ) 
        external 
        onlyOwner 
    {
        blindURI = _blindURI;
        baseURI = _URI;
    }
    
    /*
     * Function to withdraw collected amount during minting by the owner
    */
    function withdraw(
    ) 
        public 
        onlyOwner 
    {
        uint balance = address(this).balance;
        require(balance > 0, "Balance should be more then zero");
        payable(address(0x072fA5Eb0fa34587d6355d6A0a9913eCc6B62025)).transfer(balance);
    }
    
    /*
     * Function to mint new NFTs during the public sale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */
    function mintNFT(
        uint256 _numOfTokens
    )
        public
        payable
    {
        require(isActive, 'Contract is not active');
        require(!isPresaleActive, 'Presale is still active');
        require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit");
        require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs");
        require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < _numOfTokens; i++) {
            _safeMint(msg.sender, totalSupply().sub(giveawayCount));
        }
    }

    /*
     * Function to mint new NFTs during the presale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTDuringPresale(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Sale is not active');
        require(isPresaleActive, 'Whitelist is not active');
        require(verify(_proof, bytes32(uint256(uint160(msg.sender)))), "Not whitelisted");
        if (!freeMintActive){
            require(totalSupply() < MAX_NFT_PUBLIC, 'All public tokens have been minted');
            require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens');
            require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs');
            require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed');
            require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
            for (uint256 i = 0; i < _numOfTokens; i++) {
                    whiteListClaimed[msg.sender] += 1;
                    _safeMint(msg.sender, totalSupply().sub(giveawayCount));
            }
        }
        else{
            require(totalSupply() < MAX_NFT, 'All tokens have been minted');
            require(_numOfTokens == 1, 'Cannot purchase this many tokens');
            require(!giveawayMintClaimed[msg.sender], 'Already claimed giveaway');
            giveawayMintClaimed[msg.sender] = true;
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    /*
     * Function to mint NFTs for giveaway and partnerships
    */
    function mintByOwner(
        address _to, 
        uint256 _tokenId
    )
        public 
        onlyOwner
    {
        require(_tokenId < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
        _safeMint(_to, _tokenId);
    }
    
    /*
     * Function to mint all NFTs for giveaway and partnerships
    */
    function mintMultipleByOwner(
        address[] memory _to, 
        uint256[] memory _tokenId
    )
        public
        onlyOwner
    {
        require(_to.length == _tokenId.length, "Should have same length");
        for(uint256 i = 0; i < _to.length; i++){
            require(_tokenId[i] >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens");
            require(_tokenId[i] < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
            _safeMint(_to[i], _tokenId[i]);
            giveawayCount = giveawayCount.add(1);
        }
    }

    /*
     * Function to get token URI of given token ID
     * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC
    */
    function tokenURI(
        uint256 _tokenId
    )
        public 
        view 
        virtual 
        override 
        returns (string memory) 
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!reveal) {
            return string(abi.encodePacked(blindURI));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        }
    }
    
    // Set Root for whitelist and raffle to participate in presale
    function setRoot(uint256 _root) onlyOwner() public {
        root = bytes32(_root);
    }

    // Verify MerkleProof
    function verify(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        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 = sha256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = sha256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }

    // Standard functions to be overridden in ERC721Enumerable
    function supportsInterface(
        bytes4 _interfaceId
    ) 
        public
        view 
        override (ERC721, ERC721Enumerable) 
        returns (bool) 
    {
        return super.supportsInterface(_interfaceId);
    }

   
    function _beforeTokenTransfer(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) 
        internal 
        override(ERC721, ERC721Enumerable) 
    {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setFreeMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526703782dace9d90000600d553480156200001d57600080fd5b50604080518082018252601881527f432d3031204f6666696369616c20436f6c6c656374696f6e0000000000000000602080830191825283518085019094526004845263432d303160e01b9084015281519192916200007f916000916200010e565b508051620000959060019060208401906200010e565b505050620000b2620000ac620000b860201b60201c565b620000bc565b620001f1565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011c90620001b4565b90600052602060002090601f0160209004810192826200014057600085556200018b565b82601f106200015b57805160ff19168380011785556200018b565b828001600101855582156200018b579182015b828111156200018b5782518255916020019190600101906200016e565b50620001999291506200019d565b5090565b5b808211156200019957600081556001016200019e565b600181811c90821680620001c957607f821691505b60208210811415620001eb57634e487b7160e01b600052602260045260246000fd5b50919050565b612e7980620002016000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063e82541741161007a578063e82541741461065a578063e985e9c51461067a578063e9be0f3f146106c3578063ebf0c717146106d9578063f2f5a7e5146106ef578063f2fde38b1461070f57600080fd5b8063b88d4fde146105e4578063c151a5f814610604578063c87b56dd14610624578063d1d80f3014610644578063e748e07c146105cf57600080fd5b8063972a2a62116100fd578063972a2a621461055f578063a22cb4651461057f578063a38bffda1461059f578063a475b5dd146105b5578063aeb16768146105cf57600080fd5b8063715018a6146104f15780638da5cb5b146105065780638f76696c14610524578063926427441461053757806395d89b411461054a57600080fd5b80633542aee2116101c75780634f9b563c1161018b5780634f9b563c1461045c5780635f0f45b21461047c57806360d938dc146104915780636352211e146104b157806370a08231146104d157600080fd5b80633542aee2146103c75780633ccfd60b146103e75780633f8121a2146103fc57806342842e0e1461041c5780634f6ccce71461043c57600080fd5b806322f3e2d41161020e57806322f3e2d41461031b5780632333f3c41461033a57806323b872dd146103675780632750fc78146103875780632f745c59146103a757600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046128a1565b61072f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610740565b6040516102779190612adb565b3480156102ae57600080fd5b506102c26102bd366004612935565b6107d2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612737565b61086c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b50600e5461026b90610100900460ff1681565b34801561034657600080fd5b5061030d610355366004612607565b60106020526000908152604090205481565b34801561037357600080fd5b506102fa610382366004612655565b610982565b34801561039357600080fd5b506102fa6103a236600461286d565b6109b3565b3480156103b357600080fd5b5061030d6103c2366004612737565b6109f7565b3480156103d357600080fd5b506102fa6103e2366004612737565b610a8d565b3480156103f357600080fd5b506102fa610ae6565b34801561040857600080fd5b506102fa61041736600461286d565b610b9f565b34801561042857600080fd5b506102fa610437366004612655565b610be5565b34801561044857600080fd5b5061030d610457366004612935565b610c00565b34801561046857600080fd5b506102fa61047736600461286d565b610c93565b34801561048857600080fd5b506102fa610cdb565b34801561049d57600080fd5b50600e5461026b9062010000900460ff1681565b3480156104bd57600080fd5b506102c26104cc366004612935565b610d14565b3480156104dd57600080fd5b5061030d6104ec366004612607565b610d8b565b3480156104fd57600080fd5b506102fa610e12565b34801561051257600080fd5b50600a546001600160a01b03166102c2565b6102fa61053236600461294e565b610e48565b6102fa610545366004612935565b61128d565b34801561055657600080fd5b50610295611447565b34801561056b57600080fd5b5061026b61057a366004612828565b611456565b34801561058b57600080fd5b506102fa61059a36600461270d565b611594565b3480156105ab57600080fd5b5061030d600d5481565b3480156105c157600080fd5b50600e5461026b9060ff1681565b3480156105db57600080fd5b5061030d600281565b3480156105f057600080fd5b506102fa6105ff366004612691565b611659565b34801561061057600080fd5b506102fa61061f366004612761565b611691565b34801561063057600080fd5b5061029561063f366004612935565b611842565b34801561065057600080fd5b5061030d61221881565b34801561066657600080fd5b506102fa6106753660046128db565b611914565b34801561068657600080fd5b5061026b610695366004612622565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cf57600080fd5b5061030d60125481565b3480156106e557600080fd5b5061030d600f5481565b3480156106fb57600080fd5b506102fa61070a366004612935565b611965565b34801561071b57600080fd5b506102fa61072a366004612607565b611994565b600061073a82611a2f565b92915050565b60606000805461074f90612d55565b80601f016020809104026020016040519081016040528092919081815260200182805461077b90612d55565b80156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087782610d14565b9050806001600160a01b0316836001600160a01b031614156108e55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610847565b336001600160a01b038216148061090157506109018133610695565b6109735760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610847565b61097d8383611a54565b505050565b61098c3382611ac2565b6109a85760405162461bcd60e51b815260040161084790612c21565b61097d838383611bb9565b600a546001600160a01b031633146109dd5760405162461bcd60e51b815260040161084790612b9d565b600e80549115156101000261ff0019909216919091179055565b6000610a0283610d8b565b8210610a645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610847565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ab75760405162461bcd60e51b815260040161084790612b9d565b6122b88110610ad85760405162461bcd60e51b815260040161084790612b40565b610ae28282611d64565b5050565b600a546001600160a01b03163314610b105760405162461bcd60e51b815260040161084790612b9d565b4780610b5e5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f6044820152606401610847565b60405173072fa5eb0fa34587d6355d6a0a9913ecc6b620259082156108fc029083906000818181858888f19350505050158015610ae2573d6000803e3d6000fd5b600a546001600160a01b03163314610bc95760405162461bcd60e51b815260040161084790612b9d565b600e8054911515620100000262ff000019909216919091179055565b61097d83838360405180602001604052806000815250611659565b6000610c0b60085490565b8210610c6e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610847565b60088281548110610c8157610c81612e01565b90600052602060002001549050919050565b600a546001600160a01b03163314610cbd5760405162461bcd60e51b815260040161084790612b9d565b600e805491151563010000000263ff00000019909216919091179055565b600a546001600160a01b03163314610d055760405162461bcd60e51b815260040161084790612b9d565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061073a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610847565b60006001600160a01b038216610df65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610847565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e3c5760405162461bcd60e51b815260040161084790612b9d565b610e466000611d7e565b565b600e54610100900460ff16610e945760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610847565b600e5462010000900460ff16610eec5760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f74206163746976650000000000000000006044820152606401610847565b610ef68133611456565b610f345760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610847565b600e546301000000900460ff1661115d57612218610f5160085490565b10610fa95760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b6064820152608401610847565b6002821115610ffa5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610847565b61221861101c6012546110168561101060085490565b90611dd0565b90611de3565b111561103a5760405162461bcd60e51b815260040161084790612bd2565b336000908152601060205260409020546002906110579084611dd0565b11156110a55760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d61782077686974656564000000006044820152606401610847565b600d5434906110b49084611def565b146111015760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610847565b60005b8281101561097d5733600090815260106020526040812080546001929061112c908490612cc7565b9250508190555061114b3361114660125461101660085490565b611d64565b8061115581612d90565b915050611104565b6122b861116960085490565b106111b65760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006044820152606401610847565b816001146112065760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610847565b3360009081526011602052604090205460ff16156112665760405162461bcd60e51b815260206004820152601860248201527f416c726561647920636c61696d656420676976656177617900000000000000006044820152606401610847565b336000818152601160205260409020805460ff19166001179055610ae29061114660085490565b600e54610100900460ff166112dd5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b6044820152606401610847565b600e5462010000900460ff16156113365760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c206163746976650000000000000000006044820152606401610847565b60028111156113875760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d69740000000000000000006044820152606401610847565b61221861139d6012546110168461101060085490565b11156113bb5760405162461bcd60e51b815260040161084790612bd2565b600d5434906113ca9083611def565b146114175760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610847565b60005b81811015610ae2576114353361114660125461101660085490565b8061143f81612d90565b91505061141a565b60606001805461074f90612d55565b600081815b845181101561158857600085828151811061147857611478612e01565b6020026020010151905080831161150157604080516020810185905290810182905260029060600160408051601f19818403018152908290526114ba91612a51565b602060405180830381855afa1580156114d7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114fa9190612888565b9250611575565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261153291612a51565b602060405180830381855afa15801561154f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115729190612888565b92505b508061158081612d90565b91505061145b565b50600f54149392505050565b6001600160a01b0382163314156115ed5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610847565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116633383611ac2565b61167f5760405162461bcd60e51b815260040161084790612c21565b61168b84848484611dfb565b50505050565b600a546001600160a01b031633146116bb5760405162461bcd60e51b815260040161084790612b9d565b805182511461170c5760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e6774680000000000000000006044820152606401610847565b60005b825181101561097d5761221882828151811061172d5761172d612e01565b602002602001015110156117a95760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610847565b6122b88282815181106117be576117be612e01565b6020026020010151106117e35760405162461bcd60e51b815260040161084790612b40565b61181f8382815181106117f8576117f8612e01565b602002602001015183838151811061181257611812612e01565b6020026020010151611d64565b60125461182d906001611dd0565b6012558061183a81612d90565b91505061170f565b6000818152600260205260409020546060906001600160a01b03166118c15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610847565b600e5460ff166118f357600c6040516020016118dd9190612a6d565b6040516020818303038152906040529050919050565b600b6118fe83611e2e565b6040516020016118dd929190612a79565b919050565b600a546001600160a01b0316331461193e5760405162461bcd60e51b815260040161084790612b9d565b815161195190600c90602085019061245d565b50805161097d90600b90602084019061245d565b600a546001600160a01b0316331461198f5760405162461bcd60e51b815260040161084790612b9d565b600f55565b600a546001600160a01b031633146119be5760405162461bcd60e51b815260040161084790612b9d565b6001600160a01b038116611a235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610847565b611a2c81611d7e565b50565b60006001600160e01b0319821663780e9d6360e01b148061073a575061073a82611f2c565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8982610d14565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b3b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610847565b6000611b4683610d14565b9050806001600160a01b0316846001600160a01b03161480611b815750836001600160a01b0316611b76846107d2565b6001600160a01b0316145b80611bb157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bcc82610d14565b6001600160a01b031614611c345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610847565b6001600160a01b038216611c965760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610847565b611ca1838383611f7c565b611cac600082611a54565b6001600160a01b0383166000908152600360205260408120805460019290611cd5908490612d12565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d03908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ae2828260405180602001604052806000815250611f87565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611ddc8284612cc7565b9392505050565b6000611ddc8284612d12565b6000611ddc8284612cf3565b611e06848484611bb9565b611e1284848484611fba565b61168b5760405162461bcd60e51b815260040161084790612aee565b606081611e525750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e7c5780611e6681612d90565b9150611e759050600a83612cdf565b9150611e56565b60008167ffffffffffffffff811115611e9757611e97612e17565b6040519080825280601f01601f191660200182016040528015611ec1576020820181803683370190505b5090505b8415611bb157611ed6600183612d12565b9150611ee3600a86612dab565b611eee906030612cc7565b60f81b818381518110611f0357611f03612e01565b60200101906001600160f81b031916908160001a905350611f25600a86612cdf565b9450611ec5565b60006001600160e01b031982166380ac58cd60e01b1480611f5d57506001600160e01b03198216635b5e139f60e01b145b8061073a57506301ffc9a760e01b6001600160e01b031983161461073a565b61097d8383836120c7565b611f91838361217f565b611f9e6000848484611fba565b61097d5760405162461bcd60e51b815260040161084790612aee565b60006001600160a01b0384163b156120bc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ffe903390899088908890600401612a9e565b602060405180830381600087803b15801561201857600080fd5b505af1925050508015612048575060408051601f3d908101601f19168201909252612045918101906128be565b60015b6120a2573d808015612076576040519150601f19603f3d011682016040523d82523d6000602084013e61207b565b606091505b50805161209a5760405162461bcd60e51b815260040161084790612aee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb1565b506001949350505050565b6001600160a01b0383166121225761211d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612145565b816001600160a01b0316836001600160a01b0316146121455761214583826122cd565b6001600160a01b03821661215c5761097d8161236a565b826001600160a01b0316826001600160a01b03161461097d5761097d8282612419565b6001600160a01b0382166121d55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610847565b6000818152600260205260409020546001600160a01b03161561223a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610847565b61224660008383611f7c565b6001600160a01b038216600090815260036020526040812080546001929061226f908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122da84610d8b565b6122e49190612d12565b600083815260076020526040902054909150808214612337576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061237c90600190612d12565b600083815260096020526040812054600880549394509092849081106123a4576123a4612e01565b9060005260206000200154905080600883815481106123c5576123c5612e01565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123fd576123fd612deb565b6001900381819060005260206000200160009055905550505050565b600061242483610d8b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461246990612d55565b90600052602060002090601f01602090048101928261248b57600085556124d1565b82601f106124a457805160ff19168380011785556124d1565b828001600101855582156124d1579182015b828111156124d15782518255916020019190600101906124b6565b506124dd9291506124e1565b5090565b5b808211156124dd57600081556001016124e2565b600067ffffffffffffffff83111561251057612510612e17565b612523601f8401601f1916602001612c72565b905082815283838301111561253757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461190f57600080fd5b600082601f83011261257657600080fd5b8135602061258b61258683612ca3565b612c72565b80838252828201915082860187848660051b89010111156125ab57600080fd5b60005b858110156125ca578135845292840192908401906001016125ae565b5090979650505050505050565b8035801515811461190f57600080fd5b600082601f8301126125f857600080fd5b611ddc838335602085016124f6565b60006020828403121561261957600080fd5b611ddc8261254e565b6000806040838503121561263557600080fd5b61263e8361254e565b915061264c6020840161254e565b90509250929050565b60008060006060848603121561266a57600080fd5b6126738461254e565b92506126816020850161254e565b9150604084013590509250925092565b600080600080608085870312156126a757600080fd5b6126b08561254e565b93506126be6020860161254e565b925060408501359150606085013567ffffffffffffffff8111156126e157600080fd5b8501601f810187136126f257600080fd5b612701878235602084016124f6565b91505092959194509250565b6000806040838503121561272057600080fd5b6127298361254e565b915061264c602084016125d7565b6000806040838503121561274a57600080fd5b6127538361254e565b946020939093013593505050565b6000806040838503121561277457600080fd5b823567ffffffffffffffff8082111561278c57600080fd5b818501915085601f8301126127a057600080fd5b813560206127b061258683612ca3565b8083825282820191508286018a848660051b89010111156127d057600080fd5b600096505b848710156127fa576127e68161254e565b8352600196909601959183019183016127d5565b509650508601359250508082111561281157600080fd5b5061281e85828601612565565b9150509250929050565b6000806040838503121561283b57600080fd5b823567ffffffffffffffff81111561285257600080fd5b61285e85828601612565565b95602094909401359450505050565b60006020828403121561287f57600080fd5b611ddc826125d7565b60006020828403121561289a57600080fd5b5051919050565b6000602082840312156128b357600080fd5b8135611ddc81612e2d565b6000602082840312156128d057600080fd5b8151611ddc81612e2d565b600080604083850312156128ee57600080fd5b823567ffffffffffffffff8082111561290657600080fd5b612912868387016125e7565b9350602085013591508082111561292857600080fd5b5061281e858286016125e7565b60006020828403121561294757600080fd5b5035919050565b6000806040838503121561296157600080fd5b82359150602083013567ffffffffffffffff81111561297f57600080fd5b61281e85828601612565565b600081518084526129a3816020860160208601612d29565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806129d157607f831692505b60208084108214156129f357634e487b7160e01b600052602260045260246000fd5b818015612a075760018114612a1857612a45565b60ff19861689528489019650612a45565b60008881526020902060005b86811015612a3d5781548b820152908501908301612a24565b505084890196505b50505050505092915050565b60008251612a63818460208701612d29565b9190910192915050565b6000611ddc82846129b7565b6000612a8582856129b7565b8351612a95818360208801612d29565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ad19083018461298b565b9695505050505050565b602081526000611ddc602083018461298b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612c9b57612c9b612e17565b604052919050565b600067ffffffffffffffff821115612cbd57612cbd612e17565b5060051b60200190565b60008219821115612cda57612cda612dbf565b500190565b600082612cee57612cee612dd5565b500490565b6000816000190483118215151615612d0d57612d0d612dbf565b500290565b600082821015612d2457612d24612dbf565b500390565b60005b83811015612d44578181015183820152602001612d2c565b8381111561168b5750506000910152565b600181811c90821680612d6957607f821691505b60208210811415612d8a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612da457612da4612dbf565b5060010190565b600082612dba57612dba612dd5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2c57600080fdfea2646970667358221220d0ebfff1adccddb5cdbed69fad6dde176876b924dba47bc0e1051dde009353a364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063b88d4fde116100b6578063e82541741161007a578063e82541741461065a578063e985e9c51461067a578063e9be0f3f146106c3578063ebf0c717146106d9578063f2f5a7e5146106ef578063f2fde38b1461070f57600080fd5b8063b88d4fde146105e4578063c151a5f814610604578063c87b56dd14610624578063d1d80f3014610644578063e748e07c146105cf57600080fd5b8063972a2a62116100fd578063972a2a621461055f578063a22cb4651461057f578063a38bffda1461059f578063a475b5dd146105b5578063aeb16768146105cf57600080fd5b8063715018a6146104f15780638da5cb5b146105065780638f76696c14610524578063926427441461053757806395d89b411461054a57600080fd5b80633542aee2116101c75780634f9b563c1161018b5780634f9b563c1461045c5780635f0f45b21461047c57806360d938dc146104915780636352211e146104b157806370a08231146104d157600080fd5b80633542aee2146103c75780633ccfd60b146103e75780633f8121a2146103fc57806342842e0e1461041c5780634f6ccce71461043c57600080fd5b806322f3e2d41161020e57806322f3e2d41461031b5780632333f3c41461033a57806323b872dd146103675780632750fc78146103875780632f745c59146103a757600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046128a1565b61072f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610740565b6040516102779190612adb565b3480156102ae57600080fd5b506102c26102bd366004612935565b6107d2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612737565b61086c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b50600e5461026b90610100900460ff1681565b34801561034657600080fd5b5061030d610355366004612607565b60106020526000908152604090205481565b34801561037357600080fd5b506102fa610382366004612655565b610982565b34801561039357600080fd5b506102fa6103a236600461286d565b6109b3565b3480156103b357600080fd5b5061030d6103c2366004612737565b6109f7565b3480156103d357600080fd5b506102fa6103e2366004612737565b610a8d565b3480156103f357600080fd5b506102fa610ae6565b34801561040857600080fd5b506102fa61041736600461286d565b610b9f565b34801561042857600080fd5b506102fa610437366004612655565b610be5565b34801561044857600080fd5b5061030d610457366004612935565b610c00565b34801561046857600080fd5b506102fa61047736600461286d565b610c93565b34801561048857600080fd5b506102fa610cdb565b34801561049d57600080fd5b50600e5461026b9062010000900460ff1681565b3480156104bd57600080fd5b506102c26104cc366004612935565b610d14565b3480156104dd57600080fd5b5061030d6104ec366004612607565b610d8b565b3480156104fd57600080fd5b506102fa610e12565b34801561051257600080fd5b50600a546001600160a01b03166102c2565b6102fa61053236600461294e565b610e48565b6102fa610545366004612935565b61128d565b34801561055657600080fd5b50610295611447565b34801561056b57600080fd5b5061026b61057a366004612828565b611456565b34801561058b57600080fd5b506102fa61059a36600461270d565b611594565b3480156105ab57600080fd5b5061030d600d5481565b3480156105c157600080fd5b50600e5461026b9060ff1681565b3480156105db57600080fd5b5061030d600281565b3480156105f057600080fd5b506102fa6105ff366004612691565b611659565b34801561061057600080fd5b506102fa61061f366004612761565b611691565b34801561063057600080fd5b5061029561063f366004612935565b611842565b34801561065057600080fd5b5061030d61221881565b34801561066657600080fd5b506102fa6106753660046128db565b611914565b34801561068657600080fd5b5061026b610695366004612622565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cf57600080fd5b5061030d60125481565b3480156106e557600080fd5b5061030d600f5481565b3480156106fb57600080fd5b506102fa61070a366004612935565b611965565b34801561071b57600080fd5b506102fa61072a366004612607565b611994565b600061073a82611a2f565b92915050565b60606000805461074f90612d55565b80601f016020809104026020016040519081016040528092919081815260200182805461077b90612d55565b80156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087782610d14565b9050806001600160a01b0316836001600160a01b031614156108e55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610847565b336001600160a01b038216148061090157506109018133610695565b6109735760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610847565b61097d8383611a54565b505050565b61098c3382611ac2565b6109a85760405162461bcd60e51b815260040161084790612c21565b61097d838383611bb9565b600a546001600160a01b031633146109dd5760405162461bcd60e51b815260040161084790612b9d565b600e80549115156101000261ff0019909216919091179055565b6000610a0283610d8b565b8210610a645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610847565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ab75760405162461bcd60e51b815260040161084790612b9d565b6122b88110610ad85760405162461bcd60e51b815260040161084790612b40565b610ae28282611d64565b5050565b600a546001600160a01b03163314610b105760405162461bcd60e51b815260040161084790612b9d565b4780610b5e5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f6044820152606401610847565b60405173072fa5eb0fa34587d6355d6a0a9913ecc6b620259082156108fc029083906000818181858888f19350505050158015610ae2573d6000803e3d6000fd5b600a546001600160a01b03163314610bc95760405162461bcd60e51b815260040161084790612b9d565b600e8054911515620100000262ff000019909216919091179055565b61097d83838360405180602001604052806000815250611659565b6000610c0b60085490565b8210610c6e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610847565b60088281548110610c8157610c81612e01565b90600052602060002001549050919050565b600a546001600160a01b03163314610cbd5760405162461bcd60e51b815260040161084790612b9d565b600e805491151563010000000263ff00000019909216919091179055565b600a546001600160a01b03163314610d055760405162461bcd60e51b815260040161084790612b9d565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061073a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610847565b60006001600160a01b038216610df65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610847565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e3c5760405162461bcd60e51b815260040161084790612b9d565b610e466000611d7e565b565b600e54610100900460ff16610e945760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b6044820152606401610847565b600e5462010000900460ff16610eec5760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f74206163746976650000000000000000006044820152606401610847565b610ef68133611456565b610f345760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610847565b600e546301000000900460ff1661115d57612218610f5160085490565b10610fa95760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b6064820152608401610847565b6002821115610ffa5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610847565b61221861101c6012546110168561101060085490565b90611dd0565b90611de3565b111561103a5760405162461bcd60e51b815260040161084790612bd2565b336000908152601060205260409020546002906110579084611dd0565b11156110a55760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d61782077686974656564000000006044820152606401610847565b600d5434906110b49084611def565b146111015760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610847565b60005b8281101561097d5733600090815260106020526040812080546001929061112c908490612cc7565b9250508190555061114b3361114660125461101660085490565b611d64565b8061115581612d90565b915050611104565b6122b861116960085490565b106111b65760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006044820152606401610847565b816001146112065760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610847565b3360009081526011602052604090205460ff16156112665760405162461bcd60e51b815260206004820152601860248201527f416c726561647920636c61696d656420676976656177617900000000000000006044820152606401610847565b336000818152601160205260409020805460ff19166001179055610ae29061114660085490565b600e54610100900460ff166112dd5760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b6044820152606401610847565b600e5462010000900460ff16156113365760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c206163746976650000000000000000006044820152606401610847565b60028111156113875760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d69740000000000000000006044820152606401610847565b61221861139d6012546110168461101060085490565b11156113bb5760405162461bcd60e51b815260040161084790612bd2565b600d5434906113ca9083611def565b146114175760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610847565b60005b81811015610ae2576114353361114660125461101660085490565b8061143f81612d90565b91505061141a565b60606001805461074f90612d55565b600081815b845181101561158857600085828151811061147857611478612e01565b6020026020010151905080831161150157604080516020810185905290810182905260029060600160408051601f19818403018152908290526114ba91612a51565b602060405180830381855afa1580156114d7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114fa9190612888565b9250611575565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261153291612a51565b602060405180830381855afa15801561154f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115729190612888565b92505b508061158081612d90565b91505061145b565b50600f54149392505050565b6001600160a01b0382163314156115ed5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610847565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6116633383611ac2565b61167f5760405162461bcd60e51b815260040161084790612c21565b61168b84848484611dfb565b50505050565b600a546001600160a01b031633146116bb5760405162461bcd60e51b815260040161084790612b9d565b805182511461170c5760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e6774680000000000000000006044820152606401610847565b60005b825181101561097d5761221882828151811061172d5761172d612e01565b602002602001015110156117a95760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610847565b6122b88282815181106117be576117be612e01565b6020026020010151106117e35760405162461bcd60e51b815260040161084790612b40565b61181f8382815181106117f8576117f8612e01565b602002602001015183838151811061181257611812612e01565b6020026020010151611d64565b60125461182d906001611dd0565b6012558061183a81612d90565b91505061170f565b6000818152600260205260409020546060906001600160a01b03166118c15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610847565b600e5460ff166118f357600c6040516020016118dd9190612a6d565b6040516020818303038152906040529050919050565b600b6118fe83611e2e565b6040516020016118dd929190612a79565b919050565b600a546001600160a01b0316331461193e5760405162461bcd60e51b815260040161084790612b9d565b815161195190600c90602085019061245d565b50805161097d90600b90602084019061245d565b600a546001600160a01b0316331461198f5760405162461bcd60e51b815260040161084790612b9d565b600f55565b600a546001600160a01b031633146119be5760405162461bcd60e51b815260040161084790612b9d565b6001600160a01b038116611a235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610847565b611a2c81611d7e565b50565b60006001600160e01b0319821663780e9d6360e01b148061073a575061073a82611f2c565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8982610d14565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b3b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610847565b6000611b4683610d14565b9050806001600160a01b0316846001600160a01b03161480611b815750836001600160a01b0316611b76846107d2565b6001600160a01b0316145b80611bb157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bcc82610d14565b6001600160a01b031614611c345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610847565b6001600160a01b038216611c965760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610847565b611ca1838383611f7c565b611cac600082611a54565b6001600160a01b0383166000908152600360205260408120805460019290611cd5908490612d12565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d03908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ae2828260405180602001604052806000815250611f87565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611ddc8284612cc7565b9392505050565b6000611ddc8284612d12565b6000611ddc8284612cf3565b611e06848484611bb9565b611e1284848484611fba565b61168b5760405162461bcd60e51b815260040161084790612aee565b606081611e525750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e7c5780611e6681612d90565b9150611e759050600a83612cdf565b9150611e56565b60008167ffffffffffffffff811115611e9757611e97612e17565b6040519080825280601f01601f191660200182016040528015611ec1576020820181803683370190505b5090505b8415611bb157611ed6600183612d12565b9150611ee3600a86612dab565b611eee906030612cc7565b60f81b818381518110611f0357611f03612e01565b60200101906001600160f81b031916908160001a905350611f25600a86612cdf565b9450611ec5565b60006001600160e01b031982166380ac58cd60e01b1480611f5d57506001600160e01b03198216635b5e139f60e01b145b8061073a57506301ffc9a760e01b6001600160e01b031983161461073a565b61097d8383836120c7565b611f91838361217f565b611f9e6000848484611fba565b61097d5760405162461bcd60e51b815260040161084790612aee565b60006001600160a01b0384163b156120bc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ffe903390899088908890600401612a9e565b602060405180830381600087803b15801561201857600080fd5b505af1925050508015612048575060408051601f3d908101601f19168201909252612045918101906128be565b60015b6120a2573d808015612076576040519150601f19603f3d011682016040523d82523d6000602084013e61207b565b606091505b50805161209a5760405162461bcd60e51b815260040161084790612aee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb1565b506001949350505050565b6001600160a01b0383166121225761211d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612145565b816001600160a01b0316836001600160a01b0316146121455761214583826122cd565b6001600160a01b03821661215c5761097d8161236a565b826001600160a01b0316826001600160a01b03161461097d5761097d8282612419565b6001600160a01b0382166121d55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610847565b6000818152600260205260409020546001600160a01b03161561223a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610847565b61224660008383611f7c565b6001600160a01b038216600090815260036020526040812080546001929061226f908490612cc7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122da84610d8b565b6122e49190612d12565b600083815260076020526040902054909150808214612337576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061237c90600190612d12565b600083815260096020526040812054600880549394509092849081106123a4576123a4612e01565b9060005260206000200154905080600883815481106123c5576123c5612e01565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123fd576123fd612deb565b6001900381819060005260206000200160009055905550505050565b600061242483610d8b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461246990612d55565b90600052602060002090601f01602090048101928261248b57600085556124d1565b82601f106124a457805160ff19168380011785556124d1565b828001600101855582156124d1579182015b828111156124d15782518255916020019190600101906124b6565b506124dd9291506124e1565b5090565b5b808211156124dd57600081556001016124e2565b600067ffffffffffffffff83111561251057612510612e17565b612523601f8401601f1916602001612c72565b905082815283838301111561253757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461190f57600080fd5b600082601f83011261257657600080fd5b8135602061258b61258683612ca3565b612c72565b80838252828201915082860187848660051b89010111156125ab57600080fd5b60005b858110156125ca578135845292840192908401906001016125ae565b5090979650505050505050565b8035801515811461190f57600080fd5b600082601f8301126125f857600080fd5b611ddc838335602085016124f6565b60006020828403121561261957600080fd5b611ddc8261254e565b6000806040838503121561263557600080fd5b61263e8361254e565b915061264c6020840161254e565b90509250929050565b60008060006060848603121561266a57600080fd5b6126738461254e565b92506126816020850161254e565b9150604084013590509250925092565b600080600080608085870312156126a757600080fd5b6126b08561254e565b93506126be6020860161254e565b925060408501359150606085013567ffffffffffffffff8111156126e157600080fd5b8501601f810187136126f257600080fd5b612701878235602084016124f6565b91505092959194509250565b6000806040838503121561272057600080fd5b6127298361254e565b915061264c602084016125d7565b6000806040838503121561274a57600080fd5b6127538361254e565b946020939093013593505050565b6000806040838503121561277457600080fd5b823567ffffffffffffffff8082111561278c57600080fd5b818501915085601f8301126127a057600080fd5b813560206127b061258683612ca3565b8083825282820191508286018a848660051b89010111156127d057600080fd5b600096505b848710156127fa576127e68161254e565b8352600196909601959183019183016127d5565b509650508601359250508082111561281157600080fd5b5061281e85828601612565565b9150509250929050565b6000806040838503121561283b57600080fd5b823567ffffffffffffffff81111561285257600080fd5b61285e85828601612565565b95602094909401359450505050565b60006020828403121561287f57600080fd5b611ddc826125d7565b60006020828403121561289a57600080fd5b5051919050565b6000602082840312156128b357600080fd5b8135611ddc81612e2d565b6000602082840312156128d057600080fd5b8151611ddc81612e2d565b600080604083850312156128ee57600080fd5b823567ffffffffffffffff8082111561290657600080fd5b612912868387016125e7565b9350602085013591508082111561292857600080fd5b5061281e858286016125e7565b60006020828403121561294757600080fd5b5035919050565b6000806040838503121561296157600080fd5b82359150602083013567ffffffffffffffff81111561297f57600080fd5b61281e85828601612565565b600081518084526129a3816020860160208601612d29565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806129d157607f831692505b60208084108214156129f357634e487b7160e01b600052602260045260246000fd5b818015612a075760018114612a1857612a45565b60ff19861689528489019650612a45565b60008881526020902060005b86811015612a3d5781548b820152908501908301612a24565b505084890196505b50505050505092915050565b60008251612a63818460208701612d29565b9190910192915050565b6000611ddc82846129b7565b6000612a8582856129b7565b8351612a95818360208801612d29565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ad19083018461298b565b9695505050505050565b602081526000611ddc602083018461298b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612c9b57612c9b612e17565b604052919050565b600067ffffffffffffffff821115612cbd57612cbd612e17565b5060051b60200190565b60008219821115612cda57612cda612dbf565b500190565b600082612cee57612cee612dd5565b500490565b6000816000190483118215151615612d0d57612d0d612dbf565b500290565b600082821015612d2457612d24612dbf565b500390565b60005b83811015612d44578181015183820152602001612d2c565b8381111561168b5750506000910152565b600181811c90821680612d6957607f821691505b60208210811415612d8a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612da457612da4612dbf565b5060010190565b600082612dba57612dba612dd5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2c57600080fdfea2646970667358221220d0ebfff1adccddb5cdbed69fad6dde176876b924dba47bc0e1051dde009353a364736f6c63430008070033

Deployed Bytecode Sourcemap

49810:8075:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57383:235;;;;;;;;;;-1:-1:-1;57383:235:0;;;;;:::i;:::-;;:::i;:::-;;;11163:14:1;;11156:22;11138:41;;11126:2;11111:18;57383:235:0;;;;;;;;21422:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22981:221::-;;;;;;;;;;-1:-1:-1;22981:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10461:32:1;;;10443:51;;10431:2;10416:18;22981:221:0;10297:203:1;22504:411:0;;;;;;;;;;-1:-1:-1;22504:411:0;;;;;:::i;:::-;;:::i;:::-;;35111:113;;;;;;;;;;-1:-1:-1;35199:10:0;:17;35111:113;;;11336:25:1;;;11324:2;11309:18;35111:113:0;11190:177:1;50274:20:0;;;;;;;;;;-1:-1:-1;50274:20:0;;;;;;;;;;;50448:51;;;;;;;;;;-1:-1:-1;50448:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;23871:339;;;;;;;;;;-1:-1:-1;23871:339:0;;;;;:::i;:::-;;:::i;50860:137::-;;;;;;;;;;-1:-1:-1;50860:137:0;;;;;:::i;:::-;;:::i;34779:256::-;;;;;;;;;;-1:-1:-1;34779:256:0;;;;;:::i;:::-;;:::i;54778:260::-;;;;;;;;;;-1:-1:-1;54778:260:0;;;;;:::i;:::-;;:::i;51893:280::-;;;;;;;;;;;;;:::i;51114:149::-;;;;;;;;;;-1:-1:-1;51114:149:0;;;;;:::i;:::-;;:::i;24281:185::-;;;;;;;;;;-1:-1:-1;24281:185:0;;;;;:::i;:::-;;:::i;35301:233::-;;;;;;;;;;-1:-1:-1;35301:233:0;;;;;:::i;:::-;;:::i;51373:149::-;;;;;;;;;;-1:-1:-1;51373:149:0;;;;;:::i;:::-;;:::i;50656:98::-;;;;;;;;;;;;;:::i;50301:27::-;;;;;;;;;;-1:-1:-1;50301:27:0;;;;;;;;;;;21116:239;;;;;;;;;;-1:-1:-1;21116:239:0;;;;;:::i;:::-;;:::i;20846:208::-;;;;;;;;;;-1:-1:-1;20846:208:0;;;;;:::i;:::-;;:::i;49179:94::-;;;;;;;;;;;;;:::i;48528:87::-;;;;;;;;;;-1:-1:-1;48601:6:0;;-1:-1:-1;;;;;48601:6:0;48528:87;;53167:1523;;;;;;:::i;:::-;;:::i;52338:671::-;;;;;;:::i;:::-;;:::i;21591:104::-;;;;;;;;;;;;;:::i;56525:786::-;;;;;;;;;;-1:-1:-1;56525:786:0;;;;;:::i;:::-;;:::i;23274:295::-;;;;;;;;;;-1:-1:-1;23274:295:0;;;;;:::i;:::-;;:::i;50185:44::-;;;;;;;;;;;;;;;;50249:18;;;;;;;;;;-1:-1:-1;50249:18:0;;;;;;;;50395:46;;;;;;;;;;;;50440:1;50395:46;;24537:328;;;;;;;;;;-1:-1:-1;24537:328:0;;;;;:::i;:::-;;:::i;55130:604::-;;;;;;;;;;-1:-1:-1;55130:604:0;;;;;:::i;:::-;;:::i;55878:441::-;;;;;;;;;;-1:-1:-1;55878:441:0;;;;;:::i;:::-;;:::i;50087:45::-;;;;;;;;;;;;50128:4;50087:45;;51594:197;;;;;;;;;;-1:-1:-1;51594:197:0;;;;;:::i;:::-;;:::i;23640:164::-;;;;;;;;;;-1:-1:-1;23640:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23761:25:0;;;23737:4;23761:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23640:164;50565:28;;;;;;;;;;;;;;;;50369:19;;;;;;;;;;;;;;;;56399:91;;;;;;;;;;-1:-1:-1;56399:91:0;;;;;:::i;:::-;;:::i;49428:192::-;;;;;;;;;;-1:-1:-1;49428:192:0;;;;;:::i;:::-;;:::i;57383:235::-;57543:4;57573:37;57597:12;57573:23;:37::i;:::-;57566:44;57383:235;-1:-1:-1;;57383:235:0:o;21422:100::-;21476:13;21509:5;21502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21422:100;:::o;22981:221::-;23057:7;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;23077:73;;;;-1:-1:-1;;;23077:73:0;;19421:2:1;23077:73:0;;;19403:21:1;19460:2;19440:18;;;19433:30;19499:34;19479:18;;;19472:62;-1:-1:-1;;;19550:18:1;;;19543:42;19602:19;;23077:73:0;;;;;;;;;-1:-1:-1;23170:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23170:24:0;;22981:221::o;22504:411::-;22585:13;22601:23;22616:7;22601:14;:23::i;:::-;22585:39;;22649:5;-1:-1:-1;;;;;22643:11:0;:2;-1:-1:-1;;;;;22643:11:0;;;22635:57;;;;-1:-1:-1;;;22635:57:0;;21021:2:1;22635:57:0;;;21003:21:1;21060:2;21040:18;;;21033:30;21099:34;21079:18;;;21072:62;-1:-1:-1;;;21150:18:1;;;21143:31;21191:19;;22635:57:0;20819:397:1;22635:57:0;16064:10;-1:-1:-1;;;;;22727:21:0;;;;:62;;-1:-1:-1;22752:37:0;22769:5;16064:10;23640:164;:::i;22752:37::-;22705:168;;;;-1:-1:-1;;;22705:168:0;;16694:2:1;22705:168:0;;;16676:21:1;16733:2;16713:18;;;16706:30;16772:34;16752:18;;;16745:62;16843:26;16823:18;;;16816:54;16887:19;;22705:168:0;16492:420:1;22705:168:0;22886:21;22895:2;22899:7;22886:8;:21::i;:::-;22574:341;22504:411;;:::o;23871:339::-;24066:41;16064:10;24099:7;24066:18;:41::i;:::-;24058:103;;;;-1:-1:-1;;;24058:103:0;;;;;;;:::i;:::-;24174:28;24184:4;24190:2;24194:7;24174:9;:28::i;50860:137::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;50969:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;50969:20:0;;::::1;::::0;;;::::1;::::0;;50860:137::o;34779:256::-;34876:7;34912:23;34929:5;34912:16;:23::i;:::-;34904:5;:31;34896:87;;;;-1:-1:-1;;;34896:87:0;;12150:2:1;34896:87:0;;;12132:21:1;12189:2;12169:18;;;12162:30;12228:34;12208:18;;;12201:62;-1:-1:-1;;;12279:18:1;;;12272:41;12330:19;;34896:87:0;11948:407:1;34896:87:0;-1:-1:-1;;;;;;35001:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34779:256::o;54778:260::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;50174:4:::1;54916:8;:18;54908:87;;;;-1:-1:-1::0;;;54908:87:0::1;;;;;;;:::i;:::-;55006:24;55016:3;55021:8;55006:9;:24::i;:::-;54778:260:::0;;:::o;51893:280::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51988:21:::1;52028:11:::0;52020:56:::1;;;::::0;-1:-1:-1;;;52020:56:0;;15920:2:1;52020:56:0::1;::::0;::::1;15902:21:1::0;;;15939:18;;;15932:30;15998:34;15978:18;;;15971:62;16050:18;;52020:56:0::1;15718:356:1::0;52020:56:0::1;52087:78;::::0;52103:42:::1;::::0;52087:78;::::1;;;::::0;52157:7;;52087:78:::1;::::0;;;52157:7;52103:42;52087:78;::::1;;;;;;;;;;;;;::::0;::::1;;;;51114:149:::0;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51228:15:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51228:27:0;;::::1;::::0;;;::::1;::::0;;51114:149::o;24281:185::-;24419:39;24436:4;24442:2;24446:7;24419:39;;;;;;;;;;;;:16;:39::i;35301:233::-;35376:7;35412:30;35199:10;:17;;35111:113;35412:30;35404:5;:38;35396:95;;;;-1:-1:-1;;;35396:95:0;;22257:2:1;35396:95:0;;;22239:21:1;22296:2;22276:18;;;22269:30;22335:34;22315:18;;;22308:62;-1:-1:-1;;;22386:18:1;;;22379:42;22438:19;;35396:95:0;22055:408:1;35396:95:0;35509:10;35520:5;35509:17;;;;;;;;:::i;:::-;;;;;;;;;35502:24;;35301:233;;;:::o;51373:149::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51488:14:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51488:26:0;;::::1;::::0;;;::::1;::::0;;51373:149::o;50656:98::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;50733:6:::1;:13:::0;;-1:-1:-1;;50733:13:0::1;50742:4;50733:13;::::0;;50656:98::o;21116:239::-;21188:7;21224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21224:16:0;21259:19;21251:73;;;;-1:-1:-1;;;21251:73:0;;18299:2:1;21251:73:0;;;18281:21:1;18338:2;18318:18;;;18311:30;18377:34;18357:18;;;18350:62;-1:-1:-1;;;18428:18:1;;;18421:39;18477:19;;21251:73:0;18097:405:1;20846:208:0;20918:7;-1:-1:-1;;;;;20946:19:0;;20938:74;;;;-1:-1:-1;;;20938:74:0;;17463:2:1;20938:74:0;;;17445:21:1;17502:2;17482:18;;;17475:30;17541:34;17521:18;;;17514:62;-1:-1:-1;;;17592:18:1;;;17585:40;17642:19;;20938:74:0;17261:406:1;20938:74:0;-1:-1:-1;;;;;;21030:16:0;;;;;:9;:16;;;;;;;20846:208::o;49179:94::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;49244:21:::1;49262:1;49244:9;:21::i;:::-;49179:94::o:0;53167:1523::-;53328:8;;;;;;;53320:39;;;;-1:-1:-1;;;53320:39:0;;15213:2:1;53320:39:0;;;15195:21:1;15252:2;15232:18;;;15225:30;-1:-1:-1;;;15271:18:1;;;15264:48;15329:18;;53320:39:0;15011:342:1;53320:39:0;53378:15;;;;;;;53370:51;;;;-1:-1:-1;;;53370:51:0;;11798:2:1;53370:51:0;;;11780:21:1;11837:2;11817:18;;;11810:30;11876:25;11856:18;;;11849:53;11919:18;;53370:51:0;11596:347:1;53370:51:0;53440:53;53447:6;53479:10;53440:6;:53::i;:::-;53432:81;;;;-1:-1:-1;;;53432:81:0;;17119:2:1;53432:81:0;;;17101:21:1;17158:2;17138:18;;;17131:30;-1:-1:-1;;;17177:18:1;;;17170:45;17232:18;;53432:81:0;16917:339:1;53432:81:0;53529:14;;;;;;;53524:1159;;50128:4;53567:13;35199:10;:17;;35111:113;53567:13;:30;53559:77;;;;-1:-1:-1;;;53559:77:0;;23374:2:1;53559:77:0;;;23356:21:1;23413:2;23393:18;;;23386:30;23452:34;23432:18;;;23425:62;-1:-1:-1;;;23503:18:1;;;23496:32;23545:19;;53559:77:0;23172:398:1;53559:77:0;50440:1;53659:12;:34;;53651:79;;;;-1:-1:-1;;;53651:79:0;;24912:2:1;53651:79:0;;;24894:21:1;;;24931:18;;;24924:30;24990:34;24970:18;;;24963:62;25042:18;;53651:79:0;24710:356:1;53651:79:0;50128:4;53753:50;53789:13;;53753:31;53771:12;53753:13;35199:10;:17;;35111:113;53753:13;:17;;:31::i;:::-;:35;;:50::i;:::-;:68;;53745:128;;;;-1:-1:-1;;;53745:128:0;;;;;;;:::i;:::-;53913:10;53896:28;;;;:16;:28;;;;;;50440:1;;53896:46;;53929:12;53896:32;:46::i;:::-;:68;;53888:109;;;;-1:-1:-1;;;53888:109:0;;12981:2:1;53888:109:0;;;12963:21:1;13020:2;13000:18;;;12993:30;13059;13039:18;;;13032:58;13107:18;;53888:109:0;12779:352:1;53888:109:0;54020:8;;54050:9;;54020:26;;54033:12;54020;:26::i;:::-;:39;54012:83;;;;-1:-1:-1;;;54012:83:0;;15560:2:1;54012:83:0;;;15542:21:1;15599:2;15579:18;;;15572:30;15638:33;15618:18;;;15611:61;15689:18;;54012:83:0;15358:355:1;54012:83:0;54115:9;54110:193;54134:12;54130:1;:16;54110:193;;;54193:10;54176:28;;;;:16;:28;;;;;:33;;54208:1;;54176:28;:33;;54208:1;;54176:33;:::i;:::-;;;;;;;;54232:55;54242:10;54254:32;54272:13;;54254;35199:10;:17;;35111:113;54254:32;54232:9;:55::i;:::-;54148:3;;;;:::i;:::-;;;;54110:193;;53524:1159;50174:4;54351:13;35199:10;:17;;35111:113;54351:13;:23;54343:63;;;;-1:-1:-1;;;54343:63:0;;24203:2:1;54343:63:0;;;24185:21:1;24242:2;24222:18;;;24215:30;24281:29;24261:18;;;24254:57;24328:18;;54343:63:0;24001:351:1;54343:63:0;54429:12;54445:1;54429:17;54421:62;;;;-1:-1:-1;;;54421:62:0;;24912:2:1;54421:62:0;;;24894:21:1;;;24931:18;;;24924:30;24990:34;24970:18;;;24963:62;25042:18;;54421:62:0;24710:356:1;54421:62:0;54527:10;54507:31;;;;:19;:31;;;;;;;;54506:32;54498:69;;;;-1:-1:-1;;;54498:69:0;;24559:2:1;54498:69:0;;;24541:21:1;24598:2;24578:18;;;24571:30;24637:26;24617:18;;;24610:54;24681:18;;54498:69:0;24357:348:1;54498:69:0;54602:10;54582:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;54582:38:0;54616:4;54582:38;;;54635:36;;54657:13;35199:10;:17;;35111:113;52338:671;52450:8;;;;;;;52442:43;;;;-1:-1:-1;;;52442:43:0;;19070:2:1;52442:43:0;;;19052:21:1;19109:2;19089:18;;;19082:30;-1:-1:-1;;;19128:18:1;;;19121:52;19190:18;;52442:43:0;18868:346:1;52442:43:0;52505:15;;;;;;;52504:16;52496:52;;;;-1:-1:-1;;;52496:52:0;;23022:2:1;52496:52:0;;;23004:21:1;23061:2;23041:18;;;23034:30;23100:25;23080:18;;;23073:53;23143:18;;52496:52:0;22820:347:1;52496:52:0;50079:1;52567:12;:32;;52559:68;;;;-1:-1:-1;;;52559:68:0;;14102:2:1;52559:68:0;;;14084:21:1;14141:2;14121:18;;;14114:30;14180:25;14160:18;;;14153:53;14223:18;;52559:68:0;13900:347:1;52559:68:0;50128:4;52646:50;52682:13;;52646:31;52664:12;52646:13;35199:10;:17;;35111:113;52646:50;:68;;52638:128;;;;-1:-1:-1;;;52638:128:0;;;;;;;:::i;:::-;52785:8;;52815:9;;52785:26;;52798:12;52785;:26::i;:::-;:39;52777:83;;;;-1:-1:-1;;;52777:83:0;;15560:2:1;52777:83:0;;;15542:21:1;15599:2;15579:18;;;15572:30;15638:33;15618:18;;;15611:61;15689:18;;52777:83:0;15358:355:1;52777:83:0;52885:6;52881:121;52901:12;52897:1;:16;52881:121;;;52935:55;52945:10;52957:32;52975:13;;52957;35199:10;:17;;35111:113;52935:55;52915:3;;;;:::i;:::-;;;;52881:121;;21591:104;21647:13;21680:7;21673:14;;;;;:::i;56525:786::-;56600:4;56640;56600;56657:531;56681:5;:12;56677:1;:16;56657:531;;;56715:20;56738:5;56744:1;56738:8;;;;;;;;:::i;:::-;;;;;;;56715:31;;56795:12;56779;:28;56775:402;;56929:44;;;;;;9340:19:1;;;9375:12;;;9368:28;;;56922:52:0;;9412:12:1;;56929:44:0;;;-1:-1:-1;;56929:44:0;;;;;;;;;;56922:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56907:67;;56775:402;;;57116:44;;;;;;9340:19:1;;;9375:12;;;9368:28;;;57109:52:0;;9412:12:1;;57116:44:0;;;-1:-1:-1;;57116:44:0;;;;;;;;;;57109:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57094:67;;56775:402;-1:-1:-1;56695:3:0;;;;:::i;:::-;;;;56657:531;;;-1:-1:-1;57299:4:0;;57283:20;;56525:786;-1:-1:-1;;;56525:786:0:o;23274:295::-;-1:-1:-1;;;;;23377:24:0;;16064:10;23377:24;;23369:62;;;;-1:-1:-1;;;23369:62:0;;14859:2:1;23369:62:0;;;14841:21:1;14898:2;14878:18;;;14871:30;14937:27;14917:18;;;14910:55;14982:18;;23369:62:0;14657:349:1;23369:62:0;16064:10;23444:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23444:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23444:53:0;;;;;;;;;;23513:48;;11138:41:1;;;23444:42:0;;16064:10;23513:48;;11111:18:1;23513:48:0;;;;;;;23274:295;;:::o;24537:328::-;24712:41;16064:10;24745:7;24712:18;:41::i;:::-;24704:103;;;;-1:-1:-1;;;24704:103:0;;;;;;;:::i;:::-;24818:39;24832:4;24838:2;24842:7;24851:5;24818:13;:39::i;:::-;24537:328;;;;:::o;55130:604::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;55307:8:::1;:15;55293:3;:10;:29;55285:65;;;::::0;-1:-1:-1;;;55285:65:0;;22670:2:1;55285:65:0::1;::::0;::::1;22652:21:1::0;22709:2;22689:18;;;22682:30;22748:25;22728:18;;;22721:53;22791:18;;55285:65:0::1;22468:347:1::0;55285:65:0::1;55365:9;55361:366;55384:3;:10;55380:1;:14;55361:366;;;50128:4;55423:8;55432:1;55423:11;;;;;;;;:::i;:::-;;;;;;;:29;;55415:99;;;::::0;-1:-1:-1;;;55415:99:0;;23777:2:1;55415:99:0::1;::::0;::::1;23759:21:1::0;23816:2;23796:18;;;23789:30;23855:34;23835:18;;;23828:62;23926:27;23906:18;;;23899:55;23971:19;;55415:99:0::1;23575:421:1::0;55415:99:0::1;50174:4;55537:8;55546:1;55537:11;;;;;;;;:::i;:::-;;;;;;;:21;55529:90;;;;-1:-1:-1::0;;;55529:90:0::1;;;;;;;:::i;:::-;55634:30;55644:3;55648:1;55644:6;;;;;;;;:::i;:::-;;;;;;;55652:8;55661:1;55652:11;;;;;;;;:::i;:::-;;;;;;;55634:9;:30::i;:::-;55695:13;::::0;:20:::1;::::0;55713:1:::1;55695:17;:20::i;:::-;55679:13;:36:::0;55396:3;::::1;::::0;::::1;:::i;:::-;;;;55361:366;;55878:441:::0;26440:4;26464:16;;;:7;:16;;;;;;56017:13;;-1:-1:-1;;;;;26464:16:0;56049:77;;;;-1:-1:-1;;;56049:77:0;;20605:2:1;56049:77:0;;;20587:21:1;20644:2;20624:18;;;20617:30;20683:34;20663:18;;;20656:62;-1:-1:-1;;;20734:18:1;;;20727:45;20789:19;;56049:77:0;20403:411:1;56049:77:0;56142:6;;;;56137:175;;56196:8;56179:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;56165:41;;55878:441;;;:::o;56137:175::-;56270:7;56279:19;:8;:17;:19::i;:::-;56253:46;;;;;;;;;:::i;56137:175::-;55878:441;;;:::o;51594:197::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51738:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51769:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;56399:91::-:0;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;56461:4:::1;:21:::0;56399:91::o;49428:192::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49517:22:0;::::1;49509:73;;;::::0;-1:-1:-1;;;49509:73:0;;13338:2:1;49509:73:0::1;::::0;::::1;13320:21:1::0;13377:2;13357:18;;;13350:30;13416:34;13396:18;;;13389:62;-1:-1:-1;;;13467:18:1;;;13460:36;13513:19;;49509:73:0::1;13136:402:1::0;49509:73:0::1;49593:19;49603:8;49593:9;:19::i;:::-;49428:192:::0;:::o;34471:224::-;34573:4;-1:-1:-1;;;;;;34597:50:0;;-1:-1:-1;;;34597:50:0;;:90;;;34651:36;34675:11;34651:23;:36::i;30357:174::-;30432:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30432:29:0;-1:-1:-1;;;;;30432:29:0;;;;;;;;:24;;30486:23;30432:24;30486:14;:23::i;:::-;-1:-1:-1;;;;;30477:46:0;;;;;;;;;;;30357:174;;:::o;26669:348::-;26762:4;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;26779:73;;;;-1:-1:-1;;;26779:73:0;;16281:2:1;26779:73:0;;;16263:21:1;16320:2;16300:18;;;16293:30;16359:34;16339:18;;;16332:62;-1:-1:-1;;;16410:18:1;;;16403:42;16462:19;;26779:73:0;16079:408:1;26779:73:0;26863:13;26879:23;26894:7;26879:14;:23::i;:::-;26863:39;;26932:5;-1:-1:-1;;;;;26921:16:0;:7;-1:-1:-1;;;;;26921:16:0;;:51;;;;26965:7;-1:-1:-1;;;;;26941:31:0;:20;26953:7;26941:11;:20::i;:::-;-1:-1:-1;;;;;26941:31:0;;26921:51;:87;;;-1:-1:-1;;;;;;23761:25:0;;;23737:4;23761:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26976:32;26913:96;26669:348;-1:-1:-1;;;;26669:348:0:o;29661:578::-;29820:4;-1:-1:-1;;;;;29793:31:0;:23;29808:7;29793:14;:23::i;:::-;-1:-1:-1;;;;;29793:31:0;;29785:85;;;;-1:-1:-1;;;29785:85:0;;20195:2:1;29785:85:0;;;20177:21:1;20234:2;20214:18;;;20207:30;20273:34;20253:18;;;20246:62;-1:-1:-1;;;20324:18:1;;;20317:39;20373:19;;29785:85:0;19993:405:1;29785:85:0;-1:-1:-1;;;;;29889:16:0;;29881:65;;;;-1:-1:-1;;;29881:65:0;;14454:2:1;29881:65:0;;;14436:21:1;14493:2;14473:18;;;14466:30;14532:34;14512:18;;;14505:62;-1:-1:-1;;;14583:18:1;;;14576:34;14627:19;;29881:65:0;14252:400:1;29881:65:0;29959:39;29980:4;29986:2;29990:7;29959:20;:39::i;:::-;30063:29;30080:1;30084:7;30063:8;:29::i;:::-;-1:-1:-1;;;;;30105:15:0;;;;;;:9;:15;;;;;:20;;30124:1;;30105:15;:20;;30124:1;;30105:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30136:13:0;;;;;;:9;:13;;;;;:18;;30153:1;;30136:13;:18;;30153:1;;30136:18;:::i;:::-;;;;-1:-1:-1;;30165:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30165:21:0;-1:-1:-1;;;;;30165:21:0;;;;;;;;;30204:27;;30165:16;;30204:27;;;;;;;29661:578;;;:::o;27359:110::-;27435:26;27445:2;27449:7;27435:26;;;;;;;;;;;;:9;:26::i;49628:173::-;49703:6;;;-1:-1:-1;;;;;49720:17:0;;;-1:-1:-1;;;;;;49720:17:0;;;;;;;49753:40;;49703:6;;;49720:17;49703:6;;49753:40;;49684:16;;49753:40;49673:128;49628:173;:::o;43390:98::-;43448:7;43475:5;43479:1;43475;:5;:::i;:::-;43468:12;43390:98;-1:-1:-1;;;43390:98:0:o;43771:::-;43829:7;43856:5;43860:1;43856;:5;:::i;44128:98::-;44186:7;44213:5;44217:1;44213;:5;:::i;25747:315::-;25904:28;25914:4;25920:2;25924:7;25904:9;:28::i;:::-;25951:48;25974:4;25980:2;25984:7;25993:5;25951:22;:48::i;:::-;25943:111;;;;-1:-1:-1;;;25943:111:0;;;;;;;:::i;16486:723::-;16542:13;16763:10;16759:53;;-1:-1:-1;;16790:10:0;;;;;;;;;;;;-1:-1:-1;;;16790:10:0;;;;;16486:723::o;16759:53::-;16837:5;16822:12;16878:78;16885:9;;16878:78;;16911:8;;;;:::i;:::-;;-1:-1:-1;16934:10:0;;-1:-1:-1;16942:2:0;16934:10;;:::i;:::-;;;16878:78;;;16966:19;16998:6;16988:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16988:17:0;;16966:39;;17016:154;17023:10;;17016:154;;17050:11;17060:1;17050:11;;:::i;:::-;;-1:-1:-1;17119:10:0;17127:2;17119:5;:10;:::i;:::-;17106:24;;:2;:24;:::i;:::-;17093:39;;17076:6;17083;17076:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17076:56:0;;;;;;;;-1:-1:-1;17147:11:0;17156:2;17147:11;;:::i;:::-;;;17016:154;;20477:305;20579:4;-1:-1:-1;;;;;;20616:40:0;;-1:-1:-1;;;20616:40:0;;:105;;-1:-1:-1;;;;;;;20673:48:0;;-1:-1:-1;;;20673:48:0;20616:105;:158;;;-1:-1:-1;;;;;;;;;;19127:40:0;;;20738:36;19018:157;57631:249;57824:48;57851:5;57858:3;57863:8;57824:26;:48::i;27696:321::-;27826:18;27832:2;27836:7;27826:5;:18::i;:::-;27877:54;27908:1;27912:2;27916:7;27925:5;27877:22;:54::i;:::-;27855:154;;;;-1:-1:-1;;;27855:154:0;;;;;;;:::i;31096:799::-;31251:4;-1:-1:-1;;;;;31272:13:0;;8374:20;8422:8;31268:620;;31308:72;;-1:-1:-1;;;31308:72:0;;-1:-1:-1;;;;;31308:36:0;;;;;:72;;16064:10;;31359:4;;31365:7;;31374:5;;31308:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31308:72:0;;;;;;;;-1:-1:-1;;31308:72:0;;;;;;;;;;;;:::i;:::-;;;31304:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31550:13:0;;31546:272;;31593:60;;-1:-1:-1;;;31593:60:0;;;;;;;:::i;31546:272::-;31768:6;31762:13;31753:6;31749:2;31745:15;31738:38;31304:529;-1:-1:-1;;;;;;31431:51:0;-1:-1:-1;;;31431:51:0;;-1:-1:-1;31424:58:0;;31268:620;-1:-1:-1;31872:4:0;31096:799;;;;;;:::o;36147:589::-;-1:-1:-1;;;;;36353:18:0;;36349:187;;36388:40;36420:7;37563:10;:17;;37536:24;;;;:15;:24;;;;;:44;;;37591:24;;;;;;;;;;;;37459:164;36388:40;36349:187;;;36458:2;-1:-1:-1;;;;;36450:10:0;:4;-1:-1:-1;;;;;36450:10:0;;36446:90;;36477:47;36510:4;36516:7;36477:32;:47::i;:::-;-1:-1:-1;;;;;36550:16:0;;36546:183;;36583:45;36620:7;36583:36;:45::i;36546:183::-;36656:4;-1:-1:-1;;;;;36650:10:0;:2;-1:-1:-1;;;;;36650:10:0;;36646:83;;36677:40;36705:2;36709:7;36677:27;:40::i;28353:382::-;-1:-1:-1;;;;;28433:16:0;;28425:61;;;;-1:-1:-1;;;28425:61:0;;18709:2:1;28425:61:0;;;18691:21:1;;;18728:18;;;18721:30;18787:34;18767:18;;;18760:62;18839:18;;28425:61:0;18507:356:1;28425:61:0;26440:4;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;:30;28497:58;;;;-1:-1:-1;;;28497:58:0;;13745:2:1;28497:58:0;;;13727:21:1;13784:2;13764:18;;;13757:30;13823;13803:18;;;13796:58;13871:18;;28497:58:0;13543:352:1;28497:58:0;28568:45;28597:1;28601:2;28605:7;28568:20;:45::i;:::-;-1:-1:-1;;;;;28626:13:0;;;;;;:9;:13;;;;;:18;;28643:1;;28626:13;:18;;28643:1;;28626:18;:::i;:::-;;;;-1:-1:-1;;28655:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28655:21:0;-1:-1:-1;;;;;28655:21:0;;;;;;;;28694:33;;28655:16;;;28694:33;;28655:16;;28694:33;28353:382;;:::o;38250:988::-;38516:22;38566:1;38541:22;38558:4;38541:16;:22::i;:::-;:26;;;;:::i;:::-;38578:18;38599:26;;;:17;:26;;;;;;38516:51;;-1:-1:-1;38732:28:0;;;38728:328;;-1:-1:-1;;;;;38799:18:0;;38777:19;38799:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38850:30;;;;;;:44;;;38967:30;;:17;:30;;;;;:43;;;38728:328;-1:-1:-1;39152:26:0;;;;:17;:26;;;;;;;;39145:33;;;-1:-1:-1;;;;;39196:18:0;;;;;:12;:18;;;;;:34;;;;;;;39189:41;38250:988::o;39533:1079::-;39811:10;:17;39786:22;;39811:21;;39831:1;;39811:21;:::i;:::-;39843:18;39864:24;;;:15;:24;;;;;;40237:10;:26;;39786:46;;-1:-1:-1;39864:24:0;;39786:46;;40237:26;;;;;;:::i;:::-;;;;;;;;;40215:48;;40301:11;40276:10;40287;40276:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40381:28;;;:15;:28;;;;;;;:41;;;40553:24;;;;;40546:31;40588:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39604:1008;;;39533:1079;:::o;37037:221::-;37122:14;37139:20;37156:2;37139:16;:20::i;:::-;-1:-1:-1;;;;;37170:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37215:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37037:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;603:673;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:163;1098:2;1095:1;1092:9;1084:163;;;1155:17;;1143:30;;1193:12;;;;1225;;;;1116:1;1109:9;1084:163;;;-1:-1:-1;1265:5:1;;603:673;-1:-1:-1;;;;;;;603:673:1:o;1959:160::-;2024:20;;2080:13;;2073:21;2063:32;;2053:60;;2109:1;2106;2099:12;2124:221;2167:5;2220:3;2213:4;2205:6;2201:17;2197:27;2187:55;;2238:1;2235;2228:12;2187:55;2260:79;2335:3;2326:6;2313:20;2306:4;2298:6;2294:17;2260:79;:::i;2350:186::-;2409:6;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2501:29;2520:9;2501:29;:::i;2541:260::-;2609:6;2617;2670:2;2658:9;2649:7;2645:23;2641:32;2638:52;;;2686:1;2683;2676:12;2638:52;2709:29;2728:9;2709:29;:::i;:::-;2699:39;;2757:38;2791:2;2780:9;2776:18;2757:38;:::i;:::-;2747:48;;2541:260;;;;;:::o;2806:328::-;2883:6;2891;2899;2952:2;2940:9;2931:7;2927:23;2923:32;2920:52;;;2968:1;2965;2958:12;2920:52;2991:29;3010:9;2991:29;:::i;:::-;2981:39;;3039:38;3073:2;3062:9;3058:18;3039:38;:::i;:::-;3029:48;;3124:2;3113:9;3109:18;3096:32;3086:42;;2806:328;;;;;:::o;3139:666::-;3234:6;3242;3250;3258;3311:3;3299:9;3290:7;3286:23;3282:33;3279:53;;;3328:1;3325;3318:12;3279:53;3351:29;3370:9;3351:29;:::i;:::-;3341:39;;3399:38;3433:2;3422:9;3418:18;3399:38;:::i;:::-;3389:48;;3484:2;3473:9;3469:18;3456:32;3446:42;;3539:2;3528:9;3524:18;3511:32;3566:18;3558:6;3555:30;3552:50;;;3598:1;3595;3588:12;3552:50;3621:22;;3674:4;3666:13;;3662:27;-1:-1:-1;3652:55:1;;3703:1;3700;3693:12;3652:55;3726:73;3791:7;3786:2;3773:16;3768:2;3764;3760:11;3726:73;:::i;:::-;3716:83;;;3139:666;;;;;;;:::o;3810:254::-;3875:6;3883;3936:2;3924:9;3915:7;3911:23;3907:32;3904:52;;;3952:1;3949;3942:12;3904:52;3975:29;3994:9;3975:29;:::i;:::-;3965:39;;4023:35;4054:2;4043:9;4039:18;4023:35;:::i;4069:254::-;4137:6;4145;4198:2;4186:9;4177:7;4173:23;4169:32;4166:52;;;4214:1;4211;4204:12;4166:52;4237:29;4256:9;4237:29;:::i;:::-;4227:39;4313:2;4298:18;;;;4285:32;;-1:-1:-1;;;4069:254:1:o;4328:1157::-;4446:6;4454;4507:2;4495:9;4486:7;4482:23;4478:32;4475:52;;;4523:1;4520;4513:12;4475:52;4563:9;4550:23;4592:18;4633:2;4625:6;4622:14;4619:34;;;4649:1;4646;4639:12;4619:34;4687:6;4676:9;4672:22;4662:32;;4732:7;4725:4;4721:2;4717:13;4713:27;4703:55;;4754:1;4751;4744:12;4703:55;4790:2;4777:16;4812:4;4836:60;4852:43;4892:2;4852:43;:::i;4836:60::-;4918:3;4942:2;4937:3;4930:15;4970:2;4965:3;4961:12;4954:19;;5001:2;4997;4993:11;5049:7;5044:2;5038;5035:1;5031:10;5027:2;5023:19;5019:28;5016:41;5013:61;;;5070:1;5067;5060:12;5013:61;5092:1;5083:10;;5102:169;5116:2;5113:1;5110:9;5102:169;;;5173:23;5192:3;5173:23;:::i;:::-;5161:36;;5134:1;5127:9;;;;;5217:12;;;;5249;;5102:169;;;-1:-1:-1;5290:5:1;-1:-1:-1;;5333:18:1;;5320:32;;-1:-1:-1;;5364:16:1;;;5361:36;;;5393:1;5390;5383:12;5361:36;;5416:63;5471:7;5460:8;5449:9;5445:24;5416:63;:::i;:::-;5406:73;;;4328:1157;;;;;:::o;5490:416::-;5583:6;5591;5644:2;5632:9;5623:7;5619:23;5615:32;5612:52;;;5660:1;5657;5650:12;5612:52;5700:9;5687:23;5733:18;5725:6;5722:30;5719:50;;;5765:1;5762;5755:12;5719:50;5788:61;5841:7;5832:6;5821:9;5817:22;5788:61;:::i;:::-;5778:71;5896:2;5881:18;;;;5868:32;;-1:-1:-1;;;;5490:416:1:o;5911:180::-;5967:6;6020:2;6008:9;5999:7;5995:23;5991:32;5988:52;;;6036:1;6033;6026:12;5988:52;6059:26;6075:9;6059:26;:::i;6096:184::-;6166:6;6219:2;6207:9;6198:7;6194:23;6190:32;6187:52;;;6235:1;6232;6225:12;6187:52;-1:-1:-1;6258:16:1;;6096:184;-1:-1:-1;6096:184:1:o;6285:245::-;6343:6;6396:2;6384:9;6375:7;6371:23;6367:32;6364:52;;;6412:1;6409;6402:12;6364:52;6451:9;6438:23;6470:30;6494:5;6470:30;:::i;6535:249::-;6604:6;6657:2;6645:9;6636:7;6632:23;6628:32;6625:52;;;6673:1;6670;6663:12;6625:52;6705:9;6699:16;6724:30;6748:5;6724:30;:::i;6789:543::-;6877:6;6885;6938:2;6926:9;6917:7;6913:23;6909:32;6906:52;;;6954:1;6951;6944:12;6906:52;6994:9;6981:23;7023:18;7064:2;7056:6;7053:14;7050:34;;;7080:1;7077;7070:12;7050:34;7103:50;7145:7;7136:6;7125:9;7121:22;7103:50;:::i;:::-;7093:60;;7206:2;7195:9;7191:18;7178:32;7162:48;;7235:2;7225:8;7222:16;7219:36;;;7251:1;7248;7241:12;7219:36;;7274:52;7318:7;7307:8;7296:9;7292:24;7274:52;:::i;7337:180::-;7396:6;7449:2;7437:9;7428:7;7424:23;7420:32;7417:52;;;7465:1;7462;7455:12;7417:52;-1:-1:-1;7488:23:1;;7337:180;-1:-1:-1;7337:180:1:o;7522:416::-;7615:6;7623;7676:2;7664:9;7655:7;7651:23;7647:32;7644:52;;;7692:1;7689;7682:12;7644:52;7728:9;7715:23;7705:33;;7789:2;7778:9;7774:18;7761:32;7816:18;7808:6;7805:30;7802:50;;;7848:1;7845;7838:12;7802:50;7871:61;7924:7;7915:6;7904:9;7900:22;7871:61;:::i;7943:257::-;7984:3;8022:5;8016:12;8049:6;8044:3;8037:19;8065:63;8121:6;8114:4;8109:3;8105:14;8098:4;8091:5;8087:16;8065:63;:::i;:::-;8182:2;8161:15;-1:-1:-1;;8157:29:1;8148:39;;;;8189:4;8144:50;;7943:257;-1:-1:-1;;7943:257:1:o;8205:973::-;8290:12;;8255:3;;8345:1;8365:18;;;;8418;;;;8445:61;;8499:4;8491:6;8487:17;8477:27;;8445:61;8525:2;8573;8565:6;8562:14;8542:18;8539:38;8536:161;;;8619:10;8614:3;8610:20;8607:1;8600:31;8654:4;8651:1;8644:15;8682:4;8679:1;8672:15;8536:161;8713:18;8740:104;;;;8858:1;8853:319;;;;8706:466;;8740:104;-1:-1:-1;;8773:24:1;;8761:37;;8818:16;;;;-1:-1:-1;8740:104:1;;8853:319;25794:1;25787:14;;;25831:4;25818:18;;8947:1;8961:165;8975:6;8972:1;8969:13;8961:165;;;9053:14;;9040:11;;;9033:35;9096:16;;;;8990:10;;8961:165;;;8965:3;;9155:6;9150:3;9146:16;9139:23;;8706:466;;;;;;;8205:973;;;;:::o;9435:274::-;9564:3;9602:6;9596:13;9618:53;9664:6;9659:3;9652:4;9644:6;9640:17;9618:53;:::i;:::-;9687:16;;;;;9435:274;-1:-1:-1;;9435:274:1:o;9714:197::-;9842:3;9867:38;9901:3;9893:6;9867:38;:::i;9916:376::-;10092:3;10120:38;10154:3;10146:6;10120:38;:::i;:::-;10187:6;10181:13;10203:52;10248:6;10244:2;10237:4;10229:6;10225:17;10203:52;:::i;:::-;10271:15;;9916:376;-1:-1:-1;;;;9916:376:1:o;10505:488::-;-1:-1:-1;;;;;10774:15:1;;;10756:34;;10826:15;;10821:2;10806:18;;10799:43;10873:2;10858:18;;10851:34;;;10921:3;10916:2;10901:18;;10894:31;;;10699:4;;10942:45;;10967:19;;10959:6;10942:45;:::i;:::-;10934:53;10505:488;-1:-1:-1;;;;;;10505:488:1:o;11372:219::-;11521:2;11510:9;11503:21;11484:4;11541:44;11581:2;11570:9;11566:18;11558:6;11541:44;:::i;12360:414::-;12562:2;12544:21;;;12601:2;12581:18;;;12574:30;12640:34;12635:2;12620:18;;12613:62;-1:-1:-1;;;12706:2:1;12691:18;;12684:48;12764:3;12749:19;;12360:414::o;17672:420::-;17874:2;17856:21;;;17913:2;17893:18;;;17886:30;17952:34;17947:2;17932:18;;17925:62;18023:26;18018:2;18003:18;;17996:54;18082:3;18067:19;;17672:420::o;19632:356::-;19834:2;19816:21;;;19853:18;;;19846:30;19912:34;19907:2;19892:18;;19885:62;19979:2;19964:18;;19632:356::o;21221:411::-;21423:2;21405:21;;;21462:2;21442:18;;;21435:30;21501:34;21496:2;21481:18;;21474:62;-1:-1:-1;;;21567:2:1;21552:18;;21545:45;21622:3;21607:19;;21221:411::o;21637:413::-;21839:2;21821:21;;;21878:2;21858:18;;;21851:30;21917:34;21912:2;21897:18;;21890:62;-1:-1:-1;;;21983:2:1;21968:18;;21961:47;22040:3;22025:19;;21637:413::o;25253:275::-;25324:2;25318:9;25389:2;25370:13;;-1:-1:-1;;25366:27:1;25354:40;;25424:18;25409:34;;25445:22;;;25406:62;25403:88;;;25471:18;;:::i;:::-;25507:2;25500:22;25253:275;;-1:-1:-1;25253:275:1:o;25533:183::-;25593:4;25626:18;25618:6;25615:30;25612:56;;;25648:18;;:::i;:::-;-1:-1:-1;25693:1:1;25689:14;25705:4;25685:25;;25533:183::o;25847:128::-;25887:3;25918:1;25914:6;25911:1;25908:13;25905:39;;;25924:18;;:::i;:::-;-1:-1:-1;25960:9:1;;25847:128::o;25980:120::-;26020:1;26046;26036:35;;26051:18;;:::i;:::-;-1:-1:-1;26085:9:1;;25980:120::o;26105:168::-;26145:7;26211:1;26207;26203:6;26199:14;26196:1;26193:21;26188:1;26181:9;26174:17;26170:45;26167:71;;;26218:18;;:::i;:::-;-1:-1:-1;26258:9:1;;26105:168::o;26278:125::-;26318:4;26346:1;26343;26340:8;26337:34;;;26351:18;;:::i;:::-;-1:-1:-1;26388:9:1;;26278:125::o;26408:258::-;26480:1;26490:113;26504:6;26501:1;26498:13;26490:113;;;26580:11;;;26574:18;26561:11;;;26554:39;26526:2;26519:10;26490:113;;;26621:6;26618:1;26615:13;26612:48;;;-1:-1:-1;;26656:1:1;26638:16;;26631:27;26408:258::o;26671:380::-;26750:1;26746:12;;;;26793;;;26814:61;;26868:4;26860:6;26856:17;26846:27;;26814:61;26921:2;26913:6;26910:14;26890:18;26887:38;26884:161;;;26967:10;26962:3;26958:20;26955:1;26948:31;27002:4;26999:1;26992:15;27030:4;27027:1;27020:15;26884:161;;26671:380;;;:::o;27056:135::-;27095:3;-1:-1:-1;;27116:17:1;;27113:43;;;27136:18;;:::i;:::-;-1:-1:-1;27183:1:1;27172:13;;27056:135::o;27196:112::-;27228:1;27254;27244:35;;27259:18;;:::i;:::-;-1:-1:-1;27293:9:1;;27196:112::o;27313:127::-;27374:10;27369:3;27365:20;27362:1;27355:31;27405:4;27402:1;27395:15;27429:4;27426:1;27419:15;27445:127;27506:10;27501:3;27497:20;27494:1;27487:31;27537:4;27534:1;27527:15;27561:4;27558:1;27551:15;27577:127;27638:10;27633:3;27629:20;27626:1;27619:31;27669:4;27666:1;27659:15;27693:4;27690:1;27683:15;27709:127;27770:10;27765:3;27761:20;27758:1;27751:31;27801:4;27798:1;27791:15;27825:4;27822:1;27815:15;27841:127;27902:10;27897:3;27893:20;27890:1;27883:31;27933:4;27930:1;27923:15;27957:4;27954:1;27947:15;27973:131;-1:-1:-1;;;;;;28047:32:1;;28037:43;;28027:71;;28094:1;28091;28084:12

Swarm Source

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