Token Beta Mascots

Overview CRC721

Total Supply:
3,456 BMSN

Holders:
301 addresses
Balance
12 BMSN
0xd156f87ea9f25b7820582b460553ee621eddc258
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BetaMascots

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-05-12
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

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


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

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

    /**
     * @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]


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

pragma solidity ^0.8.0;


/**
 * @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 allows 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/interfaces/[email protected]


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


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


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


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


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File contracts/WithLimitedSupply.sol


pragma solidity ^0.8.4;

/// @author Modified version of original code by 1001.digital
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
	// Keeps track of how many we have minted
	uint256 private _tokenCount;

	/// @dev The maximum count of tokens this token tracker will issue.
	uint256 private immutable _maxAvailableSupply;

	/// Instanciate the contract
	/// @param maxSupply_ how many tokens this collection should hold
	constructor(uint256 maxSupply_, uint256 reserved_) {
		_maxAvailableSupply = maxSupply_ - reserved_;
	}

	function maxAvailableSupply() public view returns (uint256) {
		return _maxAvailableSupply;
	}

	/// @dev Get the current token count
	/// @return the created token count
	/// TODO: if this is not required externally, does making it `public view` use unneccary gas?
	function tokenCount() public view returns (uint256) {
		return _tokenCount;
	}

	/// @dev Check whether tokens are still available
	/// @return the available token count
	function availableTokenCount() public view returns (uint256) {
		return maxAvailableSupply() - tokenCount();
	}

	/// @dev Increment the token count and fetch the latest count
	/// @return the next token id
	function nextToken() internal virtual ensureAvailability returns (uint256) {
		return _tokenCount++;
	}

	/// @dev Check whether another token is still available
	modifier ensureAvailability() {
		require(availableTokenCount() > 0, 'No more tokens available');
		_;
	}

	/// @param amount Check whether number of tokens are still available
	/// @dev Check whether tokens are still available
	modifier ensureAvailabilityFor(uint256 amount) {
		require(
			availableTokenCount() >= amount,
			'Requested number of tokens not available'
		);
		_;
	}
}


// File contracts/RandomlyAssigned.sol


pragma solidity ^0.8.4;

/// @author Modified version of original code by 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
	// Used for random index assignment
	mapping(uint256 => uint256) private tokenMatrix;

	// The initial token ID
	uint256 private immutable startFrom;

	/// Instanciate the contract
	/// @param maxSupply_ how many tokens this collection should hold
	/// @param numReserved_ the number of tokens reserved whose IDs dont come from the randomizer
	constructor(uint256 maxSupply_, uint256 numReserved_)
    	WithLimitedSupply(maxSupply_, numReserved_)
	{
		startFrom = numReserved_ + 1;
	}

	/// Get the next token ID
	/// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
	/// @return the next token ID
	function nextToken() internal override returns (uint256) {
		uint256 maxIndex = maxAvailableSupply() - tokenCount();
		uint256 random = uint256(
			keccak256(
				abi.encodePacked(
					msg.sender,
					block.coinbase,
					block.difficulty,
					block.gaslimit,
					block.timestamp
				)
			)
		) % maxIndex;

		uint256 value = 0;
		if (tokenMatrix[random] == 0) {
			// If this matrix position is empty, set the value to the generated random number.
			value = random;
		} else {
			// Otherwise, use the previously stored number from the matrix.
			value = tokenMatrix[random];
		}

		// If the last available tokenID is still unused...
		if (tokenMatrix[maxIndex - 1] == 0) {
			// ...store that ID in the current matrix position.
			tokenMatrix[random] = maxIndex - 1;
		} else {
			// ...otherwise copy over the stored number to the current matrix position.
			tokenMatrix[random] = tokenMatrix[maxIndex - 1];
		}

		// Increment counts (ie. qty minted)
		super.nextToken();

		return value + startFrom;
	}
}


// File contracts/SafeMathLite.sol


pragma solidity ^0.8.4;
library SafeMathLite{

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


// File contracts/SafePct.sol


pragma solidity ^0.8.4;

/**
 * @dev Compute percentages safely without phantom overflows.
 *
 * Intermediate operations can overflow even when the result will always
 * fit into computed type. Developers usually
 * assume that overflows raise errors. `SafePct` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */

library SafePct {
    using SafeMathLite for uint256;
    /**
     * Requirements:
     *
     * - intermediate operations must revert on overflow
     */
    function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) {
        require(z > 0, "Division by zero");

        if (x == 0) return 0;
        uint256 xy = x * y;
        if (xy / x == y) { // no overflow happened - same as in SafeMath mul
            return xy / z;
        }

        //slither-disable-next-line divide-before-multiply
        uint256 a = x / z;
        uint256 b = x % z; // x = a * z + b

        //slither-disable-next-line divide-before-multiply
        uint256 c = y / z;
        uint256 d = y % z; // y = c * z + d

        return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z));
    }


}


// File contracts/Drop.sol


pragma solidity ^0.8.4;








abstract contract Market {
    function isMember(address user) public view virtual returns (bool);
    function addToEscrow(address _address) external virtual payable;
}

contract Drop is 
    Pausable,
    ERC721Enumerable,
    Ownable, 
    RandomlyAssigned,
    ERC2981
{
    using Counters for Counters.Counter;
    using Strings for uint256;
    using SafePct for uint256;
    using SafeMathLite for uint256;

    string public baseURI;
    
    uint256 public regularCost;
    uint256 public memberCost;
    uint256 public whitelistCost;
    
    //Restrictions
    uint256 public maxSupply;
    uint256 public immutable reservedNft;
    uint256 public immutable maxMintAmount;

    Counters.Counter public reservedMintedNFT;

    address marketAddress;

    address[] private payees;
    uint16[] private shares;

    uint256 publicStartTime;
    uint256 whitelistStartTime;

    address immutable FACTORY_ADDRESS;

    struct Infos {
        uint256 regularCost;
        uint256 memberCost;
        uint256 whitelistCost;
        uint256 maxSupply;
        uint256 totalSupply;
        uint256 maxMintPerAddress;
        uint256 maxMintPerTx;
    }

    mapping(address => bool) public whitelistedAddresses;
    
    modifier onlyDropOwner() {
        require(msg.sender == FACTORY_ADDRESS || msg.sender == owner(), "not owner");
        _;
    }

    constructor(
        string memory name_,
        string memory symbol_,
        string memory baseURI_,
        uint256 maxSupply_,
        uint256 maxMintAmount_,
        uint256 reservedNFT_,
        address marketAddress_
    ) 
    ERC721(name_, symbol_)
    RandomlyAssigned(maxSupply_, reservedNFT_) 
    {
        setBaseURI(baseURI_);
        maxSupply = maxSupply_;
        maxMintAmount = maxMintAmount_;
        reservedNft = reservedNFT_;
        marketAddress = marketAddress_;
        FACTORY_ADDRESS = msg.sender;
        _transferOwnership(tx.origin);
    }

    function getInfo() public view returns (Infos memory) {
        Infos memory allInfos;
        allInfos.regularCost = regularCost;
        allInfos.memberCost = memberCost;
        allInfos.whitelistCost = whitelistCost;
        allInfos.maxSupply = maxSupply;
        allInfos.totalSupply = totalSupply();
        allInfos.maxMintPerTx = maxMintAmount;

        return allInfos;
    }

    function isEbisusBayMember(address _address) private view returns(bool) {
        return Market(marketAddress).isMember(_address);
    }

    function addWhiteList(address[] calldata _addresses) public onlyOwner {
        uint len = _addresses.length;
        for(uint i = 0; i < len; i ++) {
            whitelistedAddresses[_addresses[i]] = true;
        }        
    }
    
    function addWhiteListAddress(address _address) public onlyOwner {
        whitelistedAddresses[_address] = true;
    }

    function removeWhiteList(address _address) public onlyOwner {
        if (whitelistedAddresses[_address]) {
            delete whitelistedAddresses[_address];
        }
    }

    function setRegularCost(uint256 _cost) external onlyDropOwner {
        regularCost = _cost;
    }

    function setMemberCost(uint256 _cost) external onlyDropOwner {
        memberCost = _cost;
    }

    function setWhitelistCost(uint256 _cost) external onlyDropOwner {
        whitelistCost = _cost;
    }

    function isWhitelist(address _address) public view returns(bool) {
        if (whitelistStartTime != 0 && block.timestamp < whitelistStartTime) {
            return false;
        }
        return whitelistedAddresses[_address];
    }

    function mint(uint256 _mintAmount) public payable whenNotPaused {
        require(publicStartTime == 0 || publicStartTime <= block.timestamp, "not started");

        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(
            _mintAmount <= maxMintAmount,
            "max mint amount per session exceeded"
        );
        require((supply + _mintAmount) <= maxSupply, "max NFT limit exceeded");

        uint256 cost;
        if (isWhitelist(msg.sender)) {
            cost = whitelistCost;
        } else {              
            if (isEbisusBayMember(msg.sender)) {
                cost = memberCost;
            } else {
                cost = regularCost;
            }    
        }

        uint256 totalCost = cost.mul(_mintAmount);

        require(totalCost <= msg.value, "insufficient funds");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _mintRandomId(msg.sender);
        }
        
        Market market = Market(marketAddress);
        uint256 len = payees.length;
        uint256 amount;
        for(uint256 i = 0; i < len; i ++) {
            amount = totalCost.mulDiv(shares[i], 10000);
            market.addToEscrow{value : amount}(payees[i]);
        }  
    }

    function reservedMint(address _to, uint256 _mintAmount) public onlyOwner{
        require((reservedMintedNFT.current() + _mintAmount) <= reservedNft, "All Reserved NFT Minted");
        for (uint256 i = 1; i <= _mintAmount; i++) {
            reservedMintedNFT.increment();
            _safeMint(_to, reservedMintedNFT.current());
        }
    }

    function airdropMint(address _to, uint256 _amount) public onlyOwner {
        uint256 supply = totalSupply();
        require((supply + _amount) <= maxSupply, "max NFT limit exceeded");
        for (uint256 i = 1; i <= _amount; i++) {
            _mintRandomId(_to);
        }
    }

	function _mintRandomId(address to) private {
		uint256 id = nextToken();
		require(id > 0 && id <= maxSupply, "Mint not possible");
		_safeMint(to, id);
	}    

    //Get NFT Cost
    function mintCost(address _address) public view returns (uint256) {
        require(_address != address(0), "not address 0");
        if (isWhitelist(_address)) {
            return whitelistCost;
        }

        if (isEbisusBayMember(_address)) {
            return memberCost;
        }

        return regularCost;
    }

    // Can Mint Function
    function canMint(address) public view returns(uint256){
         return maxMintAmount;
    }

    function tokenURI(uint _tokenId) public view virtual override returns (string memory) {
      require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token");

      string memory _tokenURI = string(abi.encodePacked(baseURI, "/", Strings.toString(_tokenId),".json"));

      return _tokenURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function pause() public onlyOwner{
        _pause();
    }

    function unpause() public onlyOwner{
        _unpause();
    }
    
    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function burn(uint256 tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }

    function lock() external onlyOwner {
        maxSupply = totalSupply();
    }

    function setPaymentShares(address[] calldata _newPayees, uint16[] calldata _newShares) external onlyDropOwner {
        require(_newPayees.length != 0, "empty payees");
        require(_newPayees.length == _newShares.length, "wrong payee numbers");
        
        if (!isCorrectShares(_newShares)) {
            revert("invalid shares");
        }
        payees = _newPayees;
        shares = _newShares;
    }

    function getPayees() public view returns(address[] memory) {
        return payees;
    }

    function getShares() public view returns(uint16[] memory) {
        return shares;
    }

    function isCorrectShares(uint16[] memory _shares) private pure returns (bool){
        uint256 len = _shares.length;
        uint256 totalFees;
        for(uint256 i = 0; i < len; i ++) {
            totalFees += _shares[i];
        }

        return totalFees == 10000;
    }

    function setPublicStartTime(uint256 _startTime) external onlyOwner {
        publicStartTime = _startTime;
    }
    
    function setWhitelistStartTime(uint256 _startTime) external onlyOwner {
        whitelistStartTime = _startTime;
    }

    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}


// File contracts/drops/BetaMascots.sol


pragma solidity ^0.8.4;

contract BetaMascots is Drop
{
    constructor(address _marketAddress) Drop(
        "Beta Mascots",
        "BMSN",
        "ipfs://QmXxeBPnZGREWF6j7JNSqFvqZNsFa3pLdHU6pQEZp9qSxW",
        3456,
        10,
        20,
        _marketAddress
    ){
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addWhiteListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canMint","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":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct Drop.Infos","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayees","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShares","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxAvailableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"regularCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintedNFT","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMemberCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_newPayees","type":"address[]"},{"internalType":"uint16[]","name":"_newShares","type":"uint16[]"}],"name":"setPaymentShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setPublicStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setRegularCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setWhitelistStartTime","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":[],"name":"tokenCount","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101206040523480156200001257600080fd5b506040516200416f3803806200416f8339810160408190526200003591620002ea565b6040518060400160405280600c81526020016b42657461204d6173636f747360a01b815250604051806040016040528060048152602001632126a9a760e11b8152506040518060600160405280603581526020016200413a603591396000805460ff191690558251610d8090600a90601490879084908390829082908b908b90620000c890600190602085019062000244565b508051620000de90600290602084019062000244565b505050620000fb620000f56200017660201b60201c565b6200017a565b62000107818362000335565b608052506200011a90508160016200031a565b60a052506200012b905085620001cc565b601484905560e083905260c0829052601680546001600160a01b0319166001600160a01b0383161790553360601b6101005262000168326200017a565b5050505050505050620003a2565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b031633146200022b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200024090601090602084019062000244565b5050565b82805462000252906200034f565b90600052602060002090601f016020900481019282620002765760008555620002c1565b82601f106200029157805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c1578251825591602001919060010190620002a4565b50620002cf929150620002d3565b5090565b5b80821115620002cf5760008155600101620002d4565b600060208284031215620002fc578081fd5b81516001600160a01b038116811462000313578182fd5b9392505050565b600082198211156200033057620003306200038c565b500190565b6000828210156200034a576200034a6200038c565b500390565b600181811c908216806200036457607f821691505b602082108114156200038657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160e0516101005160601c613d116200042960003960008181611c8601528181611d9601528181611e320152611e9401526000818161054001528181610934015281816113af01526117c20152600081816107d70152611a9601526000612d1b01526000818161048b01528181611dfe0152612bde0152613d116000f3fe6080604052600436106103765760003560e01c8063715018a6116101d1578063c683630d11610102578063e14ca353116100a0578063ea798c6d1161006f578063ea798c6d14610ac2578063eba830d814610ad8578063f2fde38b14610af8578063f83d08ba14610b1857600080fd5b8063e14ca35314610a2e578063e1ec629414610a43578063e7b99ec714610a63578063e985e9c514610a7957600080fd5b8063d5abeb01116100dc578063d5abeb01146109b6578063d73fe0aa146109cc578063db8cc8fa146109ee578063dc09e92314610a0e57600080fd5b8063c683630d14610956578063c87b56dd14610976578063d49479eb1461099657600080fd5b80639f181b5e1161016f578063b42fa83d11610149578063b42fa83d146108c0578063b7a34c8a146108d6578063b88d4fde146108f6578063c2ba47441461091657600080fd5b80639f181b5e14610878578063a0712d681461088d578063a22cb465146108a057600080fd5b80638456cb59116101ab5780638456cb59146108195780638da5cb5b1461082e5780638dbe817f1461084c57806395d89b411461086357600080fd5b8063715018a6146107b05780637fa7c50b146107c55780638164c309146107f957600080fd5b80632a55205a116102ab57806355f804b3116102495780635e1045ec116102235780635e1045ec1461073b5780636352211e1461075b5780636c0360eb1461077b57806370a082311461079057600080fd5b806355f804b3146106985780635a9b0b89146106b85780635c975abb1461072357600080fd5b80633f4ba83a116102855780633f4ba83a1461062357806342842e0e1461063857806342966c68146106585780634f6ccce71461067857600080fd5b80632a55205a146105a45780632acc659e146105e35780632f745c591461060357600080fd5b806318160ddd1161031857806322ad0670116102f257806322ad06701461050e578063239c70ae1461052e57806323b872dd1461056257806327f381131461058257600080fd5b806318160ddd146104b95780631c0ce3d3146104ce5780632042e5c2146104ee57600080fd5b806306fdde031161035457806306fdde0314610402578063081812fc14610424578063095ea7b31461045c57806315f91c181461047c57600080fd5b806301ffc9a71461037b57806304634d8d146103b057806306c933d8146103d2575b600080fd5b34801561038757600080fd5b5061039b6103963660046137e0565b610b2d565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb3660046136e5565b610b3e565b005b3480156103de57600080fd5b5061039b6103ed366004613586565b601b6020526000908152604090205460ff1681565b34801561040e57600080fd5b50610417610b7f565b6040516103a79190613a6f565b34801561043057600080fd5b5061044461043f36600461385e565b610c11565b6040516001600160a01b0390911681526020016103a7565b34801561046857600080fd5b506103d06104773660046136bc565b610ca6565b34801561048857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020016103a7565b3480156104c557600080fd5b506009546104ab565b3480156104da57600080fd5b506103d06104e936600461385e565b610dbc565b3480156104fa57600080fd5b506103d0610509366004613586565b610deb565b34801561051a57600080fd5b506103d06105293660046136bc565b610e5a565b34801561053a57600080fd5b506104ab7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056e57600080fd5b506103d061057d3660046135d2565b610f11565b34801561058e57600080fd5b50610597610f43565b6040516103a791906139e6565b3480156105b057600080fd5b506105c46105bf366004613876565b610fa4565b604080516001600160a01b0390931683526020830191909152016103a7565b3480156105ef57600080fd5b506104ab6105fe366004613586565b611052565b34801561060f57600080fd5b506104ab61061e3660046136bc565b6110ce565b34801561062f57600080fd5b506103d0611164565b34801561064457600080fd5b506103d06106533660046135d2565b611198565b34801561066457600080fd5b506103d061067336600461385e565b6111b3565b34801561068457600080fd5b506104ab61069336600461385e565b61122a565b3480156106a457600080fd5b506103d06106b3366004613818565b6112cb565b3480156106c457600080fd5b506106cd611308565b6040516103a79190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b34801561072f57600080fd5b5060005460ff1661039b565b34801561074757600080fd5b506103d061075636600461371b565b6113d8565b34801561076757600080fd5b5061044461077636600461385e565b611483565b34801561078757600080fd5b506104176114fa565b34801561079c57600080fd5b506104ab6107ab366004613586565b611588565b3480156107bc57600080fd5b506103d061160f565b3480156107d157600080fd5b506104ab7f000000000000000000000000000000000000000000000000000000000000000081565b34801561080557600080fd5b506103d0610814366004613586565b611643565b34801561082557600080fd5b506103d0611691565b34801561083a57600080fd5b50600b546001600160a01b0316610444565b34801561085857600080fd5b506015546104ab9081565b34801561086f57600080fd5b506104176116c3565b34801561088457600080fd5b50600c546104ab565b6103d061089b36600461385e565b6116d2565b3480156108ac57600080fd5b506103d06108bb366004613686565b611a5f565b3480156108cc57600080fd5b506104ab60125481565b3480156108e257600080fd5b506103d06108f13660046136bc565b611a6a565b34801561090257600080fd5b506103d061091136600461360d565b611b53565b34801561092257600080fd5b506104ab610931366004613586565b507f000000000000000000000000000000000000000000000000000000000000000090565b34801561096257600080fd5b5061039b610971366004613586565b611b85565b34801561098257600080fd5b5061041761099136600461385e565b611bc7565b3480156109a257600080fd5b506103d06109b136600461385e565b611c7b565b3480156109c257600080fd5b506104ab60145481565b3480156109d857600080fd5b506109e1611cdd565b6040516103a79190613a33565b3480156109fa57600080fd5b506103d0610a0936600461385e565b611d5c565b348015610a1a57600080fd5b506103d0610a2936600461385e565b611d8b565b348015610a3a57600080fd5b506104ab611ded565b348015610a4f57600080fd5b506103d0610a5e36600461385e565b611e27565b348015610a6f57600080fd5b506104ab60135481565b348015610a8557600080fd5b5061039b610a943660046135a0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ace57600080fd5b506104ab60115481565b348015610ae457600080fd5b506103d0610af336600461375b565b611e89565b348015610b0457600080fd5b506103d0610b13366004613586565b612000565b348015610b2457600080fd5b506103d0612098565b6000610b38826120ca565b92915050565b600b546001600160a01b03163314610b715760405162461bcd60e51b8152600401610b6890613ad4565b60405180910390fd5b610b7b82826120ef565b5050565b606060018054610b8e90613c0b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bba90613c0b565b8015610c075780601f10610bdc57610100808354040283529160200191610c07565b820191906000526020600020905b815481529060010190602001808311610bea57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c8a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b68565b506000908152600560205260409020546001600160a01b031690565b6000610cb182611483565b9050806001600160a01b0316836001600160a01b03161415610d1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b68565b336001600160a01b0382161480610d3b5750610d3b8133610a94565b610dad5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b68565b610db783836121ec565b505050565b600b546001600160a01b03163314610de65760405162461bcd60e51b8152600401610b6890613ad4565b601a55565b600b546001600160a01b03163314610e155760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b0381166000908152601b602052604090205460ff1615610e57576001600160a01b0381166000908152601b60205260409020805460ff191690555b50565b600b546001600160a01b03163314610e845760405162461bcd60e51b8152600401610b6890613ad4565b6000610e8f60095490565b601454909150610e9f8383613b7d565b1115610ee65760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b68565b60015b828111610f0b57610ef98461225a565b80610f0381613c46565b915050610ee9565b50505050565b610f1c335b826122c2565b610f385760405162461bcd60e51b8152600401610b6890613b09565b610db78383836123b9565b60606017805480602002602001604051908101604052809291908181526020018280548015610c0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f7d575050505050905090565b6000828152600f602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611019575060408051808201909152600e546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611038906001600160601b031687613ba9565b6110429190613b95565b91519350909150505b9250929050565b60006001600160a01b03821661109a5760405162461bcd60e51b815260206004820152600d60248201526c06e6f742061646472657373203609c1b6044820152606401610b68565b6110a382611b85565b156110b057505060135490565b6110b982612560565b156110c657505060125490565b505060115490565b60006110d983611588565b821061113b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b68565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546001600160a01b0316331461118e5760405162461bcd60e51b8152600401610b6890613ad4565b6111966125de565b565b610db783838360405180602001604052806000815250611b53565b6111bc33610f16565b6112215760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610b68565b610e5781612671565b600061123560095490565b82106112985760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b68565b600982815481106112b957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b546001600160a01b031633146112f55760405162461bcd60e51b8152600401610b6890613ad4565b8051610b7b906010906020840190613321565b6113486040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6113886040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b601154815260125460208201526013546040820152601454606082015260095460808201527f000000000000000000000000000000000000000000000000000000000000000060c0820152919050565b600b546001600160a01b031633146114025760405162461bcd60e51b8152600401610b6890613ad4565b8060005b81811015610f0b576001601b600086868581811061143457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114499190613586565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061147b81613c46565b915050611406565b6000818152600360205260408120546001600160a01b031680610b385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b68565b6010805461150790613c0b565b80601f016020809104026020016040519081016040528092919081815260200182805461153390613c0b565b80156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b505050505081565b60006001600160a01b0382166115f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b68565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b031633146116395760405162461bcd60e51b8152600401610b6890613ad4565b6111966000612718565b600b546001600160a01b0316331461166d5760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b03166000908152601b60205260409020805460ff19166001179055565b600b546001600160a01b031633146116bb5760405162461bcd60e51b8152600401610b6890613ad4565b61119661276a565b606060028054610b8e90613c0b565b60005460ff16156117185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b68565b601954158061172957504260195411155b6117635760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610b68565b600061176e60095490565b9050600082116117c05760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b68565b7f000000000000000000000000000000000000000000000000000000000000000082111561183c5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610b68565b6014546118498383613b7d565b11156118905760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b68565b600061189b33611b85565b156118a957506013546118c5565b6118b233612560565b156118c057506012546118c5565b506011545b60006118d182856127e5565b9050348111156119185760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b68565b60015b84811161193d5761192b3361225a565b8061193581613c46565b91505061191b565b506016546017546001600160a01b03909116906000805b82811015611a55576119aa6018828154811061198057634e487b7160e01b600052603260045260246000fd5b600091825260209091206010820401548791600f166002026101000a900461ffff166127106127f8565b9150836001600160a01b0316634065da6383601784815481106119dd57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405160e084901b6001600160e01b03191681526001600160a01b0390911660048201526024016000604051808303818588803b158015611a2957600080fd5b505af1158015611a3d573d6000803e3d6000fd5b50505050508080611a4d90613c46565b915050611954565b5050505050505050565b610b7b33838361290a565b600b546001600160a01b03163314611a945760405162461bcd60e51b8152600401610b6890613ad4565b7f000000000000000000000000000000000000000000000000000000000000000081611abf60155490565b611ac99190613b7d565b1115611b175760405162461bcd60e51b815260206004820152601760248201527f416c6c205265736572766564204e4654204d696e7465640000000000000000006044820152606401610b68565b60015b818111610db757611b2f601580546001019055565b611b4183611b3c60155490565b6129d9565b80611b4b81613c46565b915050611b1a565b611b5d33836122c2565b611b795760405162461bcd60e51b8152600401610b6890613b09565b610f0b848484846129f3565b6000601a54600014158015611b9b5750601a5442105b15611ba857506000919050565b506001600160a01b03166000908152601b602052604090205460ff1690565b6000818152600360205260409020546060906001600160a01b0316611c465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b68565b60006010611c5384612a26565b604051602001611c649291906138df565b60408051601f198184030181529190529392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611cbc5750600b546001600160a01b031633145b611cd85760405162461bcd60e51b8152600401610b6890613b5a565b601355565b60606018805480602002602001604051908101604052809291908181526020018280548015610c0757602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611d1a5790505050505050905090565b600b546001600160a01b03163314611d865760405162461bcd60e51b8152600401610b6890613ad4565b601955565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611dcc5750600b546001600160a01b031633145b611de85760405162461bcd60e51b8152600401610b6890613b5a565b601255565b6000611df8600c5490565b611e22907f0000000000000000000000000000000000000000000000000000000000000000613bc8565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611e685750600b546001600160a01b031633145b611e845760405162461bcd60e51b8152600401610b6890613b5a565b601155565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611eca5750600b546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610b6890613b5a565b82611f225760405162461bcd60e51b815260206004820152600c60248201526b656d7074792070617965657360a01b6044820152606401610b68565b828114611f675760405162461bcd60e51b815260206004820152601360248201527277726f6e67207061796565206e756d6265727360681b6044820152606401610b68565b611fa3828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b4092505050565b611fe05760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073686172657360901b6044820152606401610b68565b611fec601785856133a5565b50611ff9601883836133f8565b5050505050565b600b546001600160a01b0316331461202a5760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b03811661208f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b68565b610e5781612718565b600b546001600160a01b031633146120c25760405162461bcd60e51b8152600401610b6890613ad4565b600954601455565b60006001600160e01b0319821663152a902d60e11b1480610b385750610b3882612ba7565b6127106001600160601b038216111561215d5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b68565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b68565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600e55565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061222182611483565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612264612bcc565b905060008111801561227857506014548111155b6122b85760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420706f737369626c6560781b6044820152606401610b68565b610b7b82826129d9565b6000818152600360205260408120546001600160a01b031661233b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b68565b600061234683611483565b9050806001600160a01b0316846001600160a01b031614806123815750836001600160a01b031661237684610c11565b6001600160a01b0316145b806123b157506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166123cc82611483565b6001600160a01b0316146124305760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b68565b6001600160a01b0382166124925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b68565b61249d838383612d48565b6124a86000826121ec565b6001600160a01b03831660009081526004602052604081208054600192906124d1908490613bc8565b90915550506001600160a01b03821660009081526004602052604081208054600192906124ff908490613b7d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60165460405163288c314960e21b81526001600160a01b038381166004830152600092169063a230c5249060240160206040518083038186803b1580156125a657600080fd5b505afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3891906137c4565b60005460ff166126275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b68565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061267c82611483565b905061268a81600084612d48565b6126956000836121ec565b6001600160a01b03811660009081526004602052604081208054600192906126be908490613bc8565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156127b05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b68565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126543390565b60006127f18284613ba9565b9392505050565b600080821161283c5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610b68565b83612849575060006127f1565b60006128558486613ba9565b9050836128628683613b95565b141561287a576128728382613b95565b9150506127f1565b60006128868487613b95565b905060006128948588613c61565b905060006128a28688613b95565b905060006128b08789613c61565b90506128fd6128c9886128c386856127e5565b90612e00565b6128f76128d686866127e5565b6128f76128e389876127e5565b6128f78d6128f18c8b6127e5565b906127e5565b90612e0c565b9998505050505050505050565b816001600160a01b0316836001600160a01b0316141561296c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b68565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610b7b828260405180602001604052806000815250612e18565b6129fe8484846123b9565b612a0a84848484612e4b565b610f0b5760405162461bcd60e51b8152600401610b6890613a82565b606081612a4a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a745780612a5e81613c46565b9150612a6d9050600a83613b95565b9150612a4e565b60008167ffffffffffffffff811115612a9d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ac7576020820181803683370190505b5090505b84156123b157612adc600183613bc8565b9150612ae9600a86613c61565b612af4906030613b7d565b60f81b818381518110612b1757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b39600a86613b95565b9450612acb565b805160009081805b82811015612b9b57848181518110612b7057634e487b7160e01b600052603260045260246000fd5b602002602001015161ffff1682612b879190613b7d565b915080612b9381613c46565b915050612b48565b50612710149392505050565b60006001600160e01b0319821663780e9d6360e01b1480610b385750610b3882612f58565b600080612bd8600c5490565b612c02907f0000000000000000000000000000000000000000000000000000000000000000613bc8565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c612c699190613c61565b6000818152600d602052604081205491925090612c87575080612c98565b506000818152600d60205260409020545b600d6000612ca7600186613bc8565b81526020019081526020016000205460001415612cdd57612cc9600184613bc8565b6000838152600d6020526040902055612d0d565b600d6000612cec600186613bc8565b81526020808201929092526040908101600090812054858252600d90935220555b612d15612fa8565b50612d407f000000000000000000000000000000000000000000000000000000000000000082613b7d565b935050505090565b6001600160a01b038316612da357612d9e81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612dc6565b816001600160a01b0316836001600160a01b031614612dc657612dc68382613019565b6001600160a01b038216612ddd57610db7816130b6565b826001600160a01b0316826001600160a01b031614610db757610db7828261318f565b60006127f18284613b95565b60006127f18284613b7d565b612e2283836131d3565b612e2f6000848484612e4b565b610db75760405162461bcd60e51b8152600401610b6890613a82565b60006001600160a01b0384163b15612f4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e8f9033908990889088906004016139a9565b602060405180830381600087803b158015612ea957600080fd5b505af1925050508015612ed9575060408051601f3d908101601f19168201909252612ed6918101906137fc565b60015b612f33573d808015612f07576040519150601f19603f3d011682016040523d82523d6000602084013e612f0c565b606091505b508051612f2b5760405162461bcd60e51b8152600401610b6890613a82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b1565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480612f8957506001600160e01b03198216635b5e139f60e01b145b80610b3857506301ffc9a760e01b6001600160e01b0319831614610b38565b600080612fb3611ded565b116130005760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401610b68565b600c805490600061301083613c46565b91905055905090565b6000600161302684611588565b6130309190613bc8565b600083815260086020526040902054909150808214613083576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906130c890600190613bc8565b6000838152600a6020526040812054600980549394509092849081106130fe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806009838154811061312d57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061317357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061319a83611588565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166132295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b68565b6000818152600360205260409020546001600160a01b03161561328e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b68565b61329a60008383612d48565b6001600160a01b03821660009081526004602052604081208054600192906132c3908490613b7d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461332d90613c0b565b90600052602060002090601f01602090048101928261334f5760008555613395565b82601f1061336857805160ff1916838001178555613395565b82800160010185558215613395579182015b8281111561339557825182559160200191906001019061337a565b506133a192915061349c565b5090565b828054828255906000526020600020908101928215613395579160200282015b828111156133955781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906133c5565b82805482825590600052602060002090600f016010900481019282156133955791602002820160005b8382111561346557833561ffff1683826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613421565b80156134935782816101000a81549061ffff0219169055600201602081600101049283019260010302613465565b50506133a19291505b5b808211156133a1576000815560010161349d565b600067ffffffffffffffff808411156134cc576134cc613ca1565b604051601f8501601f19908116603f011681019082821181831017156134f4576134f4613ca1565b8160405280935085815286868601111561350d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461353e57600080fd5b919050565b60008083601f840112613554578081fd5b50813567ffffffffffffffff81111561356b578182fd5b6020830191508360208260051b850101111561104b57600080fd5b600060208284031215613597578081fd5b6127f182613527565b600080604083850312156135b2578081fd5b6135bb83613527565b91506135c960208401613527565b90509250929050565b6000806000606084860312156135e6578081fd5b6135ef84613527565b92506135fd60208501613527565b9150604084013590509250925092565b60008060008060808587031215613622578081fd5b61362b85613527565b935061363960208601613527565b925060408501359150606085013567ffffffffffffffff81111561365b578182fd5b8501601f8101871361366b578182fd5b61367a878235602084016134b1565b91505092959194509250565b60008060408385031215613698578182fd5b6136a183613527565b915060208301356136b181613cb7565b809150509250929050565b600080604083850312156136ce578182fd5b6136d783613527565b946020939093013593505050565b600080604083850312156136f7578182fd5b61370083613527565b915060208301356001600160601b03811681146136b1578182fd5b6000806020838503121561372d578182fd5b823567ffffffffffffffff811115613743578283fd5b61374f85828601613543565b90969095509350505050565b60008060008060408587031215613770578384fd5b843567ffffffffffffffff80821115613787578586fd5b61379388838901613543565b909650945060208701359150808211156137ab578384fd5b506137b887828801613543565b95989497509550505050565b6000602082840312156137d5578081fd5b81516127f181613cb7565b6000602082840312156137f1578081fd5b81356127f181613cc5565b60006020828403121561380d578081fd5b81516127f181613cc5565b600060208284031215613829578081fd5b813567ffffffffffffffff81111561383f578182fd5b8201601f8101841361384f578182fd5b6123b1848235602084016134b1565b60006020828403121561386f578081fd5b5035919050565b60008060408385031215613888578182fd5b50508035926020909101359150565b600081518084526138af816020860160208601613bdf565b601f01601f19169290920160200192915050565b600081516138d5818560208601613bdf565b9290920192915050565b600080845482600182811c9150808316806138fb57607f831692505b602080841082141561391b57634e487b7160e01b87526022600452602487fd5b81801561392f57600181146139405761396c565b60ff1986168952848901965061396c565b60008b815260209020885b868110156139645781548b82015290850190830161394b565b505084890196505b5050505050506139a061398f61398983602f60f81b815260010190565b866138c3565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139dc90830184613897565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a275783516001600160a01b031683529284019291840191600101613a02565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a2757835161ffff1683529284019291840191600101613a4f565b6020815260006127f16020830184613897565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b60008219821115613b9057613b90613c75565b500190565b600082613ba457613ba4613c8b565b500490565b6000816000190483118215151615613bc357613bc3613c75565b500290565b600082821015613bda57613bda613c75565b500390565b60005b83811015613bfa578181015183820152602001613be2565b83811115610f0b5750506000910152565b600181811c90821680613c1f57607f821691505b60208210811415613c4057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c5a57613c5a613c75565b5060010190565b600082613c7057613c70613c8b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610e5757600080fd5b6001600160e01b031981168114610e5757600080fdfea2646970667358221220f3d1447da3c0aedc0fd4a3edbc5f1b0585e993e9278e9e93b95e6542d3d6b0aa64736f6c63430008040033697066733a2f2f516d58786542506e5a4752455746366a374a4e53714676715a4e73466133704c644855367051455a7039715378570000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063715018a6116101d1578063c683630d11610102578063e14ca353116100a0578063ea798c6d1161006f578063ea798c6d14610ac2578063eba830d814610ad8578063f2fde38b14610af8578063f83d08ba14610b1857600080fd5b8063e14ca35314610a2e578063e1ec629414610a43578063e7b99ec714610a63578063e985e9c514610a7957600080fd5b8063d5abeb01116100dc578063d5abeb01146109b6578063d73fe0aa146109cc578063db8cc8fa146109ee578063dc09e92314610a0e57600080fd5b8063c683630d14610956578063c87b56dd14610976578063d49479eb1461099657600080fd5b80639f181b5e1161016f578063b42fa83d11610149578063b42fa83d146108c0578063b7a34c8a146108d6578063b88d4fde146108f6578063c2ba47441461091657600080fd5b80639f181b5e14610878578063a0712d681461088d578063a22cb465146108a057600080fd5b80638456cb59116101ab5780638456cb59146108195780638da5cb5b1461082e5780638dbe817f1461084c57806395d89b411461086357600080fd5b8063715018a6146107b05780637fa7c50b146107c55780638164c309146107f957600080fd5b80632a55205a116102ab57806355f804b3116102495780635e1045ec116102235780635e1045ec1461073b5780636352211e1461075b5780636c0360eb1461077b57806370a082311461079057600080fd5b806355f804b3146106985780635a9b0b89146106b85780635c975abb1461072357600080fd5b80633f4ba83a116102855780633f4ba83a1461062357806342842e0e1461063857806342966c68146106585780634f6ccce71461067857600080fd5b80632a55205a146105a45780632acc659e146105e35780632f745c591461060357600080fd5b806318160ddd1161031857806322ad0670116102f257806322ad06701461050e578063239c70ae1461052e57806323b872dd1461056257806327f381131461058257600080fd5b806318160ddd146104b95780631c0ce3d3146104ce5780632042e5c2146104ee57600080fd5b806306fdde031161035457806306fdde0314610402578063081812fc14610424578063095ea7b31461045c57806315f91c181461047c57600080fd5b806301ffc9a71461037b57806304634d8d146103b057806306c933d8146103d2575b600080fd5b34801561038757600080fd5b5061039b6103963660046137e0565b610b2d565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb3660046136e5565b610b3e565b005b3480156103de57600080fd5b5061039b6103ed366004613586565b601b6020526000908152604090205460ff1681565b34801561040e57600080fd5b50610417610b7f565b6040516103a79190613a6f565b34801561043057600080fd5b5061044461043f36600461385e565b610c11565b6040516001600160a01b0390911681526020016103a7565b34801561046857600080fd5b506103d06104773660046136bc565b610ca6565b34801561048857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000d6c5b6040519081526020016103a7565b3480156104c557600080fd5b506009546104ab565b3480156104da57600080fd5b506103d06104e936600461385e565b610dbc565b3480156104fa57600080fd5b506103d0610509366004613586565b610deb565b34801561051a57600080fd5b506103d06105293660046136bc565b610e5a565b34801561053a57600080fd5b506104ab7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561056e57600080fd5b506103d061057d3660046135d2565b610f11565b34801561058e57600080fd5b50610597610f43565b6040516103a791906139e6565b3480156105b057600080fd5b506105c46105bf366004613876565b610fa4565b604080516001600160a01b0390931683526020830191909152016103a7565b3480156105ef57600080fd5b506104ab6105fe366004613586565b611052565b34801561060f57600080fd5b506104ab61061e3660046136bc565b6110ce565b34801561062f57600080fd5b506103d0611164565b34801561064457600080fd5b506103d06106533660046135d2565b611198565b34801561066457600080fd5b506103d061067336600461385e565b6111b3565b34801561068457600080fd5b506104ab61069336600461385e565b61122a565b3480156106a457600080fd5b506103d06106b3366004613818565b6112cb565b3480156106c457600080fd5b506106cd611308565b6040516103a79190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b34801561072f57600080fd5b5060005460ff1661039b565b34801561074757600080fd5b506103d061075636600461371b565b6113d8565b34801561076757600080fd5b5061044461077636600461385e565b611483565b34801561078757600080fd5b506104176114fa565b34801561079c57600080fd5b506104ab6107ab366004613586565b611588565b3480156107bc57600080fd5b506103d061160f565b3480156107d157600080fd5b506104ab7f000000000000000000000000000000000000000000000000000000000000001481565b34801561080557600080fd5b506103d0610814366004613586565b611643565b34801561082557600080fd5b506103d0611691565b34801561083a57600080fd5b50600b546001600160a01b0316610444565b34801561085857600080fd5b506015546104ab9081565b34801561086f57600080fd5b506104176116c3565b34801561088457600080fd5b50600c546104ab565b6103d061089b36600461385e565b6116d2565b3480156108ac57600080fd5b506103d06108bb366004613686565b611a5f565b3480156108cc57600080fd5b506104ab60125481565b3480156108e257600080fd5b506103d06108f13660046136bc565b611a6a565b34801561090257600080fd5b506103d061091136600461360d565b611b53565b34801561092257600080fd5b506104ab610931366004613586565b507f000000000000000000000000000000000000000000000000000000000000000a90565b34801561096257600080fd5b5061039b610971366004613586565b611b85565b34801561098257600080fd5b5061041761099136600461385e565b611bc7565b3480156109a257600080fd5b506103d06109b136600461385e565b611c7b565b3480156109c257600080fd5b506104ab60145481565b3480156109d857600080fd5b506109e1611cdd565b6040516103a79190613a33565b3480156109fa57600080fd5b506103d0610a0936600461385e565b611d5c565b348015610a1a57600080fd5b506103d0610a2936600461385e565b611d8b565b348015610a3a57600080fd5b506104ab611ded565b348015610a4f57600080fd5b506103d0610a5e36600461385e565b611e27565b348015610a6f57600080fd5b506104ab60135481565b348015610a8557600080fd5b5061039b610a943660046135a0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ace57600080fd5b506104ab60115481565b348015610ae457600080fd5b506103d0610af336600461375b565b611e89565b348015610b0457600080fd5b506103d0610b13366004613586565b612000565b348015610b2457600080fd5b506103d0612098565b6000610b38826120ca565b92915050565b600b546001600160a01b03163314610b715760405162461bcd60e51b8152600401610b6890613ad4565b60405180910390fd5b610b7b82826120ef565b5050565b606060018054610b8e90613c0b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bba90613c0b565b8015610c075780601f10610bdc57610100808354040283529160200191610c07565b820191906000526020600020905b815481529060010190602001808311610bea57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c8a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b68565b506000908152600560205260409020546001600160a01b031690565b6000610cb182611483565b9050806001600160a01b0316836001600160a01b03161415610d1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b68565b336001600160a01b0382161480610d3b5750610d3b8133610a94565b610dad5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b68565b610db783836121ec565b505050565b600b546001600160a01b03163314610de65760405162461bcd60e51b8152600401610b6890613ad4565b601a55565b600b546001600160a01b03163314610e155760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b0381166000908152601b602052604090205460ff1615610e57576001600160a01b0381166000908152601b60205260409020805460ff191690555b50565b600b546001600160a01b03163314610e845760405162461bcd60e51b8152600401610b6890613ad4565b6000610e8f60095490565b601454909150610e9f8383613b7d565b1115610ee65760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b68565b60015b828111610f0b57610ef98461225a565b80610f0381613c46565b915050610ee9565b50505050565b610f1c335b826122c2565b610f385760405162461bcd60e51b8152600401610b6890613b09565b610db78383836123b9565b60606017805480602002602001604051908101604052809291908181526020018280548015610c0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f7d575050505050905090565b6000828152600f602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611019575060408051808201909152600e546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611038906001600160601b031687613ba9565b6110429190613b95565b91519350909150505b9250929050565b60006001600160a01b03821661109a5760405162461bcd60e51b815260206004820152600d60248201526c06e6f742061646472657373203609c1b6044820152606401610b68565b6110a382611b85565b156110b057505060135490565b6110b982612560565b156110c657505060125490565b505060115490565b60006110d983611588565b821061113b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b68565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600b546001600160a01b0316331461118e5760405162461bcd60e51b8152600401610b6890613ad4565b6111966125de565b565b610db783838360405180602001604052806000815250611b53565b6111bc33610f16565b6112215760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610b68565b610e5781612671565b600061123560095490565b82106112985760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b68565b600982815481106112b957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b546001600160a01b031633146112f55760405162461bcd60e51b8152600401610b6890613ad4565b8051610b7b906010906020840190613321565b6113486040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6113886040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b601154815260125460208201526013546040820152601454606082015260095460808201527f000000000000000000000000000000000000000000000000000000000000000a60c0820152919050565b600b546001600160a01b031633146114025760405162461bcd60e51b8152600401610b6890613ad4565b8060005b81811015610f0b576001601b600086868581811061143457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114499190613586565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061147b81613c46565b915050611406565b6000818152600360205260408120546001600160a01b031680610b385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b68565b6010805461150790613c0b565b80601f016020809104026020016040519081016040528092919081815260200182805461153390613c0b565b80156115805780601f1061155557610100808354040283529160200191611580565b820191906000526020600020905b81548152906001019060200180831161156357829003601f168201915b505050505081565b60006001600160a01b0382166115f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b68565b506001600160a01b031660009081526004602052604090205490565b600b546001600160a01b031633146116395760405162461bcd60e51b8152600401610b6890613ad4565b6111966000612718565b600b546001600160a01b0316331461166d5760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b03166000908152601b60205260409020805460ff19166001179055565b600b546001600160a01b031633146116bb5760405162461bcd60e51b8152600401610b6890613ad4565b61119661276a565b606060028054610b8e90613c0b565b60005460ff16156117185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b68565b601954158061172957504260195411155b6117635760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610b68565b600061176e60095490565b9050600082116117c05760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610b68565b7f000000000000000000000000000000000000000000000000000000000000000a82111561183c5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610b68565b6014546118498383613b7d565b11156118905760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610b68565b600061189b33611b85565b156118a957506013546118c5565b6118b233612560565b156118c057506012546118c5565b506011545b60006118d182856127e5565b9050348111156119185760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b68565b60015b84811161193d5761192b3361225a565b8061193581613c46565b91505061191b565b506016546017546001600160a01b03909116906000805b82811015611a55576119aa6018828154811061198057634e487b7160e01b600052603260045260246000fd5b600091825260209091206010820401548791600f166002026101000a900461ffff166127106127f8565b9150836001600160a01b0316634065da6383601784815481106119dd57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405160e084901b6001600160e01b03191681526001600160a01b0390911660048201526024016000604051808303818588803b158015611a2957600080fd5b505af1158015611a3d573d6000803e3d6000fd5b50505050508080611a4d90613c46565b915050611954565b5050505050505050565b610b7b33838361290a565b600b546001600160a01b03163314611a945760405162461bcd60e51b8152600401610b6890613ad4565b7f000000000000000000000000000000000000000000000000000000000000001481611abf60155490565b611ac99190613b7d565b1115611b175760405162461bcd60e51b815260206004820152601760248201527f416c6c205265736572766564204e4654204d696e7465640000000000000000006044820152606401610b68565b60015b818111610db757611b2f601580546001019055565b611b4183611b3c60155490565b6129d9565b80611b4b81613c46565b915050611b1a565b611b5d33836122c2565b611b795760405162461bcd60e51b8152600401610b6890613b09565b610f0b848484846129f3565b6000601a54600014158015611b9b5750601a5442105b15611ba857506000919050565b506001600160a01b03166000908152601b602052604090205460ff1690565b6000818152600360205260409020546060906001600160a01b0316611c465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b68565b60006010611c5384612a26565b604051602001611c649291906138df565b60408051601f198184030181529190529392505050565b336001600160a01b037f0000000000000000000000006be5e7da4ad8523f9c622544a938f344a1f62cf5161480611cbc5750600b546001600160a01b031633145b611cd85760405162461bcd60e51b8152600401610b6890613b5a565b601355565b60606018805480602002602001604051908101604052809291908181526020018280548015610c0757602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611d1a5790505050505050905090565b600b546001600160a01b03163314611d865760405162461bcd60e51b8152600401610b6890613ad4565b601955565b336001600160a01b037f0000000000000000000000006be5e7da4ad8523f9c622544a938f344a1f62cf5161480611dcc5750600b546001600160a01b031633145b611de85760405162461bcd60e51b8152600401610b6890613b5a565b601255565b6000611df8600c5490565b611e22907f0000000000000000000000000000000000000000000000000000000000000d6c613bc8565b905090565b336001600160a01b037f0000000000000000000000006be5e7da4ad8523f9c622544a938f344a1f62cf5161480611e685750600b546001600160a01b031633145b611e845760405162461bcd60e51b8152600401610b6890613b5a565b601155565b336001600160a01b037f0000000000000000000000006be5e7da4ad8523f9c622544a938f344a1f62cf5161480611eca5750600b546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610b6890613b5a565b82611f225760405162461bcd60e51b815260206004820152600c60248201526b656d7074792070617965657360a01b6044820152606401610b68565b828114611f675760405162461bcd60e51b815260206004820152601360248201527277726f6e67207061796565206e756d6265727360681b6044820152606401610b68565b611fa3828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b4092505050565b611fe05760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073686172657360901b6044820152606401610b68565b611fec601785856133a5565b50611ff9601883836133f8565b5050505050565b600b546001600160a01b0316331461202a5760405162461bcd60e51b8152600401610b6890613ad4565b6001600160a01b03811661208f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b68565b610e5781612718565b600b546001600160a01b031633146120c25760405162461bcd60e51b8152600401610b6890613ad4565b600954601455565b60006001600160e01b0319821663152a902d60e11b1480610b385750610b3882612ba7565b6127106001600160601b038216111561215d5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610b68565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b68565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600e55565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061222182611483565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612264612bcc565b905060008111801561227857506014548111155b6122b85760405162461bcd60e51b81526020600482015260116024820152704d696e74206e6f7420706f737369626c6560781b6044820152606401610b68565b610b7b82826129d9565b6000818152600360205260408120546001600160a01b031661233b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b68565b600061234683611483565b9050806001600160a01b0316846001600160a01b031614806123815750836001600160a01b031661237684610c11565b6001600160a01b0316145b806123b157506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166123cc82611483565b6001600160a01b0316146124305760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b68565b6001600160a01b0382166124925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b68565b61249d838383612d48565b6124a86000826121ec565b6001600160a01b03831660009081526004602052604081208054600192906124d1908490613bc8565b90915550506001600160a01b03821660009081526004602052604081208054600192906124ff908490613b7d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60165460405163288c314960e21b81526001600160a01b038381166004830152600092169063a230c5249060240160206040518083038186803b1580156125a657600080fd5b505afa1580156125ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3891906137c4565b60005460ff166126275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b68565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061267c82611483565b905061268a81600084612d48565b6126956000836121ec565b6001600160a01b03811660009081526004602052604081208054600192906126be908490613bc8565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156127b05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b68565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126543390565b60006127f18284613ba9565b9392505050565b600080821161283c5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610b68565b83612849575060006127f1565b60006128558486613ba9565b9050836128628683613b95565b141561287a576128728382613b95565b9150506127f1565b60006128868487613b95565b905060006128948588613c61565b905060006128a28688613b95565b905060006128b08789613c61565b90506128fd6128c9886128c386856127e5565b90612e00565b6128f76128d686866127e5565b6128f76128e389876127e5565b6128f78d6128f18c8b6127e5565b906127e5565b90612e0c565b9998505050505050505050565b816001600160a01b0316836001600160a01b0316141561296c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b68565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610b7b828260405180602001604052806000815250612e18565b6129fe8484846123b9565b612a0a84848484612e4b565b610f0b5760405162461bcd60e51b8152600401610b6890613a82565b606081612a4a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a745780612a5e81613c46565b9150612a6d9050600a83613b95565b9150612a4e565b60008167ffffffffffffffff811115612a9d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ac7576020820181803683370190505b5090505b84156123b157612adc600183613bc8565b9150612ae9600a86613c61565b612af4906030613b7d565b60f81b818381518110612b1757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b39600a86613b95565b9450612acb565b805160009081805b82811015612b9b57848181518110612b7057634e487b7160e01b600052603260045260246000fd5b602002602001015161ffff1682612b879190613b7d565b915080612b9381613c46565b915050612b48565b50612710149392505050565b60006001600160e01b0319821663780e9d6360e01b1480610b385750610b3882612f58565b600080612bd8600c5490565b612c02907f0000000000000000000000000000000000000000000000000000000000000d6c613bc8565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c612c699190613c61565b6000818152600d602052604081205491925090612c87575080612c98565b506000818152600d60205260409020545b600d6000612ca7600186613bc8565b81526020019081526020016000205460001415612cdd57612cc9600184613bc8565b6000838152600d6020526040902055612d0d565b600d6000612cec600186613bc8565b81526020808201929092526040908101600090812054858252600d90935220555b612d15612fa8565b50612d407f000000000000000000000000000000000000000000000000000000000000001582613b7d565b935050505090565b6001600160a01b038316612da357612d9e81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612dc6565b816001600160a01b0316836001600160a01b031614612dc657612dc68382613019565b6001600160a01b038216612ddd57610db7816130b6565b826001600160a01b0316826001600160a01b031614610db757610db7828261318f565b60006127f18284613b95565b60006127f18284613b7d565b612e2283836131d3565b612e2f6000848484612e4b565b610db75760405162461bcd60e51b8152600401610b6890613a82565b60006001600160a01b0384163b15612f4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e8f9033908990889088906004016139a9565b602060405180830381600087803b158015612ea957600080fd5b505af1925050508015612ed9575060408051601f3d908101601f19168201909252612ed6918101906137fc565b60015b612f33573d808015612f07576040519150601f19603f3d011682016040523d82523d6000602084013e612f0c565b606091505b508051612f2b5760405162461bcd60e51b8152600401610b6890613a82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b1565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b1480612f8957506001600160e01b03198216635b5e139f60e01b145b80610b3857506301ffc9a760e01b6001600160e01b0319831614610b38565b600080612fb3611ded565b116130005760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401610b68565b600c805490600061301083613c46565b91905055905090565b6000600161302684611588565b6130309190613bc8565b600083815260086020526040902054909150808214613083576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906130c890600190613bc8565b6000838152600a6020526040812054600980549394509092849081106130fe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806009838154811061312d57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061317357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061319a83611588565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166132295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b68565b6000818152600360205260409020546001600160a01b03161561328e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b68565b61329a60008383612d48565b6001600160a01b03821660009081526004602052604081208054600192906132c3908490613b7d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461332d90613c0b565b90600052602060002090601f01602090048101928261334f5760008555613395565b82601f1061336857805160ff1916838001178555613395565b82800160010185558215613395579182015b8281111561339557825182559160200191906001019061337a565b506133a192915061349c565b5090565b828054828255906000526020600020908101928215613395579160200282015b828111156133955781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906133c5565b82805482825590600052602060002090600f016010900481019282156133955791602002820160005b8382111561346557833561ffff1683826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613421565b80156134935782816101000a81549061ffff0219169055600201602081600101049283019260010302613465565b50506133a19291505b5b808211156133a1576000815560010161349d565b600067ffffffffffffffff808411156134cc576134cc613ca1565b604051601f8501601f19908116603f011681019082821181831017156134f4576134f4613ca1565b8160405280935085815286868601111561350d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461353e57600080fd5b919050565b60008083601f840112613554578081fd5b50813567ffffffffffffffff81111561356b578182fd5b6020830191508360208260051b850101111561104b57600080fd5b600060208284031215613597578081fd5b6127f182613527565b600080604083850312156135b2578081fd5b6135bb83613527565b91506135c960208401613527565b90509250929050565b6000806000606084860312156135e6578081fd5b6135ef84613527565b92506135fd60208501613527565b9150604084013590509250925092565b60008060008060808587031215613622578081fd5b61362b85613527565b935061363960208601613527565b925060408501359150606085013567ffffffffffffffff81111561365b578182fd5b8501601f8101871361366b578182fd5b61367a878235602084016134b1565b91505092959194509250565b60008060408385031215613698578182fd5b6136a183613527565b915060208301356136b181613cb7565b809150509250929050565b600080604083850312156136ce578182fd5b6136d783613527565b946020939093013593505050565b600080604083850312156136f7578182fd5b61370083613527565b915060208301356001600160601b03811681146136b1578182fd5b6000806020838503121561372d578182fd5b823567ffffffffffffffff811115613743578283fd5b61374f85828601613543565b90969095509350505050565b60008060008060408587031215613770578384fd5b843567ffffffffffffffff80821115613787578586fd5b61379388838901613543565b909650945060208701359150808211156137ab578384fd5b506137b887828801613543565b95989497509550505050565b6000602082840312156137d5578081fd5b81516127f181613cb7565b6000602082840312156137f1578081fd5b81356127f181613cc5565b60006020828403121561380d578081fd5b81516127f181613cc5565b600060208284031215613829578081fd5b813567ffffffffffffffff81111561383f578182fd5b8201601f8101841361384f578182fd5b6123b1848235602084016134b1565b60006020828403121561386f578081fd5b5035919050565b60008060408385031215613888578182fd5b50508035926020909101359150565b600081518084526138af816020860160208601613bdf565b601f01601f19169290920160200192915050565b600081516138d5818560208601613bdf565b9290920192915050565b600080845482600182811c9150808316806138fb57607f831692505b602080841082141561391b57634e487b7160e01b87526022600452602487fd5b81801561392f57600181146139405761396c565b60ff1986168952848901965061396c565b60008b815260209020885b868110156139645781548b82015290850190830161394b565b505084890196505b5050505050506139a061398f61398983602f60f81b815260010190565b866138c3565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139dc90830184613897565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a275783516001600160a01b031683529284019291840191600101613a02565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a2757835161ffff1683529284019291840191600101613a4f565b6020815260006127f16020830184613897565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b60008219821115613b9057613b90613c75565b500190565b600082613ba457613ba4613c8b565b500490565b6000816000190483118215151615613bc357613bc3613c75565b500290565b600082821015613bda57613bda613c75565b500390565b60005b83811015613bfa578181015183820152602001613be2565b83811115610f0b5750506000910152565b600181811c90821680613c1f57607f821691505b60208210811415613c4057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c5a57613c5a613c75565b5060010190565b600082613c7057613c70613c8b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610e5757600080fd5b6001600160e01b031981168114610e5757600080fdfea2646970667358221220f3d1447da3c0aedc0fd4a3edbc5f1b0585e993e9278e9e93b95e6542d3d6b0aa64736f6c63430008040033

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

0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3

-----Decoded View---------------
Arg [0] : _marketAddress (address): 0x7a3cdb2364f92369a602cae81167d0679087e6a3

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3


Deployed ByteCode Sourcemap

70734:269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70481:172;;;;;;;;;;-1:-1:-1;70481:172:0;;;;;:::i;:::-;;:::i;:::-;;;11874:14:1;;11867:22;11849:41;;11837:2;11822:18;70481:172:0;;;;;;;;70327:146;;;;;;;;;;-1:-1:-1;70327:146:0;;;;;:::i;:::-;;:::i;:::-;;63036:52;;;;;;;;;;-1:-1:-1;63036:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22650:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24209:221::-;;;;;;;;;;-1:-1:-1;24209:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9576:32:1;;;9558:51;;9546:2;9531:18;24209:221:0;9513:102:1;23732:411:0;;;;;;;;;;-1:-1:-1;23732:411:0;;;;;:::i;:::-;;:::i;55404:96::-;;;;;;;;;;-1:-1:-1;55476:19:0;55404:96;;;26870:25:1;;;26858:2;26843:18;55404:96:0;26825:76:1;37562:113:0;;;;;;;;;;-1:-1:-1;37650:10:0;:17;37562:113;;70199:120;;;;;;;;;;-1:-1:-1;70199:120:0;;;;;:::i;:::-;;:::i;64766:178::-;;;;;;;;;;-1:-1:-1;64766:178:0;;;;;:::i;:::-;;:::i;67204:288::-;;;;;;;;;;-1:-1:-1;67204:288:0;;;;;:::i;:::-;;:::i;62494:38::-;;;;;;;;;;;;;;;24959:339;;;;;;;;;;-1:-1:-1;24959:339:0;;;;;:::i;:::-;;:::i;69584:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45794:494::-;;;;;;;;;;-1:-1:-1;45794:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10305:32:1;;;10287:51;;10369:2;10354:18;;10347:34;;;;10260:18;45794:494:0;10242:145:1;67688:337:0;;;;;;;;;;-1:-1:-1;67688:337:0;;;;;:::i;:::-;;:::i;37230:256::-;;;;;;;;;;-1:-1:-1;37230:256:0;;;;;:::i;:::-;;:::i;68666:64::-;;;;;;;;;;;;;:::i;25369:185::-;;;;;;;;;;-1:-1:-1;25369:185:0;;;;;:::i;:::-;;:::i;68875:184::-;;;;;;;;;;-1:-1:-1;68875:184:0;;;;;:::i;:::-;;:::i;37752:233::-;;;;;;;;;;-1:-1:-1;37752:233:0;;;;;:::i;:::-;;:::i;68486:104::-;;;;;;;;;;-1:-1:-1;68486:104:0;;;;;:::i;:::-;;:::i;63842:395::-;;;;;;;;;;;;;:::i;:::-;;;;;;26248:4:1;26290:3;26279:9;26275:19;26267:27;;26327:6;26321:13;26310:9;26303:32;26391:4;26383:6;26379:17;26373:24;26366:4;26355:9;26351:20;26344:54;26454:4;26446:6;26442:17;26436:24;26429:4;26418:9;26414:20;26407:54;26517:4;26509:6;26505:17;26499:24;26492:4;26481:9;26477:20;26470:54;26580:4;26572:6;26568:17;26562:24;26555:4;26544:9;26540:20;26533:54;26643:4;26635:6;26631:17;26625:24;26618:4;26607:9;26603:20;26596:54;26706:4;26698:6;26694:17;26688:24;26681:4;26670:9;26666:20;26659:54;26257:462;;;;;52061:86:0;;;;;;;;;;-1:-1:-1;52108:4:0;52132:7;;;52061:86;;64391:235;;;;;;;;;;-1:-1:-1;64391:235:0;;;;;:::i;:::-;;:::i;22344:239::-;;;;;;;;;;-1:-1:-1;22344:239:0;;;;;:::i;:::-;;:::i;62260:21::-;;;;;;;;;;;;;:::i;22074:208::-;;;;;;;;;;-1:-1:-1;22074:208:0;;;;;:::i;:::-;;:::i;50106:103::-;;;;;;;;;;;;;:::i;62451:36::-;;;;;;;;;;;;;;;64638:120;;;;;;;;;;-1:-1:-1;64638:120:0;;;;;:::i;:::-;;:::i;68598:60::-;;;;;;;;;;;;;:::i;49455:87::-;;;;;;;;;;-1:-1:-1;49528:6:0;;-1:-1:-1;;;;;49528:6:0;49455:87;;62541:41;;;;;;;;;;-1:-1:-1;62541:41:0;;;;;;22819:104;;;;;;;;;;;;;:::i;55678:80::-;;;;;;;;;;-1:-1:-1;55742:11:0;;55678:80;;65525:1311;;;;;;:::i;:::-;;:::i;24502:155::-;;;;;;;;;;-1:-1:-1;24502:155:0;;;;;:::i;:::-;;:::i;62327:25::-;;;;;;;;;;;;;;;;66844:352;;;;;;;;;;-1:-1:-1;66844:352:0;;;;;:::i;:::-;;:::i;25625:328::-;;;;;;;;;;-1:-1:-1;25625:328:0;;;;;:::i;:::-;;:::i;68059:94::-;;;;;;;;;;-1:-1:-1;68059:94:0;;;;;:::i;:::-;-1:-1:-1;68132:13:0;;68059:94;65278:239;;;;;;;;;;-1:-1:-1;65278:239:0;;;;;:::i;:::-;;:::i;68161:317::-;;;;;;;;;;-1:-1:-1;68161:317:0;;;;;:::i;:::-;;:::i;65166:104::-;;;;;;;;;;-1:-1:-1;65166:104:0;;;;;:::i;:::-;;:::i;62420:24::-;;;;;;;;;;;;;;;;69683:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;70073:114::-;;;;;;;;;;-1:-1:-1;70073:114:0;;;;;:::i;:::-;;:::i;65060:98::-;;;;;;;;;;-1:-1:-1;65060:98:0;;;;;:::i;:::-;;:::i;55855:113::-;;;;;;;;;;;;;:::i;64952:100::-;;;;;;;;;;-1:-1:-1;64952:100:0;;;;;:::i;:::-;;:::i;62359:28::-;;;;;;;;;;;;;;;;24728:164;;;;;;;;;;-1:-1:-1;24728:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24849:25:0;;;24825:4;24849:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24728:164;62294:26;;;;;;;;;;;;;;;;69154:422;;;;;;;;;;-1:-1:-1;69154:422:0;;;;;:::i;:::-;;:::i;50364:201::-;;;;;;;;;;-1:-1:-1;50364:201:0;;;;;:::i;:::-;;:::i;69067:79::-;;;;;;;;;;;;;:::i;70481:172::-;70585:4;70609:36;70633:11;70609:23;:36::i;:::-;70602:43;70481:172;-1:-1:-1;;70481:172:0:o;70327:146::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;;;;;;;;;70423:42:::1;70442:8;70452:12;70423:18;:42::i;:::-;70327:146:::0;;:::o;22650:100::-;22704:13;22737:5;22730:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22650:100;:::o;24209:221::-;24285:7;27552:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27552:16:0;24305:73;;;;-1:-1:-1;;;24305:73:0;;20292:2:1;24305:73:0;;;20274:21:1;20331:2;20311:18;;;20304:30;20370:34;20350:18;;;20343:62;-1:-1:-1;;;20421:18:1;;;20414:42;20473:19;;24305:73:0;20264:234:1;24305:73:0;-1:-1:-1;24398:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24398:24:0;;24209:221::o;23732:411::-;23813:13;23829:23;23844:7;23829:14;:23::i;:::-;23813:39;;23877:5;-1:-1:-1;;;;;23871:11:0;:2;-1:-1:-1;;;;;23871:11:0;;;23863:57;;;;-1:-1:-1;;;23863:57:0;;22517:2:1;23863:57:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:34;22575:18;;;22568:62;-1:-1:-1;;;22646:18:1;;;22639:31;22687:19;;23863:57:0;22489:223:1;23863:57:0;16991:10;-1:-1:-1;;;;;23955:21:0;;;;:62;;-1:-1:-1;23980:37:0;23997:5;16991:10;24728:164;:::i;23980:37::-;23933:168;;;;-1:-1:-1;;;23933:168:0;;17583:2:1;23933:168:0;;;17565:21:1;17622:2;17602:18;;;17595:30;17661:34;17641:18;;;17634:62;17732:26;17712:18;;;17705:54;17776:19;;23933:168:0;17555:246:1;23933:168:0;24114:21;24123:2;24127:7;24114:8;:21::i;:::-;23732:411;;;:::o;70199:120::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;70280:18:::1;:31:::0;70199:120::o;64766:178::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64841:30:0;::::1;;::::0;;;:20:::1;:30;::::0;;;;;::::1;;64837:100;;;-1:-1:-1::0;;;;;64895:30:0;::::1;;::::0;;;:20:::1;:30;::::0;;;;64888:37;;-1:-1:-1;;64888:37:0::1;::::0;;64837:100:::1;64766:178:::0;:::o;67204:288::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;67283:14:::1;67300:13;37650:10:::0;:17;;37562:113;67300:13:::1;67354:9;::::0;67283:30;;-1:-1:-1;67333:16:0::1;67342:7:::0;67283:30;67333:16:::1;:::i;:::-;67332:31;;67324:66;;;::::0;-1:-1:-1;;;67324:66:0;;19175:2:1;67324:66:0::1;::::0;::::1;19157:21:1::0;19214:2;19194:18;;;19187:30;-1:-1:-1;;;19233:18:1;;;19226:52;19295:18;;67324:66:0::1;19147:172:1::0;67324:66:0::1;67418:1;67401:84;67426:7;67421:1;:12;67401:84;;67455:18;67469:3;67455:13;:18::i;:::-;67435:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67401:84;;;;49746:1;67204:288:::0;;:::o;24959:339::-;25154:41;16991:10;25173:12;25187:7;25154:18;:41::i;:::-;25146:103;;;;-1:-1:-1;;;25146:103:0;;;;;;;:::i;:::-;25262:28;25272:4;25278:2;25282:7;25262:9;:28::i;69584:91::-;69625:16;69661:6;69654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69654:13:0;;;;;;;;;;;;;;;;;;;;;;69584:91;:::o;45794:494::-;45938:7;46001:27;;;:17;:27;;;;;;;;45972:56;;;;;;;;;-1:-1:-1;;;;;45972:56:0;;;;;-1:-1:-1;;;45972:56:0;;;-1:-1:-1;;;;;45972:56:0;;;;;;;;45938:7;;46041:92;;-1:-1:-1;46092:29:0;;;;;;;;;46102:19;46092:29;-1:-1:-1;;;;;46092:29:0;;;;-1:-1:-1;;;46092:29:0;;-1:-1:-1;;;;;46092:29:0;;;;;46041:92;46183:23;;;;46145:21;;46654:5;;46170:36;;-1:-1:-1;;;;;46170:36:0;:10;:36;:::i;:::-;46169:58;;;;:::i;:::-;46248:16;;;-1:-1:-1;46145:82:0;;-1:-1:-1;;45794:494:0;;;;;;:::o;67688:337::-;67745:7;-1:-1:-1;;;;;67773:22:0;;67765:48;;;;-1:-1:-1;;;67765:48:0;;21827:2:1;67765:48:0;;;21809:21:1;21866:2;21846:18;;;21839:30;-1:-1:-1;;;21885:18:1;;;21878:43;21938:18;;67765:48:0;21799:163:1;67765:48:0;67828:21;67840:8;67828:11;:21::i;:::-;67824:74;;;-1:-1:-1;;67873:13:0;;;67688:337::o;67824:74::-;67914:27;67932:8;67914:17;:27::i;:::-;67910:77;;;-1:-1:-1;;67965:10:0;;;67688:337::o;67910:77::-;-1:-1:-1;;68006:11:0;;;67688:337::o;37230:256::-;37327:7;37363:23;37380:5;37363:16;:23::i;:::-;37355:5;:31;37347:87;;;;-1:-1:-1;;;37347:87:0;;13371:2:1;37347:87:0;;;13353:21:1;13410:2;13390:18;;;13383:30;13449:34;13429:18;;;13422:62;-1:-1:-1;;;13500:18:1;;;13493:41;13551:19;;37347:87:0;13343:233:1;37347:87:0;-1:-1:-1;;;;;;37452:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37230:256::o;68666:64::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;68712:10:::1;:8;:10::i;:::-;68666:64::o:0;25369:185::-;25507:39;25524:4;25530:2;25534:7;25507:39;;;;;;;;;;;;:16;:39::i;68875:184::-;68932:41;16991:10;68951:12;16911:98;68932:41;68924:102;;;;-1:-1:-1;;;68924:102:0;;24848:2:1;68924:102:0;;;24830:21:1;24887:2;24867:18;;;24860:30;24926:34;24906:18;;;24899:62;-1:-1:-1;;;24977:18:1;;;24970:46;25033:19;;68924:102:0;24820:238:1;68924:102:0;69037:14;69043:7;69037:5;:14::i;37752:233::-;37827:7;37863:30;37650:10;:17;;37562:113;37863:30;37855:5;:38;37847:95;;;;-1:-1:-1;;;37847:95:0;;23684:2:1;37847:95:0;;;23666:21:1;23723:2;23703:18;;;23696:30;23762:34;23742:18;;;23735:62;-1:-1:-1;;;23813:18:1;;;23806:42;23865:19;;37847:95:0;23656:234:1;37847:95:0;37960:10;37971:5;37960:17;;;;;;-1:-1:-1;;;37960:17:0;;;;;;;;;;;;;;;;;37953:24;;37752:233;;;:::o;68486:104::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;68561:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;63842:395::-:0;63882:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63882:12:0;63907:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63907:21:0;63962:11;;63939:34;;64006:10;;63984:19;;;:32;64052:13;;64027:22;;;:38;64097:9;;64076:18;;;:30;37650:10;:17;64117:20;;;:36;64188:13;64164:21;;;:37;64117:8;63842:395;-1:-1:-1;63842:395:0:o;64391:235::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;64483:10;64472:8:::1;64511:100;64531:3;64527:1;:7;64511:100;;;64595:4;64557:20;:35;64578:10;;64589:1;64578:13;;;;;-1:-1:-1::0;;;64578:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64557:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64557:35:0;:42;;-1:-1:-1;;64557:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64536:4;::::1;::::0;::::1;:::i;:::-;;;;64511:100;;22344:239:::0;22416:7;22452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22452:16:0;22487:19;22479:73;;;;-1:-1:-1;;;22479:73:0;;18765:2:1;22479:73:0;;;18747:21:1;18804:2;18784:18;;;18777:30;18843:34;18823:18;;;18816:62;-1:-1:-1;;;18894:18:1;;;18887:39;18943:19;;22479:73:0;18737:231:1;62260:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22074:208::-;22146:7;-1:-1:-1;;;;;22174:19:0;;22166:74;;;;-1:-1:-1;;;22166:74:0;;18354:2:1;22166:74:0;;;18336:21:1;18393:2;18373:18;;;18366:30;18432:34;18412:18;;;18405:62;-1:-1:-1;;;18483:18:1;;;18476:40;18533:19;;22166:74:0;18326:232:1;22166:74:0;-1:-1:-1;;;;;;22258:16:0;;;;;:9;:16;;;;;;;22074:208::o;50106:103::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;50171:30:::1;50198:1;50171:18;:30::i;64638:120::-:0;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64713:30:0::1;;::::0;;;:20:::1;:30;::::0;;;;:37;;-1:-1:-1;;64713:37:0::1;64746:4;64713:37;::::0;;64638:120::o;68598:60::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;68642:8:::1;:6;:8::i;22819:104::-:0;22875:13;22908:7;22901:14;;;;;:::i;65525:1311::-;52108:4;52132:7;;;52386:9;52378:38;;;;-1:-1:-1;;;52378:38:0;;17238:2:1;52378:38:0;;;17220:21:1;17277:2;17257:18;;;17250:30;-1:-1:-1;;;17296:18:1;;;17289:46;17352:18;;52378:38:0;17210:166:1;52378:38:0;65608:15:::1;::::0;:20;;:58:::1;;;65651:15;65632;;:34;;65608:58;65600:82;;;::::0;-1:-1:-1;;;65600:82:0;;24508:2:1;65600:82:0::1;::::0;::::1;24490:21:1::0;24547:2;24527:18;;;24520:30;-1:-1:-1;;;24566:18:1;;;24559:41;24617:18;;65600:82:0::1;24480:161:1::0;65600:82:0::1;65695:14;65712:13;37650:10:::0;:17;;37562:113;65712:13:::1;65695:30;;65758:1;65744:11;:15;65736:55;;;::::0;-1:-1:-1;;;65736:55:0;;25956:2:1;65736:55:0::1;::::0;::::1;25938:21:1::0;25995:2;25975:18;;;25968:30;26034:29;26014:18;;;26007:57;26081:18;;65736:55:0::1;25928:177:1::0;65736:55:0::1;65839:13;65824:11;:28;;65802:114;;;::::0;-1:-1:-1;;;65802:114:0;;19526:2:1;65802:114:0::1;::::0;::::1;19508:21:1::0;19565:2;19545:18;;;19538:30;19604:34;19584:18;;;19577:62;-1:-1:-1;;;19655:18:1;;;19648:34;19699:19;;65802:114:0::1;19498:226:1::0;65802:114:0::1;65961:9;::::0;65936:20:::1;65945:11:::0;65936:6;:20:::1;:::i;:::-;65935:35;;65927:70;;;::::0;-1:-1:-1;;;65927:70:0;;19175:2:1;65927:70:0::1;::::0;::::1;19157:21:1::0;19214:2;19194:18;;;19187:30;-1:-1:-1;;;19233:18:1;;;19226:52;19295:18;;65927:70:0::1;19147:172:1::0;65927:70:0::1;66010:12;66037:23;66049:10;66037:11;:23::i;:::-;66033:272;;;-1:-1:-1::0;66084:13:0::1;::::0;66033:272:::1;;;66148:29;66166:10;66148:17;:29::i;:::-;66144:146;;;-1:-1:-1::0;66205:10:0::1;::::0;66144:146:::1;;;-1:-1:-1::0;66263:11:0::1;::::0;66144:146:::1;66317:17;66337:21;:4:::0;66346:11;66337:8:::1;:21::i;:::-;66317:41;;66392:9;66379;:22;;66371:53;;;::::0;-1:-1:-1;;;66371:53:0;;22919:2:1;66371:53:0::1;::::0;::::1;22901:21:1::0;22958:2;22938:18;;;22931:30;-1:-1:-1;;;22977:18:1;;;22970:48;23035:18;;66371:53:0::1;22891:168:1::0;66371:53:0::1;66454:1;66437:95;66462:11;66457:1;:16;66437:95;;66495:25;66509:10;66495:13;:25::i;:::-;66475:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66437:95;;;-1:-1:-1::0;66575:13:0::1;::::0;66614:6:::1;:13:::0;-1:-1:-1;;;;;66575:13:0;;::::1;::::0;66552::::1;::::0;66663:164:::1;66686:3;66682:1;:7;66663:164;;;66721:34;66738:6;66745:1;66738:9;;;;;;-1:-1:-1::0;;;66738:9:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;66721;;66738;;::::1;;;;::::0;::::1;;;66749:5;66721:16;:34::i;:::-;66712:43;;66770:6;-1:-1:-1::0;;;;;66770:18:0::1;;66797:6;66805;66812:1;66805:9;;;;;;-1:-1:-1::0;;;66805:9:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;66770:45:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;66770:45:0;;;-1:-1:-1;;;;;66805:9:0;;::::1;66770:45;::::0;::::1;9558:51:1::0;9531:18;;66770:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;66691:4;;;;;:::i;:::-;;;;66663:164;;;;52427:1;;;;;;65525:1311:::0;:::o;24502:155::-;24597:52;16991:10;24630:8;24640;24597:18;:52::i;66844:352::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;66982:11:::1;66966;66936:27;:17;54219:14:::0;;54127:114;66936:27:::1;:41;;;;:::i;:::-;66935:58;;66927:94;;;::::0;-1:-1:-1;;;66927:94:0;;13019:2:1;66927:94:0::1;::::0;::::1;13001:21:1::0;13058:2;13038:18;;;13031:30;13097:25;13077:18;;;13070:53;13140:18;;66927:94:0::1;12991:173:1::0;66927:94:0::1;67049:1;67032:157;67057:11;67052:1;:16;67032:157;;67090:29;:17;54338:19:::0;;54356:1;54338:19;;;54249:127;67090:29:::1;67134:43;67144:3;67149:27;:17;54219:14:::0;;54127:114;67149:27:::1;67134:9;:43::i;:::-;67070:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67032:157;;25625:328:::0;25800:41;16991:10;25833:7;25800:18;:41::i;:::-;25792:103;;;;-1:-1:-1;;;25792:103:0;;;;;;;:::i;:::-;25906:39;25920:4;25926:2;25930:7;25939:5;25906:13;:39::i;65278:239::-;65337:4;65358:18;;65380:1;65358:23;;:63;;;;;65403:18;;65385:15;:36;65358:63;65354:108;;;-1:-1:-1;65445:5:0;;65278:239;-1:-1:-1;65278:239:0:o;65354:108::-;-1:-1:-1;;;;;;65479:30:0;;;;;:20;:30;;;;;;;;;65278:239::o;68161:317::-;27528:4;27552:16;;;:7;:16;;;;;;68232:13;;-1:-1:-1;;;;;27552:16:0;68256:76;;;;-1:-1:-1;;;68256:76:0;;21411:2:1;68256:76:0;;;21393:21:1;21450:2;21430:18;;;21423:30;21489:34;21469:18;;;21462:62;-1:-1:-1;;;21540:18:1;;;21533:45;21595:19;;68256:76:0;21383:237:1;68256:76:0;68343:23;68393:7;68407:26;68424:8;68407:16;:26::i;:::-;68376:66;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68376:66:0;;;;;;;;;;68161:317;-1:-1:-1;;;68161:317:0:o;65166:104::-;63145:10;-1:-1:-1;;;;;63159:15:0;63145:29;;;:54;;-1:-1:-1;49528:6:0;;-1:-1:-1;;;;;49528:6:0;63178:10;:21;63145:54;63137:76;;;;-1:-1:-1;;;63137:76:0;;;;;;;:::i;:::-;65241:13:::1;:21:::0;65166:104::o;69683:90::-;69724:15;69759:6;69752:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69683:90;:::o;70073:114::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;70151:15:::1;:28:::0;70073:114::o;65060:98::-;63145:10;-1:-1:-1;;;;;63159:15:0;63145:29;;;:54;;-1:-1:-1;49528:6:0;;-1:-1:-1;;;;;49528:6:0;63178:10;:21;63145:54;63137:76;;;;-1:-1:-1;;;63137:76:0;;;;;;;:::i;:::-;65132:10:::1;:18:::0;65060:98::o;55855:113::-;55907:7;55951:12;55742:11;;;55678:80;55951:12;55928:35;;55476:19;55928:35;:::i;:::-;55921:42;;55855:113;:::o;64952:100::-;63145:10;-1:-1:-1;;;;;63159:15:0;63145:29;;;:54;;-1:-1:-1;49528:6:0;;-1:-1:-1;;;;;49528:6:0;63178:10;:21;63145:54;63137:76;;;;-1:-1:-1;;;63137:76:0;;;;;;;:::i;:::-;65025:11:::1;:19:::0;64952:100::o;69154:422::-;63145:10;-1:-1:-1;;;;;63159:15:0;63145:29;;;:54;;-1:-1:-1;49528:6:0;;-1:-1:-1;;;;;49528:6:0;63178:10;:21;63145:54;63137:76;;;;-1:-1:-1;;;63137:76:0;;;;;;;:::i;:::-;69283:22;69275:47:::1;;;::::0;-1:-1:-1;;;69275:47:0;;16897:2:1;69275:47:0::1;::::0;::::1;16879:21:1::0;16936:2;16916:18;;;16909:30;-1:-1:-1;;;16955:18:1;;;16948:42;17007:18;;69275:47:0::1;16869:162:1::0;69275:47:0::1;69341:38:::0;;::::1;69333:70;;;::::0;-1:-1:-1;;;69333:70:0;;22169:2:1;69333:70:0::1;::::0;::::1;22151:21:1::0;22208:2;22188:18;;;22181:30;-1:-1:-1;;;22227:18:1;;;22220:49;22286:18;;69333:70:0::1;22141:169:1::0;69333:70:0::1;69429:27;69445:10;;69429:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;69429:15:0::1;::::0;-1:-1:-1;;;69429:27:0:i:1;:::-;69424:85;;69473:24;::::0;-1:-1:-1;;;69473:24:0;;12327:2:1;69473:24:0::1;::::0;::::1;12309:21:1::0;12366:2;12346:18;;;12339:30;-1:-1:-1;;;12385:18:1;;;12378:44;12439:18;;69473:24:0::1;12299:164:1::0;69424:85:0::1;69519:19;:6;69528:10:::0;;69519:19:::1;:::i;:::-;-1:-1:-1::0;69549:19:0::1;:6;69558:10:::0;;69549:19:::1;:::i;:::-;;69154:422:::0;;;;:::o;50364:201::-;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50453:22:0;::::1;50445:73;;;::::0;-1:-1:-1;;;50445:73:0;;14202:2:1;50445:73:0::1;::::0;::::1;14184:21:1::0;14241:2;14221:18;;;14214:30;14280:34;14260:18;;;14253:62;-1:-1:-1;;;14331:18:1;;;14324:36;14377:19;;50445:73:0::1;14174:228:1::0;50445:73:0::1;50529:28;50548:8;50529:18;:28::i;69067:79::-:0;49528:6;;-1:-1:-1;;;;;49528:6:0;16991:10;49675:23;49667:68;;;;-1:-1:-1;;;49667:68:0;;;;;;;:::i;:::-;37650:10;:17;69113:9:::1;:25:::0;69067:79::o;45524:215::-;45626:4;-1:-1:-1;;;;;;45650:41:0;;-1:-1:-1;;;45650:41:0;;:81;;;45695:36;45719:11;45695:23;:36::i;46938:332::-;46654:5;-1:-1:-1;;;;;47041:33:0;;;;47033:88;;;;-1:-1:-1;;;47033:88:0;;24097:2:1;47033:88:0;;;24079:21:1;24136:2;24116:18;;;24109:30;24175:34;24155:18;;;24148:62;-1:-1:-1;;;24226:18:1;;;24219:40;24276:19;;47033:88:0;24069:232:1;47033:88:0;-1:-1:-1;;;;;47140:22:0;;47132:60;;;;-1:-1:-1;;;47132:60:0;;25602:2:1;47132:60:0;;;25584:21:1;25641:2;25621:18;;;25614:30;25680:27;25660:18;;;25653:55;25725:18;;47132:60:0;25574:175:1;47132:60:0;47227:35;;;;;;;;;-1:-1:-1;;;;;47227:35:0;;;;;;-1:-1:-1;;;;;47227:35:0;;;;;;;;;;-1:-1:-1;;;47205:57:0;;;;:19;:57;46938:332::o;31609:174::-;31684:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31684:29:0;-1:-1:-1;;;;;31684:29:0;;;;;;;;:24;;31738:23;31684:24;31738:14;:23::i;:::-;-1:-1:-1;;;;;31729:46:0;;;;;;;;;;;31609:174;;:::o;67497:159::-;67545:10;67558:11;:9;:11::i;:::-;67545:24;;67587:1;67582:2;:6;:25;;;;;67598:9;;67592:2;:15;;67582:25;67574:55;;;;-1:-1:-1;;;67574:55:0;;18008:2:1;67574:55:0;;;17990:21:1;18047:2;18027:18;;;18020:30;-1:-1:-1;;;18066:18:1;;;18059:47;18123:18;;67574:55:0;17980:167:1;67574:55:0;67634:17;67644:2;67648;67634:9;:17::i;27757:348::-;27850:4;27552:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27552:16:0;27867:73;;;;-1:-1:-1;;;27867:73:0;;16484:2:1;27867:73:0;;;16466:21:1;16523:2;16503:18;;;16496:30;16562:34;16542:18;;;16535:62;-1:-1:-1;;;16613:18:1;;;16606:42;16665:19;;27867:73:0;16456:234:1;27867:73:0;27951:13;27967:23;27982:7;27967:14;:23::i;:::-;27951:39;;28020:5;-1:-1:-1;;;;;28009:16:0;:7;-1:-1:-1;;;;;28009:16:0;;:51;;;;28053:7;-1:-1:-1;;;;;28029:31:0;:20;28041:7;28029:11;:20::i;:::-;-1:-1:-1;;;;;28029:31:0;;28009:51;:87;;;-1:-1:-1;;;;;;24849:25:0;;;24825:4;24849:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28064:32;28001:96;27757:348;-1:-1:-1;;;;27757:348:0:o;30866:625::-;31025:4;-1:-1:-1;;;;;30998:31:0;:23;31013:7;30998:14;:23::i;:::-;-1:-1:-1;;;;;30998:31:0;;30990:81;;;;-1:-1:-1;;;30990:81:0;;14609:2:1;30990:81:0;;;14591:21:1;14648:2;14628:18;;;14621:30;14687:34;14667:18;;;14660:62;-1:-1:-1;;;14738:18:1;;;14731:35;14783:19;;30990:81:0;14581:227:1;30990:81:0;-1:-1:-1;;;;;31090:16:0;;31082:65;;;;-1:-1:-1;;;31082:65:0;;15372:2:1;31082:65:0;;;15354:21:1;15411:2;15391:18;;;15384:30;15450:34;15430:18;;;15423:62;-1:-1:-1;;;15501:18:1;;;15494:34;15545:19;;31082:65:0;15344:226:1;31082:65:0;31160:39;31181:4;31187:2;31191:7;31160:20;:39::i;:::-;31264:29;31281:1;31285:7;31264:8;:29::i;:::-;-1:-1:-1;;;;;31306:15:0;;;;;;:9;:15;;;;;:20;;31325:1;;31306:15;:20;;31325:1;;31306:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31337:13:0;;;;;;:9;:13;;;;;:18;;31354:1;;31337:13;:18;;31354:1;;31337:18;:::i;:::-;;;;-1:-1:-1;;31366:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31366:21:0;-1:-1:-1;;;;;31366:21:0;;;;;;;;;31405:27;;31366:16;;31405:27;;;;;;;23732:411;;;:::o;64245:138::-;64342:13;;64335:40;;-1:-1:-1;;;64335:40:0;;-1:-1:-1;;;;;9576:32:1;;;64335:40:0;;;9558:51:1;64311:4:0;;64342:13;;64335:30;;9531:18:1;;64335:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53120:120::-;52108:4;52132:7;;;52656:41;;;;-1:-1:-1;;;52656:41:0;;12670:2:1;52656:41:0;;;12652:21:1;12709:2;12689:18;;;12682:30;-1:-1:-1;;;12728:18:1;;;12721:50;12788:18;;52656:41:0;12642:170:1;52656:41:0;53189:5:::1;53179:15:::0;;-1:-1:-1;;53179:15:0::1;::::0;;53210:22:::1;16991:10:::0;53219:12:::1;53210:22;::::0;-1:-1:-1;;;;;9576:32:1;;;9558:51;;9546:2;9531:18;53210:22:0::1;;;;;;;53120:120::o:0;30109:420::-;30169:13;30185:23;30200:7;30185:14;:23::i;:::-;30169:39;;30221:48;30242:5;30257:1;30261:7;30221:20;:48::i;:::-;30310:29;30327:1;30331:7;30310:8;:29::i;:::-;-1:-1:-1;;;;;30352:16:0;;;;;;:9;:16;;;;;:21;;30372:1;;30352:16;:21;;30372:1;;30352:21;:::i;:::-;;;;-1:-1:-1;;30391:16:0;;;;:7;:16;;;;;;30384:23;;-1:-1:-1;;;;;;30384:23:0;;;30425:36;30399:7;;30391:16;-1:-1:-1;;;;;30425:36:0;;;;;30391:16;;30425:36;70327:146;;:::o;50725:191::-;50818:6;;;-1:-1:-1;;;;;50835:17:0;;;-1:-1:-1;;;;;;50835:17:0;;;;;;;50868:40;;50818:6;;;50835:17;50818:6;;50868:40;;50799:16;;50868:40;50725:191;;:::o;52861:118::-;52108:4;52132:7;;;52386:9;52378:38;;;;-1:-1:-1;;;52378:38:0;;17238:2:1;52378:38:0;;;17220:21:1;17277:2;17257:18;;;17250:30;-1:-1:-1;;;17296:18:1;;;17289:46;17352:18;;52378:38:0;17210:166:1;52378:38:0;52921:7:::1;:14:::0;;-1:-1:-1;;52921:14:0::1;52931:4;52921:14;::::0;;52951:20:::1;52958:12;16991:10:::0;;16911:98;59686;59744:7;59771:5;59775:1;59771;:5;:::i;:::-;59764:12;59686:98;-1:-1:-1;;;59686:98:0:o;61069:669::-;61141:7;61173:1;61169;:5;61161:34;;;;-1:-1:-1;;;61161:34:0;;20705:2:1;61161:34:0;;;20687:21:1;20744:2;20724:18;;;20717:30;-1:-1:-1;;;20763:18:1;;;20756:46;20819:18;;61161:34:0;20677:166:1;61161:34:0;61212:6;61208:20;;-1:-1:-1;61227:1:0;61220:8;;61208:20;61239:10;61252:5;61256:1;61252;:5;:::i;:::-;61239:18;-1:-1:-1;61282:1:0;61272:6;61277:1;61239:18;61272:6;:::i;:::-;:11;61268:107;;;61357:6;61362:1;61357:2;:6;:::i;:::-;61350:13;;;;;61268:107;61447:9;61459:5;61463:1;61459;:5;:::i;:::-;61447:17;-1:-1:-1;61475:9:0;61487:5;61491:1;61487;:5;:::i;:::-;61475:17;-1:-1:-1;61582:9:0;61594:5;61598:1;61594;:5;:::i;:::-;61582:17;-1:-1:-1;61610:9:0;61622:5;61626:1;61622;:5;:::i;:::-;61610:17;-1:-1:-1;61664:66:0;61714:15;61727:1;61714:8;:1;61610:17;61714:5;:8::i;:::-;:12;;:15::i;:::-;61664:45;61700:8;:1;61706;61700:5;:8::i;:::-;61664:31;61686:8;:1;61692;61686:5;:8::i;:::-;61665:15;61678:1;61665:8;:1;61671;61665:5;:8::i;:::-;:12;;:15::i;:::-;61664:21;;:31::i;:66::-;61657:73;61069:669;-1:-1:-1;;;;;;;;;61069:669:0:o;31925:315::-;32080:8;-1:-1:-1;;;;;32071:17:0;:5;-1:-1:-1;;;;;32071:17:0;;;32063:55;;;;-1:-1:-1;;;32063:55:0;;15777:2:1;32063:55:0;;;15759:21:1;15816:2;15796:18;;;15789:30;15855:27;15835:18;;;15828:55;15900:18;;32063:55:0;15749:175:1;32063:55:0;-1:-1:-1;;;;;32129:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32129:46:0;;;;;;;;;;32191:41;;11849::1;;;32191::0;;11822:18:1;32191:41:0;;;;;;;31925:315;;;:::o;28447:110::-;28523:26;28533:2;28537:7;28523:26;;;;;;;;;;;;:9;:26::i;26835:315::-;26992:28;27002:4;27008:2;27012:7;26992:9;:28::i;:::-;27039:48;27062:4;27068:2;27072:7;27081:5;27039:22;:48::i;:::-;27031:111;;;;-1:-1:-1;;;27031:111:0;;;;;;;:::i;17498:723::-;17554:13;17775:10;17771:53;;-1:-1:-1;;17802:10:0;;;;;;;;;;;;-1:-1:-1;;;17802:10:0;;;;;17498:723::o;17771:53::-;17849:5;17834:12;17890:78;17897:9;;17890:78;;17923:8;;;;:::i;:::-;;-1:-1:-1;17946:10:0;;-1:-1:-1;17954:2:0;17946:10;;:::i;:::-;;;17890:78;;;17978:19;18010:6;18000:17;;;;;;-1:-1:-1;;;18000:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18000:17:0;;17978:39;;18028:154;18035:10;;18028:154;;18062:11;18072:1;18062:11;;:::i;:::-;;-1:-1:-1;18131:10:0;18139:2;18131:5;:10;:::i;:::-;18118:24;;:2;:24;:::i;:::-;18105:39;;18088:6;18095;18088:14;;;;;;-1:-1:-1;;;18088:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18088:56:0;;;;;;;;-1:-1:-1;18159:11:0;18168:2;18159:11;;:::i;:::-;;;18028:154;;69781:284;69883:14;;69853:4;;;;69936:84;69959:3;69955:1;:7;69936:84;;;69998:7;70006:1;69998:10;;;;;;-1:-1:-1;;;69998:10:0;;;;;;;;;;;;;;;69985:23;;;;;;;:::i;:::-;;-1:-1:-1;69964:4:0;;;;:::i;:::-;;;;69936:84;;;-1:-1:-1;70052:5:0;70039:18;;69781:284;-1:-1:-1;;;69781:284:0:o;36922:224::-;37024:4;-1:-1:-1;;;;;;37048:50:0;;-1:-1:-1;;;37048:50:0;;:90;;;37102:36;37126:11;37102:23;:36::i;57557:1049::-;57605:7;57619:16;57661:12;55742:11;;;55678:80;57661:12;57638:35;;55476:19;57638:35;:::i;:::-;57724:132;;-1:-1:-1;;57748:10:0;7746:2:1;7742:15;;;7738:24;;57724:132:0;;;7726:37:1;57766:14:0;7797:15:1;;7793:24;7779:12;;;7772:46;57788:16:0;7834:12:1;;;7827:28;57812:14:0;7871:12:1;;;7864:28;57834:15:0;7908:13:1;;;7901:29;57619:54:0;;-1:-1:-1;57678:14:0;;57619:54;;7946:13:1;;57724:132:0;;;;;;;;;;;;57708:154;;;;;;57695:172;;:183;;;;:::i;:::-;57885:13;57911:19;;;:11;:19;;;;;;57678:200;;-1:-1:-1;57885:13:0;57907:256;;-1:-1:-1;58038:6:0;57907:256;;;-1:-1:-1;58138:19:0;;;;:11;:19;;;;;;57907:256;58228:11;:25;58240:12;58251:1;58240:8;:12;:::i;:::-;58228:25;;;;;;;;;;;;58257:1;58228:30;58224:283;;;58344:12;58355:1;58344:8;:12;:::i;:::-;58322:19;;;;:11;:19;;;;;:34;58224:283;;;58476:11;:25;58488:12;58499:1;58488:8;:12;:::i;:::-;58476:25;;;;;;;;;;;;;;-1:-1:-1;58476:25:0;;;;58454:19;;;:11;:19;;;;:47;58224:283;58553:17;:15;:17::i;:::-;-1:-1:-1;58584:17:0;58592:9;58584:5;:17;:::i;:::-;58577:24;;;;;57557:1049;:::o;38598:589::-;-1:-1:-1;;;;;38804:18:0;;38800:187;;38839:40;38871:7;40014:10;:17;;39987:24;;;;:15;:24;;;;;:44;;;40042:24;;;;;;;;;;;;39910:164;38839:40;38800:187;;;38909:2;-1:-1:-1;;;;;38901:10:0;:4;-1:-1:-1;;;;;38901:10:0;;38897:90;;38928:47;38961:4;38967:7;38928:32;:47::i;:::-;-1:-1:-1;;;;;39001:16:0;;38997:183;;39034:45;39071:7;39034:36;:45::i;38997:183::-;39107:4;-1:-1:-1;;;;;39101:10:0;:2;-1:-1:-1;;;;;39101:10:0;;39097:83;;39128:40;39156:2;39160:7;39128:27;:40::i;60085:98::-;60143:7;60170:5;60174:1;60170;:5;:::i;58948:98::-;59006:7;59033:5;59037:1;59033;:5;:::i;28784:321::-;28914:18;28920:2;28924:7;28914:5;:18::i;:::-;28965:54;28996:1;29000:2;29004:7;29013:5;28965:22;:54::i;:::-;28943:154;;;;-1:-1:-1;;;28943:154:0;;;;;;;:::i;32805:799::-;32960:4;-1:-1:-1;;;;;32981:13:0;;9249:19;:23;32977:620;;33017:72;;-1:-1:-1;;;33017:72:0;;-1:-1:-1;;;;;33017:36:0;;;;;:72;;16991:10;;33068:4;;33074:7;;33083:5;;33017:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33017:72:0;;;;;;;;-1:-1:-1;;33017:72:0;;;;;;;;;;;;:::i;:::-;;;33013:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33259:13:0;;33255:272;;33302:60;;-1:-1:-1;;;33302:60:0;;;;;;;:::i;33255:272::-;33477:6;33471:13;33462:6;33458:2;33454:15;33447:38;33013:529;-1:-1:-1;;;;;;33140:51:0;-1:-1:-1;;;33140:51:0;;-1:-1:-1;33133:58:0;;32977:620;-1:-1:-1;33581:4:0;32805:799;;;;;;:::o;21705:305::-;21807:4;-1:-1:-1;;;;;;21844:40:0;;-1:-1:-1;;;21844:40:0;;:105;;-1:-1:-1;;;;;;;21901:48:0;;-1:-1:-1;;;21901:48:0;21844:105;:158;;;-1:-1:-1;;;;;;;;;;20237:40:0;;;21966:36;20128:157;56069:105;56135:7;56304:1;56280:21;:19;:21::i;:::-;:25;56272:62;;;;-1:-1:-1;;;56272:62:0;;16131:2:1;56272:62:0;;;16113:21:1;16170:2;16150:18;;;16143:30;16209:26;16189:18;;;16182:54;16253:18;;56272:62:0;16103:174:1;56272:62:0;56156:11:::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;56149:20;;56069:105:::0;:::o;40701:988::-;40967:22;41017:1;40992:22;41009:4;40992:16;:22::i;:::-;:26;;;;:::i;:::-;41029:18;41050:26;;;:17;:26;;;;;;40967:51;;-1:-1:-1;41183:28:0;;;41179:328;;-1:-1:-1;;;;;41250:18:0;;41228:19;41250:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41301:30;;;;;;:44;;;41418:30;;:17;:30;;;;;:43;;;41179:328;-1:-1:-1;41603:26:0;;;;:17;:26;;;;;;;;41596:33;;;-1:-1:-1;;;;;41647:18:0;;;;;:12;:18;;;;;:34;;;;;;;41640:41;40701:988::o;41984:1079::-;42262:10;:17;42237:22;;42262:21;;42282:1;;42262:21;:::i;:::-;42294:18;42315:24;;;:15;:24;;;;;;42688:10;:26;;42237:46;;-1:-1:-1;42315:24:0;;42237:46;;42688:26;;;;-1:-1:-1;;;42688:26:0;;;;;;;;;;;;;;;;;42666:48;;42752:11;42727:10;42738;42727:22;;;;;;-1:-1:-1;;;42727:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42832:28;;;:15;:28;;;;;;;:41;;;43004:24;;;;;42997:31;43039:10;:16;;;;;-1:-1:-1;;;43039:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41984:1079;;;;:::o;39488:221::-;39573:14;39590:20;39607:2;39590:16;:20::i;:::-;-1:-1:-1;;;;;39621:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39666:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39488:221:0:o;29441:439::-;-1:-1:-1;;;;;29521:16:0;;29513:61;;;;-1:-1:-1;;;29513:61:0;;19931:2:1;29513:61:0;;;19913:21:1;;;19950:18;;;19943:30;20009:34;19989:18;;;19982:62;20061:18;;29513:61:0;19903:182:1;29513:61:0;27528:4;27552:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27552:16:0;:30;29585:58;;;;-1:-1:-1;;;29585:58:0;;15015:2:1;29585:58:0;;;14997:21:1;15054:2;15034:18;;;15027:30;15093;15073:18;;;15066:58;15141:18;;29585:58:0;14987:178:1;29585:58:0;29656:45;29685:1;29689:2;29693:7;29656:20;:45::i;:::-;-1:-1:-1;;;;;29714:13:0;;;;;;:9;:13;;;;;:18;;29731:1;;29714:13;:18;;29731:1;;29714:18;:::i;:::-;;;;-1:-1:-1;;29743:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29743:21:0;-1:-1:-1;;;;;29743:21:0;;;;;;;;29782:33;;29743:16;;;29782:33;;29743:16;;29782:33;70327:146;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:391::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:2;;978:6;970;963:22;922:2;-1:-1:-1;1006:20:1;;1049:18;1038:30;;1035:2;;;1088:8;1078;1071:26;1035:2;1132:4;1124:6;1120:17;1108:29;;1192:3;1185:4;1175:6;1172:1;1168:14;1160:6;1156:27;1152:38;1149:47;1146:2;;;1209:1;1206;1199:12;1224:196;1283:6;1336:2;1324:9;1315:7;1311:23;1307:32;1304:2;;;1357:6;1349;1342:22;1304:2;1385:29;1404:9;1385:29;:::i;1425:270::-;1493:6;1501;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1575:6;1567;1560:22;1522:2;1603:29;1622:9;1603:29;:::i;:::-;1593:39;;1651:38;1685:2;1674:9;1670:18;1651:38;:::i;:::-;1641:48;;1512:183;;;;;:::o;1700:338::-;1777:6;1785;1793;1846:2;1834:9;1825:7;1821:23;1817:32;1814:2;;;1867:6;1859;1852:22;1814:2;1895:29;1914:9;1895:29;:::i;:::-;1885:39;;1943:38;1977:2;1966:9;1962:18;1943:38;:::i;:::-;1933:48;;2028:2;2017:9;2013:18;2000:32;1990:42;;1804:234;;;;;:::o;2043:696::-;2138:6;2146;2154;2162;2215:3;2203:9;2194:7;2190:23;2186:33;2183:2;;;2237:6;2229;2222:22;2183:2;2265:29;2284:9;2265:29;:::i;:::-;2255:39;;2313:38;2347:2;2336:9;2332:18;2313:38;:::i;:::-;2303:48;;2398:2;2387:9;2383:18;2370:32;2360:42;;2453:2;2442:9;2438:18;2425:32;2480:18;2472:6;2469:30;2466:2;;;2517:6;2509;2502:22;2466:2;2545:22;;2598:4;2590:13;;2586:27;-1:-1:-1;2576:2:1;;2632:6;2624;2617:22;2576:2;2660:73;2725:7;2720:2;2707:16;2702:2;2698;2694:11;2660:73;:::i;:::-;2650:83;;;2173:566;;;;;;;:::o;2744:325::-;2809:6;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:2;;;2891:6;2883;2876:22;2838:2;2919:29;2938:9;2919:29;:::i;:::-;2909:39;;2998:2;2987:9;2983:18;2970:32;3011:28;3033:5;3011:28;:::i;:::-;3058:5;3048:15;;;2828:241;;;;;:::o;3074:264::-;3142:6;3150;3203:2;3191:9;3182:7;3178:23;3174:32;3171:2;;;3224:6;3216;3209:22;3171:2;3252:29;3271:9;3252:29;:::i;:::-;3242:39;3328:2;3313:18;;;;3300:32;;-1:-1:-1;;;3161:177:1:o;3343:386::-;3410:6;3418;3471:2;3459:9;3450:7;3446:23;3442:32;3439:2;;;3492:6;3484;3477:22;3439:2;3520:29;3539:9;3520:29;:::i;:::-;3510:39;;3599:2;3588:9;3584:18;3571:32;-1:-1:-1;;;;;3636:5:1;3632:38;3625:5;3622:49;3612:2;;3690:6;3682;3675:22;3734:457;3820:6;3828;3881:2;3869:9;3860:7;3856:23;3852:32;3849:2;;;3902:6;3894;3887:22;3849:2;3947:9;3934:23;3980:18;3972:6;3969:30;3966:2;;;4017:6;4009;4002:22;3966:2;4061:70;4123:7;4114:6;4103:9;4099:22;4061:70;:::i;:::-;4150:8;;4035:96;;-1:-1:-1;3839:352:1;-1:-1:-1;;;;3839:352:1:o;4196:802::-;4317:6;4325;4333;4341;4394:2;4382:9;4373:7;4369:23;4365:32;4362:2;;;4415:6;4407;4400:22;4362:2;4460:9;4447:23;4489:18;4530:2;4522:6;4519:14;4516:2;;;4551:6;4543;4536:22;4516:2;4595:70;4657:7;4648:6;4637:9;4633:22;4595:70;:::i;:::-;4684:8;;-1:-1:-1;4569:96:1;-1:-1:-1;4772:2:1;4757:18;;4744:32;;-1:-1:-1;4788:16:1;;;4785:2;;;4822:6;4814;4807:22;4785:2;;4866:72;4930:7;4919:8;4908:9;4904:24;4866:72;:::i;:::-;4352:646;;;;-1:-1:-1;4957:8:1;-1:-1:-1;;;;4352:646:1:o;5003:255::-;5070:6;5123:2;5111:9;5102:7;5098:23;5094:32;5091:2;;;5144:6;5136;5129:22;5091:2;5181:9;5175:16;5200:28;5222:5;5200:28;:::i;5263:255::-;5321:6;5374:2;5362:9;5353:7;5349:23;5345:32;5342:2;;;5395:6;5387;5380:22;5342:2;5439:9;5426:23;5458:30;5482:5;5458:30;:::i;5523:259::-;5592:6;5645:2;5633:9;5624:7;5620:23;5616:32;5613:2;;;5666:6;5658;5651:22;5613:2;5703:9;5697:16;5722:30;5746:5;5722:30;:::i;5787:480::-;5856:6;5909:2;5897:9;5888:7;5884:23;5880:32;5877:2;;;5930:6;5922;5915:22;5877:2;5975:9;5962:23;6008:18;6000:6;5997:30;5994:2;;;6045:6;6037;6030:22;5994:2;6073:22;;6126:4;6118:13;;6114:27;-1:-1:-1;6104:2:1;;6160:6;6152;6145:22;6104:2;6188:73;6253:7;6248:2;6235:16;6230:2;6226;6222:11;6188:73;:::i;6272:190::-;6331:6;6384:2;6372:9;6363:7;6359:23;6355:32;6352:2;;;6405:6;6397;6390:22;6352:2;-1:-1:-1;6433:23:1;;6342:120;-1:-1:-1;6342:120:1:o;6467:258::-;6535:6;6543;6596:2;6584:9;6575:7;6571:23;6567:32;6564:2;;;6617:6;6609;6602:22;6564:2;-1:-1:-1;;6645:23:1;;;6715:2;6700:18;;;6687:32;;-1:-1:-1;6554:171:1:o;6730:257::-;6771:3;6809:5;6803:12;6836:6;6831:3;6824:19;6852:63;6908:6;6901:4;6896:3;6892:14;6885:4;6878:5;6874:16;6852:63;:::i;:::-;6969:2;6948:15;-1:-1:-1;;6944:29:1;6935:39;;;;6976:4;6931:50;;6779:208;-1:-1:-1;;6779:208:1:o;6992:185::-;7034:3;7072:5;7066:12;7087:52;7132:6;7127:3;7120:4;7113:5;7109:16;7087:52;:::i;:::-;7155:16;;;;;7042:135;-1:-1:-1;;7042:135:1:o;7970:1437::-;8348:3;8377;8412:6;8406:13;8442:3;8464:1;8492:9;8488:2;8484:18;8474:28;;8552:2;8541:9;8537:18;8574;8564:2;;8618:4;8610:6;8606:17;8596:27;;8564:2;8644;8692;8684:6;8681:14;8661:18;8658:38;8655:2;;;-1:-1:-1;;;8719:33:1;;8775:4;8772:1;8765:15;8805:4;8726:3;8793:17;8655:2;8836:18;8863:104;;;;8981:1;8976:322;;;;8829:469;;8863:104;-1:-1:-1;;8896:24:1;;8884:37;;8941:16;;;;-1:-1:-1;8863:104:1;;8976:322;26953:4;26972:17;;;27022:4;27006:21;;9071:3;9087:165;9101:6;9098:1;9095:13;9087:165;;;9179:14;;9166:11;;;9159:35;9222:16;;;;9116:10;;9087:165;;;9091:3;;9281:6;9276:3;9272:16;9265:23;;8829:469;;;;;;;9314:87;9339:61;9365:34;9395:3;-1:-1:-1;;;7365:16:1;;7406:1;7397:11;;7355:59;9365:34;9357:6;9339:61;:::i;:::-;-1:-1:-1;;;7242:20:1;;7287:1;7278:11;;7232:63;9314:87;9307:94;8356:1051;-1:-1:-1;;;;;8356:1051:1:o;9620:488::-;-1:-1:-1;;;;;9889:15:1;;;9871:34;;9941:15;;9936:2;9921:18;;9914:43;9988:2;9973:18;;9966:34;;;10036:3;10031:2;10016:18;;10009:31;;;9814:4;;10057:45;;10082:19;;10074:6;10057:45;:::i;:::-;10049:53;9823:285;-1:-1:-1;;;;;;9823:285:1:o;10392:661::-;10563:2;10615:21;;;10685:13;;10588:18;;;10707:22;;;10534:4;;10563:2;10786:15;;;;10760:2;10745:18;;;10534:4;10832:195;10846:6;10843:1;10840:13;10832:195;;;10911:13;;-1:-1:-1;;;;;10907:39:1;10895:52;;11002:15;;;;10967:12;;;;10943:1;10861:9;10832:195;;;-1:-1:-1;11044:3:1;;10543:510;-1:-1:-1;;;;;;10543:510:1:o;11058:646::-;11227:2;11279:21;;;11349:13;;11252:18;;;11371:22;;;11198:4;;11227:2;11450:15;;;;11424:2;11409:18;;;11198:4;11496:182;11510:6;11507:1;11504:13;11496:182;;;11575:13;;11590:6;11571:26;11559:39;;11653:15;;;;11618:12;;;;11532:1;11525:9;11496:182;;11901:219;12050:2;12039:9;12032:21;12013:4;12070:44;12110:2;12099:9;12095:18;12087:6;12070:44;:::i;13581:414::-;13783:2;13765:21;;;13822:2;13802:18;;;13795:30;13861:34;13856:2;13841:18;;13834:62;-1:-1:-1;;;13927:2:1;13912:18;;13905:48;13985:3;13970:19;;13755:240::o;20848:356::-;21050:2;21032:21;;;21069:18;;;21062:30;21128:34;21123:2;21108:18;;21101:62;21195:2;21180:18;;21022:182::o;23064:413::-;23266:2;23248:21;;;23305:2;23285:18;;;23278:30;23344:34;23339:2;23324:18;;23317:62;-1:-1:-1;;;23410:2:1;23395:18;;23388:47;23467:3;23452:19;;23238:239::o;25063:332::-;25265:2;25247:21;;;25304:1;25284:18;;;25277:29;-1:-1:-1;;;25337:2:1;25322:18;;25315:39;25386:2;25371:18;;25237:158::o;27038:128::-;27078:3;27109:1;27105:6;27102:1;27099:13;27096:2;;;27115:18;;:::i;:::-;-1:-1:-1;27151:9:1;;27086:80::o;27171:120::-;27211:1;27237;27227:2;;27242:18;;:::i;:::-;-1:-1:-1;27276:9:1;;27217:74::o;27296:168::-;27336:7;27402:1;27398;27394:6;27390:14;27387:1;27384:21;27379:1;27372:9;27365:17;27361:45;27358:2;;;27409:18;;:::i;:::-;-1:-1:-1;27449:9:1;;27348:116::o;27469:125::-;27509:4;27537:1;27534;27531:8;27528:2;;;27542:18;;:::i;:::-;-1:-1:-1;27579:9:1;;27518:76::o;27599:258::-;27671:1;27681:113;27695:6;27692:1;27689:13;27681:113;;;27771:11;;;27765:18;27752:11;;;27745:39;27717:2;27710:10;27681:113;;;27812:6;27809:1;27806:13;27803:2;;;-1:-1:-1;;27847:1:1;27829:16;;27822:27;27652:205::o;27862:380::-;27941:1;27937:12;;;;27984;;;28005:2;;28059:4;28051:6;28047:17;28037:27;;28005:2;28112;28104:6;28101:14;28081:18;28078:38;28075:2;;;28158:10;28153:3;28149:20;28146:1;28139:31;28193:4;28190:1;28183:15;28221:4;28218:1;28211:15;28075:2;;27917:325;;;:::o;28247:135::-;28286:3;-1:-1:-1;;28307:17:1;;28304:2;;;28327:18;;:::i;:::-;-1:-1:-1;28374:1:1;28363:13;;28294:88::o;28387:112::-;28419:1;28445;28435:2;;28450:18;;:::i;:::-;-1:-1:-1;28484:9:1;;28425:74::o;28504:127::-;28565:10;28560:3;28556:20;28553:1;28546:31;28596:4;28593:1;28586:15;28620:4;28617:1;28610:15;28636:127;28697:10;28692:3;28688:20;28685:1;28678:31;28728:4;28725:1;28718:15;28752:4;28749:1;28742:15;28768:127;28829:10;28824:3;28820:20;28817:1;28810:31;28860:4;28857:1;28850:15;28884:4;28881:1;28874:15;28900:118;28986:5;28979:13;28972:21;28965:5;28962:32;28952:2;;29008:1;29005;28998:12;29023:131;-1:-1:-1;;;;;;29097:32:1;;29087:43;;29077:2;;29144:1;29141;29134:12

Swarm Source

ipfs://f3d1447da3c0aedc0fd4a3edbc5f1b0585e993e9278e9e93b95e6542d3d6b0aa
Loading