ETH Price: $3,479.49 (+0.26%)

CardMonsters Bundle (CMB)
 

Overview

TokenID

269

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CardMonstersBundle

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 14: monster.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;



import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./Strings.sol";

contract CardMonstersBundle is ERC721Enumerable, Ownable {
    using Strings for uint256;
    //开始发售
    bool public _isSaleActive = false;
    bool public _revealed = false;

    // Constants
    uint256 public constant MAX_SUPPLY = 2002;
    //Mint价格
    uint256 public mintPrice = 0.5 ether;
    //最大持有量
    uint256 public maxBalance = 2000;
    uint256 public maxMint = 2000;

    string baseURI;
    string public notRevealedUri;
    string public baseExtension = ".json";
    

    mapping(uint256 => string) private _tokenURIs;

    constructor(string memory initBaseURI, string memory initNotRevealedUri)ERC721("CardMonsters Bundle", "CMB"){
        setBaseURI(initBaseURI);
        setNotRevealedURI(initNotRevealedUri);
    }

   

    function mintCardMonstersBundle(uint256 tokenQuantity) public payable {
        require(totalSupply() + tokenQuantity <= MAX_SUPPLY,"Sale would exceed max supply");
        require(_isSaleActive, "Sale must be active to CardMonsters Bundle");
        require(balanceOf(msg.sender) + tokenQuantity <= maxBalance,"Sale would exceed max balance");
        require(tokenQuantity * mintPrice <= msg.value,"Not enough ether sent");
        require(tokenQuantity <= maxMint, "Can only mint 1 tokens at a time");
        _mintCardMonstersBundle(tokenQuantity);
    }

    function _mintCardMonstersBundle(uint256 tokenQuantity) internal {
        for (uint256 i = 0; i < tokenQuantity; i++) {
            uint256 mintIndex = totalSupply();
            if (totalSupply() < MAX_SUPPLY) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }

    function tokenURI(uint256 tokenId)public view virtual override returns (string memory){
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        if (_revealed == false) {
            return notRevealedUri;
        }
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return
        string(abi.encodePacked(base, tokenId.toString(), baseExtension));
    }

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

    //only owner
    function flipSaleActive() public onlyOwner {
        _isSaleActive = !_isSaleActive;
    }

    function flipReveal() public onlyOwner {
        _revealed = !_revealed;
    }

    function setMintPrice(uint256 _mintPrice) public onlyOwner {
        mintPrice = _mintPrice;
    }

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

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

    function setBaseExtension(string memory _newBaseExtension)public onlyOwner{
        baseExtension = _newBaseExtension;
    }

    function setMaxBalance(uint256 _maxBalance) public onlyOwner {
        maxBalance = _maxBalance;
    }

    function setMaxMint(uint256 _maxMint) public onlyOwner {
        maxMint = _maxMint;
    }

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

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// 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 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// 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 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

File 5 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        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 6 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// 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 7 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 9 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 14: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 13 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"},{"internalType":"string","name":"initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mintCardMonstersBundle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBalance","type":"uint256"}],"name":"setMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506706f05b59d3b20000600b556107d0600c556107d0600d556040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060109081620000989190620005f5565b50348015620000a657600080fd5b5060405162004d9438038062004d948339818101604052810190620000cc919062000840565b6040518060400160405280601381526020017f436172644d6f6e73746572732042756e646c65000000000000000000000000008152506040518060400160405280600381526020017f434d4200000000000000000000000000000000000000000000000000000000008152508160009081620001499190620005f5565b5080600190816200015b9190620005f5565b5050506200017e62000172620001a860201b60201c565b620001b060201b60201c565b6200018f826200027660201b60201c565b620001a0816200029b60201b60201c565b505062000948565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000286620002c060201b60201c565b80600e9081620002979190620005f5565b5050565b620002ab620002c060201b60201c565b80600f9081620002bc9190620005f5565b5050565b620002d0620001a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f66200035160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003469062000926565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003fd57607f821691505b602082108103620004135762000412620003b5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200047d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200043e565b6200048986836200043e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004d6620004d0620004ca84620004a1565b620004ab565b620004a1565b9050919050565b6000819050919050565b620004f283620004b5565b6200050a6200050182620004dd565b8484546200044b565b825550505050565b600090565b6200052162000512565b6200052e818484620004e7565b505050565b5b8181101562000556576200054a60008262000517565b60018101905062000534565b5050565b601f821115620005a5576200056f8162000419565b6200057a846200042e565b810160208510156200058a578190505b620005a262000599856200042e565b83018262000533565b50505b505050565b600082821c905092915050565b6000620005ca60001984600802620005aa565b1980831691505092915050565b6000620005e58383620005b7565b9150826002028217905092915050565b62000600826200037b565b67ffffffffffffffff8111156200061c576200061b62000386565b5b620006288254620003e4565b620006358282856200055a565b600060209050601f8311600181146200066d576000841562000658578287015190505b620006648582620005d7565b865550620006d4565b601f1984166200067d8662000419565b60005b82811015620006a75784890151825560018201915060208501945060208101905062000680565b86831015620006c75784890151620006c3601f891682620005b7565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200071682620006fa565b810181811067ffffffffffffffff8211171562000738576200073762000386565b5b80604052505050565b60006200074d620006dc565b90506200075b82826200070b565b919050565b600067ffffffffffffffff8211156200077e576200077d62000386565b5b6200078982620006fa565b9050602081019050919050565b60005b83811015620007b657808201518184015260208101905062000799565b60008484015250505050565b6000620007d9620007d38462000760565b62000741565b905082815260208101848484011115620007f857620007f7620006f5565b5b6200080584828562000796565b509392505050565b600082601f830112620008255762000824620006f0565b5b815162000837848260208601620007c2565b91505092915050565b600080604083850312156200085a5762000859620006e6565b5b600083015167ffffffffffffffff8111156200087b576200087a620006eb565b5b62000889858286016200080d565b925050602083015167ffffffffffffffff811115620008ad57620008ac620006eb565b5b620008bb858286016200080d565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200090e602083620008c5565b91506200091b82620008d6565b602082019050919050565b600060208201905081810360008301526200094181620008ff565b9050919050565b61443c80620009586000396000f3fe60806040526004361061021a5760003560e01c80637080d6fc11610123578063b88d4fde116100ab578063de8b51e11161006f578063de8b51e1146107b2578063e985e9c5146107c9578063f2c4ce1e14610806578063f2fde38b1461082f578063f4a0a528146108585761021a565b8063b88d4fde146106dc578063c668286214610705578063c87b56dd14610730578063d5b70c3c1461076d578063da3ef23f146107895761021a565b80637501f741116100f25780637501f741146106095780638da5cb5b1461063457806395d89b411461065f5780639d51d9b71461068a578063a22cb465146106b35761021a565b80637080d6fc1461055f57806370a082311461058a578063715018a6146105c757806373ad468a146105de5761021a565b80633b84d9c6116101a6578063547520fe11610175578063547520fe1461047a57806355f804b3146104a35780636352211e146104cc5780636817c76c146105095780636ebeac85146105345761021a565b80633b84d9c6146103d457806342842e0e146103eb5780634f6ccce71461041457806351cff8d9146104515761021a565b8063095ea7b3116101ed578063095ea7b3146102ef57806318160ddd1461031857806323b872dd146103435780632f745c591461036c57806332cb6b0c146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063081c8c44146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612c15565b610881565b6040516102539190612c5d565b60405180910390f35b34801561026857600080fd5b506102716108fb565b60405161027e9190612d08565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612d60565b61098d565b6040516102bb9190612dce565b60405180910390f35b3480156102d057600080fd5b506102d96109d3565b6040516102e69190612d08565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190612e15565b610a61565b005b34801561032457600080fd5b5061032d610b78565b60405161033a9190612e64565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612e7f565b610b85565b005b34801561037857600080fd5b50610393600480360381019061038e9190612e15565b610be5565b6040516103a09190612e64565b60405180910390f35b3480156103b557600080fd5b506103be610c8a565b6040516103cb9190612e64565b60405180910390f35b3480156103e057600080fd5b506103e9610c90565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612e7f565b610cc4565b005b34801561042057600080fd5b5061043b60048036038101906104369190612d60565b610ce4565b6040516104489190612e64565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612ed2565b610d55565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612d60565b610dad565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190613034565b610dbf565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190612d60565b610dda565b6040516105009190612dce565b60405180910390f35b34801561051557600080fd5b5061051e610e60565b60405161052b9190612e64565b60405180910390f35b34801561054057600080fd5b50610549610e66565b6040516105569190612c5d565b60405180910390f35b34801561056b57600080fd5b50610574610e79565b6040516105819190612c5d565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612ed2565b610e8c565b6040516105be9190612e64565b60405180910390f35b3480156105d357600080fd5b506105dc610f43565b005b3480156105ea57600080fd5b506105f3610f57565b6040516106009190612e64565b60405180910390f35b34801561061557600080fd5b5061061e610f5d565b60405161062b9190612e64565b60405180910390f35b34801561064057600080fd5b50610649610f63565b6040516106569190612dce565b60405180910390f35b34801561066b57600080fd5b50610674610f8d565b6040516106819190612d08565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190612d60565b61101f565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906130a9565b611031565b005b3480156106e857600080fd5b5061070360048036038101906106fe919061318a565b611047565b005b34801561071157600080fd5b5061071a6110a9565b6040516107279190612d08565b60405180910390f35b34801561073c57600080fd5b5061075760048036038101906107529190612d60565b611137565b6040516107649190612d08565b60405180910390f35b61078760048036038101906107829190612d60565b611359565b005b34801561079557600080fd5b506107b060048036038101906107ab9190613034565b6114f8565b005b3480156107be57600080fd5b506107c7611513565b005b3480156107d557600080fd5b506107f060048036038101906107eb919061320d565b611547565b6040516107fd9190612c5d565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613034565b6115db565b005b34801561083b57600080fd5b5061085660048036038101906108519190612ed2565b6115f6565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612d60565b611679565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f457506108f38261168b565b5b9050919050565b60606000805461090a9061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546109369061327c565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b5050505050905090565b60006109988261176d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f80546109e09061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c9061327c565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b505050505081565b6000610a6c82610dda565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad39061331f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afb6117b8565b73ffffffffffffffffffffffffffffffffffffffff161480610b2a5750610b2981610b246117b8565b611547565b5b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b60906133b1565b60405180910390fd5b610b7383836117c0565b505050565b6000600880549050905090565b610b96610b906117b8565b82611879565b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613443565b60405180910390fd5b610be083838361190e565b505050565b6000610bf083610e8c565b8210610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906134d5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107d281565b610c98611c07565b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b610cdf83838360405180602001604052806000815250611047565b505050565b6000610cee610b78565b8210610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690613567565b60405180910390fd5b60088281548110610d4357610d42613587565b5b90600052602060002001549050919050565b610d5d611c07565b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610da8573d6000803e3d6000fd5b505050565b610db5611c07565b80600d8190555050565b610dc7611c07565b80600e9081610dd69190613762565b5050565b600080610de683611c85565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90613880565b60405180910390fd5b80915050919050565b600b5481565b600a60159054906101000a900460ff1681565b600a60149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613912565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f4b611c07565b610f556000611cc2565b565b600c5481565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f9c9061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061327c565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050905090565b611027611c07565b80600c8190555050565b61104361103c6117b8565b8383611d88565b5050565b6110586110526117b8565b83611879565b611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613443565b60405180910390fd5b6110a384848484611ef4565b50505050565b601080546110b69061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546110e29061327c565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b505050505081565b606061114282611f50565b611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611178906139a4565b60405180910390fd5b60001515600a60159054906101000a900460ff1615150361122e57600f80546111a99061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546111d59061327c565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50505050509050611354565b600060116000848152602001908152602001600020805461124e9061327c565b80601f016020809104026020016040519081016040528092919081815260200182805461127a9061327c565b80156112c75780601f1061129c576101008083540402835291602001916112c7565b820191906000526020600020905b8154815290600101906020018083116112aa57829003601f168201915b5050505050905060006112d8611f91565b905060008151036112ed578192505050611354565b60008251111561132257808260405160200161130a929190613a00565b60405160208183030381529060405292505050611354565b8061132c85612023565b601060405160200161134093929190613aa7565b604051602081830303815290604052925050505b919050565b6107d281611365610b78565b61136f9190613b07565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790613b87565b60405180910390fd5b600a60149054906101000a900460ff166113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613c19565b60405180910390fd5b600c548161140c33610e8c565b6114169190613b07565b1115611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90613c85565b60405180910390fd5b34600b54826114669190613ca5565b11156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613d33565b60405180910390fd5b600d548111156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390613d9f565b60405180910390fd5b6114f5816120f1565b50565b611500611c07565b806010908161150f9190613762565b5050565b61151b611c07565b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115e3611c07565b80600f90816115f29190613762565b5050565b6115fe611c07565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613e31565b60405180910390fd5b61167681611cc2565b50565b611681611c07565b80600b8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061175657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061176657506117658261213c565b5b9050919050565b61177681611f50565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613880565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661183383610dda565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061188583610dda565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118c757506118c68185611547565b5b8061190557508373ffffffffffffffffffffffffffffffffffffffff166118ed8461098d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661192e82610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613ec3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613f55565b60405180910390fd5b611a0083838360016121a6565b8273ffffffffffffffffffffffffffffffffffffffff16611a2082610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90613ec3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c028383836001612304565b505050565b611c0f6117b8565b73ffffffffffffffffffffffffffffffffffffffff16611c2d610f63565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90613fc1565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded9061402d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ee79190612c5d565b60405180910390a3505050565b611eff84848461190e565b611f0b8484848461230a565b611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f41906140bf565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611f7283611c85565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600e8054611fa09061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcc9061327c565b80156120195780601f10611fee57610100808354040283529160200191612019565b820191906000526020600020905b815481529060010190602001808311611ffc57829003601f168201915b5050505050905090565b60606000600161203284612491565b01905060008167ffffffffffffffff81111561205157612050612f09565b5b6040519080825280601f01601f1916602001820160405280156120835781602001600182028036833780820191505090505b509050600082602001820190505b6001156120e6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120da576120d96140df565b5b04945060008503612091575b819350505050919050565b60005b81811015612138576000612106610b78565b90506107d2612113610b78565b10156121245761212333826125e4565b5b5080806121309061410e565b9150506120f4565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121b284848484612602565b60018111156121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed906141c8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361223d5761223881612608565b61227c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461227b5761227a8582612651565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122be576122b9816127be565b6122fd565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122fc576122fb848261288f565b5b5b5050505050565b50505050565b600061232b8473ffffffffffffffffffffffffffffffffffffffff1661290e565b15612484578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123546117b8565b8786866040518563ffffffff1660e01b8152600401612376949392919061423d565b6020604051808303816000875af19250505080156123b257506040513d601f19601f820116820180604052508101906123af919061429e565b60015b612434573d80600081146123e2576040519150601f19603f3d011682016040523d82523d6000602084013e6123e7565b606091505b50600081510361242c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612423906140bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612489565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106124ef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816124e5576124e46140df565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061252c576d04ee2d6d415b85acef81000000008381612522576125216140df565b5b0492506020810190505b662386f26fc10000831061255b57662386f26fc100008381612551576125506140df565b5b0492506010810190505b6305f5e1008310612584576305f5e100838161257a576125796140df565b5b0492506008810190505b61271083106125a957612710838161259f5761259e6140df565b5b0492506004810190505b606483106125cc57606483816125c2576125c16140df565b5b0492506002810190505b600a83106125db576001810190505b80915050919050565b6125fe828260405180602001604052806000815250612931565b5050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161265e84610e8c565b61266891906142cb565b905060006007600084815260200190815260200160002054905081811461274d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127d291906142cb565b905060006009600084815260200190815260200160002054905060006008838154811061280257612801613587565b5b90600052602060002001549050806008838154811061282457612823613587565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612873576128726142ff565b5b6001900381819060005260206000200160009055905550505050565b600061289a83610e8c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61293b838361298c565b612948600084848461230a565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e906140bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061437a565b60405180910390fd5b612a0481611f50565b15612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b906143e6565b60405180910390fd5b612a526000838360016121a6565b612a5b81611f50565b15612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906143e6565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ba5600083836001612304565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf281612bbd565b8114612bfd57600080fd5b50565b600081359050612c0f81612be9565b92915050565b600060208284031215612c2b57612c2a612bb3565b5b6000612c3984828501612c00565b91505092915050565b60008115159050919050565b612c5781612c42565b82525050565b6000602082019050612c726000830184612c4e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb2578082015181840152602081019050612c97565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cda82612c78565b612ce48185612c83565b9350612cf4818560208601612c94565b612cfd81612cbe565b840191505092915050565b60006020820190508181036000830152612d228184612ccf565b905092915050565b6000819050919050565b612d3d81612d2a565b8114612d4857600080fd5b50565b600081359050612d5a81612d34565b92915050565b600060208284031215612d7657612d75612bb3565b5b6000612d8484828501612d4b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612db882612d8d565b9050919050565b612dc881612dad565b82525050565b6000602082019050612de36000830184612dbf565b92915050565b612df281612dad565b8114612dfd57600080fd5b50565b600081359050612e0f81612de9565b92915050565b60008060408385031215612e2c57612e2b612bb3565b5b6000612e3a85828601612e00565b9250506020612e4b85828601612d4b565b9150509250929050565b612e5e81612d2a565b82525050565b6000602082019050612e796000830184612e55565b92915050565b600080600060608486031215612e9857612e97612bb3565b5b6000612ea686828701612e00565b9350506020612eb786828701612e00565b9250506040612ec886828701612d4b565b9150509250925092565b600060208284031215612ee857612ee7612bb3565b5b6000612ef684828501612e00565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4182612cbe565b810181811067ffffffffffffffff82111715612f6057612f5f612f09565b5b80604052505050565b6000612f73612ba9565b9050612f7f8282612f38565b919050565b600067ffffffffffffffff821115612f9f57612f9e612f09565b5b612fa882612cbe565b9050602081019050919050565b82818337600083830152505050565b6000612fd7612fd284612f84565b612f69565b905082815260208101848484011115612ff357612ff2612f04565b5b612ffe848285612fb5565b509392505050565b600082601f83011261301b5761301a612eff565b5b813561302b848260208601612fc4565b91505092915050565b60006020828403121561304a57613049612bb3565b5b600082013567ffffffffffffffff81111561306857613067612bb8565b5b61307484828501613006565b91505092915050565b61308681612c42565b811461309157600080fd5b50565b6000813590506130a38161307d565b92915050565b600080604083850312156130c0576130bf612bb3565b5b60006130ce85828601612e00565b92505060206130df85828601613094565b9150509250929050565b600067ffffffffffffffff82111561310457613103612f09565b5b61310d82612cbe565b9050602081019050919050565b600061312d613128846130e9565b612f69565b90508281526020810184848401111561314957613148612f04565b5b613154848285612fb5565b509392505050565b600082601f83011261317157613170612eff565b5b813561318184826020860161311a565b91505092915050565b600080600080608085870312156131a4576131a3612bb3565b5b60006131b287828801612e00565b94505060206131c387828801612e00565b93505060406131d487828801612d4b565b925050606085013567ffffffffffffffff8111156131f5576131f4612bb8565b5b6132018782880161315c565b91505092959194509250565b6000806040838503121561322457613223612bb3565b5b600061323285828601612e00565b925050602061324385828601612e00565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061329457607f821691505b6020821081036132a7576132a661324d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613309602183612c83565b9150613314826132ad565b604082019050919050565b60006020820190508181036000830152613338816132fc565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061339b603d83612c83565b91506133a68261333f565b604082019050919050565b600060208201905081810360008301526133ca8161338e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061342d602d83612c83565b9150613438826133d1565b604082019050919050565b6000602082019050818103600083015261345c81613420565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134bf602b83612c83565b91506134ca82613463565b604082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613551602c83612c83565b915061355c826134f5565b604082019050919050565b6000602082019050818103600083015261358081613544565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136187fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135db565b61362286836135db565b95508019841693508086168417925050509392505050565b6000819050919050565b600061365f61365a61365584612d2a565b61363a565b612d2a565b9050919050565b6000819050919050565b61367983613644565b61368d61368582613666565b8484546135e8565b825550505050565b600090565b6136a2613695565b6136ad818484613670565b505050565b5b818110156136d1576136c660008261369a565b6001810190506136b3565b5050565b601f821115613716576136e7816135b6565b6136f0846135cb565b810160208510156136ff578190505b61371361370b856135cb565b8301826136b2565b50505b505050565b600082821c905092915050565b60006137396000198460080261371b565b1980831691505092915050565b60006137528383613728565b9150826002028217905092915050565b61376b82612c78565b67ffffffffffffffff81111561378457613783612f09565b5b61378e825461327c565b6137998282856136d5565b600060209050601f8311600181146137cc57600084156137ba578287015190505b6137c48582613746565b86555061382c565b601f1984166137da866135b6565b60005b82811015613802578489015182556001820191506020850194506020810190506137dd565b8683101561381f578489015161381b601f891682613728565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061386a601883612c83565b915061387582613834565b602082019050919050565b600060208201905081810360008301526138998161385d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006138fc602983612c83565b9150613907826138a0565b604082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061398e602f83612c83565b915061399982613932565b604082019050919050565b600060208201905081810360008301526139bd81613981565b9050919050565b600081905092915050565b60006139da82612c78565b6139e481856139c4565b93506139f4818560208601612c94565b80840191505092915050565b6000613a0c82856139cf565b9150613a1882846139cf565b91508190509392505050565b60008154613a318161327c565b613a3b81866139c4565b94506001821660008114613a565760018114613a6b57613a9e565b60ff1983168652811515820286019350613a9e565b613a74856135b6565b60005b83811015613a9657815481890152600182019150602081019050613a77565b838801955050505b50505092915050565b6000613ab382866139cf565b9150613abf82856139cf565b9150613acb8284613a24565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b1282612d2a565b9150613b1d83612d2a565b9250828201905080821115613b3557613b34613ad8565b5b92915050565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b6000613b71601c83612c83565b9150613b7c82613b3b565b602082019050919050565b60006020820190508181036000830152613ba081613b64565b9050919050565b7f53616c65206d7573742062652061637469766520746f20436172644d6f6e737460008201527f6572732042756e646c6500000000000000000000000000000000000000000000602082015250565b6000613c03602a83612c83565b9150613c0e82613ba7565b604082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f53616c6520776f756c6420657863656564206d61782062616c616e6365000000600082015250565b6000613c6f601d83612c83565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612d2a565b9150613cbb83612d2a565b9250828202613cc981612d2a565b91508282048414831517613ce057613cdf613ad8565b5b5092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613d1d601583612c83565b9150613d2882613ce7565b602082019050919050565b60006020820190508181036000830152613d4c81613d10565b9050919050565b7f43616e206f6e6c79206d696e74203120746f6b656e7320617420612074696d65600082015250565b6000613d89602083612c83565b9150613d9482613d53565b602082019050919050565b60006020820190508181036000830152613db881613d7c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e1b602683612c83565b9150613e2682613dbf565b604082019050919050565b60006020820190508181036000830152613e4a81613e0e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ead602583612c83565b9150613eb882613e51565b604082019050919050565b60006020820190508181036000830152613edc81613ea0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f3f602483612c83565b9150613f4a82613ee3565b604082019050919050565b60006020820190508181036000830152613f6e81613f32565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fab602083612c83565b9150613fb682613f75565b602082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614017601983612c83565b915061402282613fe1565b602082019050919050565b600060208201905081810360008301526140468161400a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140a9603283612c83565b91506140b48261404d565b604082019050919050565b600060208201905081810360008301526140d88161409c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061411982612d2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361414b5761414a613ad8565b5b600182019050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006141b2603583612c83565b91506141bd82614156565b604082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061420f826141e8565b61421981856141f3565b9350614229818560208601612c94565b61423281612cbe565b840191505092915050565b60006080820190506142526000830187612dbf565b61425f6020830186612dbf565b61426c6040830185612e55565b818103606083015261427e8184614204565b905095945050505050565b60008151905061429881612be9565b92915050565b6000602082840312156142b4576142b3612bb3565b5b60006142c284828501614289565b91505092915050565b60006142d682612d2a565b91506142e183612d2a565b92508282039050818111156142f9576142f8613ad8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614364602083612c83565b915061436f8261432e565b602082019050919050565b6000602082019050818103600083015261439381614357565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006143d0601c83612c83565b91506143db8261439a565b602082019050919050565b600060208201905081810360008301526143ff816143c3565b905091905056fea2646970667358221220d2a935b71a0d99769cede2b3737bcc279bde7e0b19a88578f6fd08024db06c3964736f6c63430008130033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000033687474703a2f2f7777772e636172646d6f6e73746572732e636f2f7374617469632f6a736f6e2f6d6f6e737465722e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637080d6fc11610123578063b88d4fde116100ab578063de8b51e11161006f578063de8b51e1146107b2578063e985e9c5146107c9578063f2c4ce1e14610806578063f2fde38b1461082f578063f4a0a528146108585761021a565b8063b88d4fde146106dc578063c668286214610705578063c87b56dd14610730578063d5b70c3c1461076d578063da3ef23f146107895761021a565b80637501f741116100f25780637501f741146106095780638da5cb5b1461063457806395d89b411461065f5780639d51d9b71461068a578063a22cb465146106b35761021a565b80637080d6fc1461055f57806370a082311461058a578063715018a6146105c757806373ad468a146105de5761021a565b80633b84d9c6116101a6578063547520fe11610175578063547520fe1461047a57806355f804b3146104a35780636352211e146104cc5780636817c76c146105095780636ebeac85146105345761021a565b80633b84d9c6146103d457806342842e0e146103eb5780634f6ccce71461041457806351cff8d9146104515761021a565b8063095ea7b3116101ed578063095ea7b3146102ef57806318160ddd1461031857806323b872dd146103435780632f745c591461036c57806332cb6b0c146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063081c8c44146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612c15565b610881565b6040516102539190612c5d565b60405180910390f35b34801561026857600080fd5b506102716108fb565b60405161027e9190612d08565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612d60565b61098d565b6040516102bb9190612dce565b60405180910390f35b3480156102d057600080fd5b506102d96109d3565b6040516102e69190612d08565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190612e15565b610a61565b005b34801561032457600080fd5b5061032d610b78565b60405161033a9190612e64565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612e7f565b610b85565b005b34801561037857600080fd5b50610393600480360381019061038e9190612e15565b610be5565b6040516103a09190612e64565b60405180910390f35b3480156103b557600080fd5b506103be610c8a565b6040516103cb9190612e64565b60405180910390f35b3480156103e057600080fd5b506103e9610c90565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612e7f565b610cc4565b005b34801561042057600080fd5b5061043b60048036038101906104369190612d60565b610ce4565b6040516104489190612e64565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612ed2565b610d55565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612d60565b610dad565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190613034565b610dbf565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190612d60565b610dda565b6040516105009190612dce565b60405180910390f35b34801561051557600080fd5b5061051e610e60565b60405161052b9190612e64565b60405180910390f35b34801561054057600080fd5b50610549610e66565b6040516105569190612c5d565b60405180910390f35b34801561056b57600080fd5b50610574610e79565b6040516105819190612c5d565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612ed2565b610e8c565b6040516105be9190612e64565b60405180910390f35b3480156105d357600080fd5b506105dc610f43565b005b3480156105ea57600080fd5b506105f3610f57565b6040516106009190612e64565b60405180910390f35b34801561061557600080fd5b5061061e610f5d565b60405161062b9190612e64565b60405180910390f35b34801561064057600080fd5b50610649610f63565b6040516106569190612dce565b60405180910390f35b34801561066b57600080fd5b50610674610f8d565b6040516106819190612d08565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac9190612d60565b61101f565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906130a9565b611031565b005b3480156106e857600080fd5b5061070360048036038101906106fe919061318a565b611047565b005b34801561071157600080fd5b5061071a6110a9565b6040516107279190612d08565b60405180910390f35b34801561073c57600080fd5b5061075760048036038101906107529190612d60565b611137565b6040516107649190612d08565b60405180910390f35b61078760048036038101906107829190612d60565b611359565b005b34801561079557600080fd5b506107b060048036038101906107ab9190613034565b6114f8565b005b3480156107be57600080fd5b506107c7611513565b005b3480156107d557600080fd5b506107f060048036038101906107eb919061320d565b611547565b6040516107fd9190612c5d565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613034565b6115db565b005b34801561083b57600080fd5b5061085660048036038101906108519190612ed2565b6115f6565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612d60565b611679565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f457506108f38261168b565b5b9050919050565b60606000805461090a9061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546109369061327c565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b5050505050905090565b60006109988261176d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f80546109e09061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c9061327c565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b505050505081565b6000610a6c82610dda565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad39061331f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afb6117b8565b73ffffffffffffffffffffffffffffffffffffffff161480610b2a5750610b2981610b246117b8565b611547565b5b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b60906133b1565b60405180910390fd5b610b7383836117c0565b505050565b6000600880549050905090565b610b96610b906117b8565b82611879565b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613443565b60405180910390fd5b610be083838361190e565b505050565b6000610bf083610e8c565b8210610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c28906134d5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107d281565b610c98611c07565b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b610cdf83838360405180602001604052806000815250611047565b505050565b6000610cee610b78565b8210610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690613567565b60405180910390fd5b60088281548110610d4357610d42613587565b5b90600052602060002001549050919050565b610d5d611c07565b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610da8573d6000803e3d6000fd5b505050565b610db5611c07565b80600d8190555050565b610dc7611c07565b80600e9081610dd69190613762565b5050565b600080610de683611c85565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90613880565b60405180910390fd5b80915050919050565b600b5481565b600a60159054906101000a900460ff1681565b600a60149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390613912565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f4b611c07565b610f556000611cc2565b565b600c5481565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f9c9061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061327c565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050905090565b611027611c07565b80600c8190555050565b61104361103c6117b8565b8383611d88565b5050565b6110586110526117b8565b83611879565b611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613443565b60405180910390fd5b6110a384848484611ef4565b50505050565b601080546110b69061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546110e29061327c565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b505050505081565b606061114282611f50565b611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611178906139a4565b60405180910390fd5b60001515600a60159054906101000a900460ff1615150361122e57600f80546111a99061327c565b80601f01602080910402602001604051908101604052809291908181526020018280546111d59061327c565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50505050509050611354565b600060116000848152602001908152602001600020805461124e9061327c565b80601f016020809104026020016040519081016040528092919081815260200182805461127a9061327c565b80156112c75780601f1061129c576101008083540402835291602001916112c7565b820191906000526020600020905b8154815290600101906020018083116112aa57829003601f168201915b5050505050905060006112d8611f91565b905060008151036112ed578192505050611354565b60008251111561132257808260405160200161130a929190613a00565b60405160208183030381529060405292505050611354565b8061132c85612023565b601060405160200161134093929190613aa7565b604051602081830303815290604052925050505b919050565b6107d281611365610b78565b61136f9190613b07565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790613b87565b60405180910390fd5b600a60149054906101000a900460ff166113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613c19565b60405180910390fd5b600c548161140c33610e8c565b6114169190613b07565b1115611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90613c85565b60405180910390fd5b34600b54826114669190613ca5565b11156114a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149e90613d33565b60405180910390fd5b600d548111156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e390613d9f565b60405180910390fd5b6114f5816120f1565b50565b611500611c07565b806010908161150f9190613762565b5050565b61151b611c07565b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115e3611c07565b80600f90816115f29190613762565b5050565b6115fe611c07565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490613e31565b60405180910390fd5b61167681611cc2565b50565b611681611c07565b80600b8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061175657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061176657506117658261213c565b5b9050919050565b61177681611f50565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90613880565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661183383610dda565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061188583610dda565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118c757506118c68185611547565b5b8061190557508373ffffffffffffffffffffffffffffffffffffffff166118ed8461098d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661192e82610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613ec3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613f55565b60405180910390fd5b611a0083838360016121a6565b8273ffffffffffffffffffffffffffffffffffffffff16611a2082610dda565b73ffffffffffffffffffffffffffffffffffffffff1614611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90613ec3565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c028383836001612304565b505050565b611c0f6117b8565b73ffffffffffffffffffffffffffffffffffffffff16611c2d610f63565b73ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90613fc1565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded9061402d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ee79190612c5d565b60405180910390a3505050565b611eff84848461190e565b611f0b8484848461230a565b611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f41906140bf565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16611f7283611c85565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600e8054611fa09061327c565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcc9061327c565b80156120195780601f10611fee57610100808354040283529160200191612019565b820191906000526020600020905b815481529060010190602001808311611ffc57829003601f168201915b5050505050905090565b60606000600161203284612491565b01905060008167ffffffffffffffff81111561205157612050612f09565b5b6040519080825280601f01601f1916602001820160405280156120835781602001600182028036833780820191505090505b509050600082602001820190505b6001156120e6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120da576120d96140df565b5b04945060008503612091575b819350505050919050565b60005b81811015612138576000612106610b78565b90506107d2612113610b78565b10156121245761212333826125e4565b5b5080806121309061410e565b9150506120f4565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121b284848484612602565b60018111156121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed906141c8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361223d5761223881612608565b61227c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461227b5761227a8582612651565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122be576122b9816127be565b6122fd565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122fc576122fb848261288f565b5b5b5050505050565b50505050565b600061232b8473ffffffffffffffffffffffffffffffffffffffff1661290e565b15612484578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123546117b8565b8786866040518563ffffffff1660e01b8152600401612376949392919061423d565b6020604051808303816000875af19250505080156123b257506040513d601f19601f820116820180604052508101906123af919061429e565b60015b612434573d80600081146123e2576040519150601f19603f3d011682016040523d82523d6000602084013e6123e7565b606091505b50600081510361242c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612423906140bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612489565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106124ef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816124e5576124e46140df565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061252c576d04ee2d6d415b85acef81000000008381612522576125216140df565b5b0492506020810190505b662386f26fc10000831061255b57662386f26fc100008381612551576125506140df565b5b0492506010810190505b6305f5e1008310612584576305f5e100838161257a576125796140df565b5b0492506008810190505b61271083106125a957612710838161259f5761259e6140df565b5b0492506004810190505b606483106125cc57606483816125c2576125c16140df565b5b0492506002810190505b600a83106125db576001810190505b80915050919050565b6125fe828260405180602001604052806000815250612931565b5050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161265e84610e8c565b61266891906142cb565b905060006007600084815260200190815260200160002054905081811461274d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127d291906142cb565b905060006009600084815260200190815260200160002054905060006008838154811061280257612801613587565b5b90600052602060002001549050806008838154811061282457612823613587565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612873576128726142ff565b5b6001900381819060005260206000200160009055905550505050565b600061289a83610e8c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61293b838361298c565b612948600084848461230a565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e906140bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f29061437a565b60405180910390fd5b612a0481611f50565b15612a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3b906143e6565b60405180910390fd5b612a526000838360016121a6565b612a5b81611f50565b15612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906143e6565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ba5600083836001612304565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf281612bbd565b8114612bfd57600080fd5b50565b600081359050612c0f81612be9565b92915050565b600060208284031215612c2b57612c2a612bb3565b5b6000612c3984828501612c00565b91505092915050565b60008115159050919050565b612c5781612c42565b82525050565b6000602082019050612c726000830184612c4e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb2578082015181840152602081019050612c97565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cda82612c78565b612ce48185612c83565b9350612cf4818560208601612c94565b612cfd81612cbe565b840191505092915050565b60006020820190508181036000830152612d228184612ccf565b905092915050565b6000819050919050565b612d3d81612d2a565b8114612d4857600080fd5b50565b600081359050612d5a81612d34565b92915050565b600060208284031215612d7657612d75612bb3565b5b6000612d8484828501612d4b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612db882612d8d565b9050919050565b612dc881612dad565b82525050565b6000602082019050612de36000830184612dbf565b92915050565b612df281612dad565b8114612dfd57600080fd5b50565b600081359050612e0f81612de9565b92915050565b60008060408385031215612e2c57612e2b612bb3565b5b6000612e3a85828601612e00565b9250506020612e4b85828601612d4b565b9150509250929050565b612e5e81612d2a565b82525050565b6000602082019050612e796000830184612e55565b92915050565b600080600060608486031215612e9857612e97612bb3565b5b6000612ea686828701612e00565b9350506020612eb786828701612e00565b9250506040612ec886828701612d4b565b9150509250925092565b600060208284031215612ee857612ee7612bb3565b5b6000612ef684828501612e00565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f4182612cbe565b810181811067ffffffffffffffff82111715612f6057612f5f612f09565b5b80604052505050565b6000612f73612ba9565b9050612f7f8282612f38565b919050565b600067ffffffffffffffff821115612f9f57612f9e612f09565b5b612fa882612cbe565b9050602081019050919050565b82818337600083830152505050565b6000612fd7612fd284612f84565b612f69565b905082815260208101848484011115612ff357612ff2612f04565b5b612ffe848285612fb5565b509392505050565b600082601f83011261301b5761301a612eff565b5b813561302b848260208601612fc4565b91505092915050565b60006020828403121561304a57613049612bb3565b5b600082013567ffffffffffffffff81111561306857613067612bb8565b5b61307484828501613006565b91505092915050565b61308681612c42565b811461309157600080fd5b50565b6000813590506130a38161307d565b92915050565b600080604083850312156130c0576130bf612bb3565b5b60006130ce85828601612e00565b92505060206130df85828601613094565b9150509250929050565b600067ffffffffffffffff82111561310457613103612f09565b5b61310d82612cbe565b9050602081019050919050565b600061312d613128846130e9565b612f69565b90508281526020810184848401111561314957613148612f04565b5b613154848285612fb5565b509392505050565b600082601f83011261317157613170612eff565b5b813561318184826020860161311a565b91505092915050565b600080600080608085870312156131a4576131a3612bb3565b5b60006131b287828801612e00565b94505060206131c387828801612e00565b93505060406131d487828801612d4b565b925050606085013567ffffffffffffffff8111156131f5576131f4612bb8565b5b6132018782880161315c565b91505092959194509250565b6000806040838503121561322457613223612bb3565b5b600061323285828601612e00565b925050602061324385828601612e00565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061329457607f821691505b6020821081036132a7576132a661324d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613309602183612c83565b9150613314826132ad565b604082019050919050565b60006020820190508181036000830152613338816132fc565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061339b603d83612c83565b91506133a68261333f565b604082019050919050565b600060208201905081810360008301526133ca8161338e565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061342d602d83612c83565b9150613438826133d1565b604082019050919050565b6000602082019050818103600083015261345c81613420565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134bf602b83612c83565b91506134ca82613463565b604082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613551602c83612c83565b915061355c826134f5565b604082019050919050565b6000602082019050818103600083015261358081613544565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136187fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135db565b61362286836135db565b95508019841693508086168417925050509392505050565b6000819050919050565b600061365f61365a61365584612d2a565b61363a565b612d2a565b9050919050565b6000819050919050565b61367983613644565b61368d61368582613666565b8484546135e8565b825550505050565b600090565b6136a2613695565b6136ad818484613670565b505050565b5b818110156136d1576136c660008261369a565b6001810190506136b3565b5050565b601f821115613716576136e7816135b6565b6136f0846135cb565b810160208510156136ff578190505b61371361370b856135cb565b8301826136b2565b50505b505050565b600082821c905092915050565b60006137396000198460080261371b565b1980831691505092915050565b60006137528383613728565b9150826002028217905092915050565b61376b82612c78565b67ffffffffffffffff81111561378457613783612f09565b5b61378e825461327c565b6137998282856136d5565b600060209050601f8311600181146137cc57600084156137ba578287015190505b6137c48582613746565b86555061382c565b601f1984166137da866135b6565b60005b82811015613802578489015182556001820191506020850194506020810190506137dd565b8683101561381f578489015161381b601f891682613728565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061386a601883612c83565b915061387582613834565b602082019050919050565b600060208201905081810360008301526138998161385d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006138fc602983612c83565b9150613907826138a0565b604082019050919050565b6000602082019050818103600083015261392b816138ef565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061398e602f83612c83565b915061399982613932565b604082019050919050565b600060208201905081810360008301526139bd81613981565b9050919050565b600081905092915050565b60006139da82612c78565b6139e481856139c4565b93506139f4818560208601612c94565b80840191505092915050565b6000613a0c82856139cf565b9150613a1882846139cf565b91508190509392505050565b60008154613a318161327c565b613a3b81866139c4565b94506001821660008114613a565760018114613a6b57613a9e565b60ff1983168652811515820286019350613a9e565b613a74856135b6565b60005b83811015613a9657815481890152600182019150602081019050613a77565b838801955050505b50505092915050565b6000613ab382866139cf565b9150613abf82856139cf565b9150613acb8284613a24565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b1282612d2a565b9150613b1d83612d2a565b9250828201905080821115613b3557613b34613ad8565b5b92915050565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b6000613b71601c83612c83565b9150613b7c82613b3b565b602082019050919050565b60006020820190508181036000830152613ba081613b64565b9050919050565b7f53616c65206d7573742062652061637469766520746f20436172644d6f6e737460008201527f6572732042756e646c6500000000000000000000000000000000000000000000602082015250565b6000613c03602a83612c83565b9150613c0e82613ba7565b604082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f53616c6520776f756c6420657863656564206d61782062616c616e6365000000600082015250565b6000613c6f601d83612c83565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612d2a565b9150613cbb83612d2a565b9250828202613cc981612d2a565b91508282048414831517613ce057613cdf613ad8565b5b5092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613d1d601583612c83565b9150613d2882613ce7565b602082019050919050565b60006020820190508181036000830152613d4c81613d10565b9050919050565b7f43616e206f6e6c79206d696e74203120746f6b656e7320617420612074696d65600082015250565b6000613d89602083612c83565b9150613d9482613d53565b602082019050919050565b60006020820190508181036000830152613db881613d7c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e1b602683612c83565b9150613e2682613dbf565b604082019050919050565b60006020820190508181036000830152613e4a81613e0e565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613ead602583612c83565b9150613eb882613e51565b604082019050919050565b60006020820190508181036000830152613edc81613ea0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f3f602483612c83565b9150613f4a82613ee3565b604082019050919050565b60006020820190508181036000830152613f6e81613f32565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fab602083612c83565b9150613fb682613f75565b602082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614017601983612c83565b915061402282613fe1565b602082019050919050565b600060208201905081810360008301526140468161400a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006140a9603283612c83565b91506140b48261404d565b604082019050919050565b600060208201905081810360008301526140d88161409c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061411982612d2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361414b5761414a613ad8565b5b600182019050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006141b2603583612c83565b91506141bd82614156565b604082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061420f826141e8565b61421981856141f3565b9350614229818560208601612c94565b61423281612cbe565b840191505092915050565b60006080820190506142526000830187612dbf565b61425f6020830186612dbf565b61426c6040830185612e55565b818103606083015261427e8184614204565b905095945050505050565b60008151905061429881612be9565b92915050565b6000602082840312156142b4576142b3612bb3565b5b60006142c284828501614289565b91505092915050565b60006142d682612d2a565b91506142e183612d2a565b92508282039050818111156142f9576142f8613ad8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614364602083612c83565b915061436f8261432e565b602082019050919050565b6000602082019050818103600083015261439381614357565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006143d0601c83612c83565b91506143db8261439a565b602082019050919050565b600060208201905081810360008301526143ff816143c3565b905091905056fea2646970667358221220d2a935b71a0d99769cede2b3737bcc279bde7e0b19a88578f6fd08024db06c3964736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000033687474703a2f2f7777772e636172646d6f6e73746572732e636f2f7374617469632f6a736f6e2f6d6f6e737465722e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): http://www.cardmonsters.co/static/json/monster.json
Arg [1] : initNotRevealedUri (string):

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [3] : 687474703a2f2f7777772e636172646d6f6e73746572732e636f2f7374617469
Arg [4] : 632f6a736f6e2f6d6f6e737465722e6a736f6e00000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

150:3530:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1033:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2406:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3870:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;592:28:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3403:406:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1673:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4547:326:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1341:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;362:41:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2738:80;;;;;;;;;;;;;:::i;:::-;;4939:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1863:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3532:145:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3426:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3068:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2125:219:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;428:36:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;306:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;266:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:204:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:11;;;;;;;;;;;;;:::i;:::-;;494:32:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;533:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2568:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3314:104:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4104:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5184:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;627:37:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1827:652;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;946:565;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3180:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2638:92;;;;;;;;;;;;;:::i;:::-;;4323:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2934:126:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2826:100:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1033:224:4;1135:4;1174:35;1159:50;;;:11;:50;;;;:90;;;;1213:36;1237:11;1213:23;:36::i;:::-;1159:90;1152:97;;1033:224;;;:::o;2406:98:3:-;2460:13;2492:5;2485:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2406:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;4006:15;:24;4022:7;4006:24;;;;;;;;;;;;;;;;;;;;;3999:31;;3870:167;;;:::o;592:28:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3403:406:3:-;3483:13;3499:23;3514:7;3499:14;:23::i;:::-;3483:39;;3546:5;3540:11;;:2;:11;;;3532:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3637:5;3621:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3646:37;3663:5;3670:12;:10;:12::i;:::-;3646:16;:37::i;:::-;3621:62;3600:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3473:336;3403:406;;:::o;1673:113:4:-;1734:7;1761:10;:17;;;;1754:24;;1673:113;:::o;4547:326:3:-;4736:41;4755:12;:10;:12::i;:::-;4769:7;4736:18;:41::i;:::-;4728:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4838:28;4848:4;4854:2;4858:7;4838:9;:28::i;:::-;4547:326;;;:::o;1341:256:4:-;1438:7;1474:23;1491:5;1474:16;:23::i;:::-;1466:5;:31;1458:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1563:12;:19;1576:5;1563:19;;;;;;;;;;;;;;;:26;1583:5;1563:26;;;;;;;;;;;;1556:33;;1341:256;;;;:::o;362:41:13:-;399:4;362:41;:::o;2738:80::-;1087:13:11;:11;:13::i;:::-;2801:9:13::1;;;;;;;;;;;2800:10;2788:9;;:22;;;;;;;;;;;;;;;;;;2738:80::o:0;4939:179:3:-;5072:39;5089:4;5095:2;5099:7;5072:39;;;;;;;;;;;;:16;:39::i;:::-;4939:179;;;:::o;1863:233:4:-;1938:7;1974:30;:28;:30::i;:::-;1966:5;:38;1958:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2071:10;2082:5;2071:17;;;;;;;;:::i;:::-;;;;;;;;;;2064:24;;1863:233;;;:::o;3532:145:13:-;1087:13:11;:11;:13::i;:::-;3590:15:13::1;3608:21;3590:39;;3648:2;3640:20;;:29;3661:7;3640:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3579:98;3532:145:::0;:::o;3426:92::-;1087:13:11;:11;:13::i;:::-;3502:8:13::1;3492:7;:18;;;;3426:92:::0;:::o;3068:104::-;1087:13:11;:11;:13::i;:::-;3153:11:13::1;3143:7;:21;;;;;;:::i;:::-;;3068:104:::0;:::o;2125:219:3:-;2197:7;2216:13;2232:17;2241:7;2232:8;:17::i;:::-;2216:33;;2284:1;2267:19;;:5;:19;;;2259:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2332:5;2325:12;;;2125:219;;;:::o;428:36:13:-;;;;:::o;306:29::-;;;;;;;;;;;;;:::o;266:33::-;;;;;;;;;;;;;:::o;1864:204:3:-;1936:7;1980:1;1963:19;;:5;:19;;;1955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2045:9;:16;2055:5;2045:16;;;;;;;;;;;;;;;;2038:23;;1864:204;;;:::o;1824:101:11:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;494:32:13:-;;;;:::o;533:29::-;;;;:::o;1194:85:11:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2568:102:3:-;2624:13;2656:7;2649:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2568:102;:::o;3314:104:13:-;1087:13:11;:11;:13::i;:::-;3399:11:13::1;3386:10;:24;;;;3314:104:::0;:::o;4104:153:3:-;4198:52;4217:12;:10;:12::i;:::-;4231:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;5184:314::-;5352:41;5371:12;:10;:12::i;:::-;5385:7;5352:18;:41::i;:::-;5344:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5453:38;5467:4;5473:2;5477:7;5486:4;5453:13;:38::i;:::-;5184:314;;;;:::o;627:37:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1827:652::-;1899:13;1932:16;1940:7;1932;:16::i;:::-;1924:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2027:5;2014:18;;:9;;;;;;;;;;;:18;;;2010:72;;2056:14;2049:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2010:72;2092:23;2118:10;:19;2129:7;2118:19;;;;;;;;;;;2092:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2148:18;2169:10;:8;:10::i;:::-;2148:31;;2216:1;2200:4;2194:18;:23;2190:72;;2241:9;2234:16;;;;;;2190:72;2302:1;2282:9;2276:23;:27;2272:108;;;2351:4;2357:9;2334:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2320:48;;;;;;2272:108;2430:4;2436:18;:7;:16;:18::i;:::-;2456:13;2413:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2390:81;;;;1827:652;;;;:::o;946:565::-;399:4;1051:13;1035;:11;:13::i;:::-;:29;;;;:::i;:::-;:43;;1027:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;1129:13;;;;;;;;;;;1121:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1249:10;;1232:13;1208:21;1218:10;1208:9;:21::i;:::-;:37;;;;:::i;:::-;:51;;1200:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;1340:9;1327;;1311:13;:25;;;;:::i;:::-;:38;;1303:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1410:7;;1393:13;:24;;1385:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1465:38;1489:13;1465:23;:38::i;:::-;946:565;:::o;3180:126::-;1087:13:11;:11;:13::i;:::-;3281:17:13::1;3265:13;:33;;;;;;:::i;:::-;;3180:126:::0;:::o;2638:92::-;1087:13:11;:11;:13::i;:::-;2709::13::1;;;;;;;;;;;2708:14;2692:13;;:30;;;;;;;;;;;;;;;;;;2638:92::o:0;4323:162:3:-;4420:4;4443:18;:25;4462:5;4443:25;;;;;;;;;;;;;;;:35;4469:8;4443:35;;;;;;;;;;;;;;;;;;;;;;;;;4436:42;;4323:162;;;;:::o;2934:126:13:-;1087:13:11;:11;:13::i;:::-;3037:15:13::1;3020:14;:32;;;;;;:::i;:::-;;2934:126:::0;:::o;2074:198:11:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;2826:100:13:-;1087:13:11;:11;:13::i;:::-;2908:10:13::1;2896:9;:22;;;;2826:100:::0;:::o;1505:300:3:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;13401:133::-;13482:16;13490:7;13482;:16::i;:::-;13474:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13401:133;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12703:171:3:-;12804:2;12777:15;:24;12793:7;12777:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12859:7;12855:2;12821:46;;12830:23;12845:7;12830:14;:23::i;:::-;12821:46;;;;;;;;;;;;12703:171;;:::o;7475:261::-;7568:4;7584:13;7600:23;7615:7;7600:14;:23::i;:::-;7584:39;;7652:5;7641:16;;:7;:16;;;:52;;;;7661:32;7678:5;7685:7;7661:16;:32::i;:::-;7641:52;:87;;;;7721:7;7697:31;;:20;7709:7;7697:11;:20::i;:::-;:31;;;7641:87;7633:96;;;7475:261;;;;:::o;11358:1233::-;11512:4;11485:31;;:23;11500:7;11485:14;:23::i;:::-;:31;;;11477:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11590:1;11576:16;;:2;:16;;;11568:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11644:42;11665:4;11671:2;11675:7;11684:1;11644:20;:42::i;:::-;11813:4;11786:31;;:23;11801:7;11786:14;:23::i;:::-;:31;;;11778:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11928:15;:24;11944:7;11928:24;;;;;;;;;;;;11921:31;;;;;;;;;;;12415:1;12396:9;:15;12406:4;12396:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12447:1;12430:9;:13;12440:2;12430:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12487:2;12468:7;:16;12476:7;12468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12524:7;12520:2;12505:27;;12514:4;12505:27;;;;;;;;;;;;12543:41;12563:4;12569:2;12573:7;12582:1;12543:19;:41::i;:::-;11358:1233;;;:::o;1352:130:11:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;6773:115:3:-;6839:7;6865;:16;6873:7;6865:16;;;;;;;;;;;;;;;;;;;;;6858:23;;6773:115;;;:::o;2426:187:11:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;13010:307:3:-;13160:8;13151:17;;:5;:17;;;13143:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13246:8;13208:18;:25;13227:5;13208:25;;;;;;;;;;;;;;;:35;13234:8;13208:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13291:8;13269:41;;13284:5;13269:41;;;13301:8;13269:41;;;;;;:::i;:::-;;;;;;;;13010:307;;;:::o;6359:305::-;6509:28;6519:4;6525:2;6529:7;6509:9;:28::i;:::-;6555:47;6578:4;6584:2;6588:7;6597:4;6555:22;:47::i;:::-;6547:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6359:305;;;;:::o;7191:126::-;7256:4;7308:1;7279:31;;:17;7288:7;7279:8;:17::i;:::-;:31;;;;7272:38;;7191:126;;;:::o;2504:108:13:-;2564:13;2597:7;2590:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2504:108;:::o;410:696:12:-;466:13;515:14;552:1;532:17;543:5;532:10;:17::i;:::-;:21;515:38;;567:20;601:6;590:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:41;;622:11;748:6;744:2;740:15;732:6;728:28;721:35;;783:280;790:4;783:280;;;814:5;;;;;;;;953:8;948:2;941:5;937:14;932:30;927:3;919:44;1007:2;998:11;;;;;;:::i;:::-;;;;;1040:1;1031:5;:10;783:280;1027:21;783:280;1083:6;1076:13;;;;;410:696;;;:::o;1519:300:13:-;1600:9;1595:217;1619:13;1615:1;:17;1595:217;;;1654:17;1674:13;:11;:13::i;:::-;1654:33;;399:4;1706:13;:11;:13::i;:::-;:26;1702:99;;;1753:32;1763:10;1775:9;1753;:32::i;:::-;1702:99;1639:173;1634:3;;;;;:::i;:::-;;;;1595:217;;;;1519:300;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2170:915:4:-;2347:61;2374:4;2380:2;2384:12;2398:9;2347:26;:61::i;:::-;2437:1;2425:9;:13;2421:222;;;2568:63;;;;;;;;;;:::i;:::-;;;;;;;;2421:222;2655:15;2673:12;2655:30;;2718:1;2702:18;;:4;:18;;;2698:187;;2737:40;2769:7;2737:31;:40::i;:::-;2698:187;;;2807:2;2799:10;;:4;:10;;;2795:90;;2826:47;2859:4;2865:7;2826:32;:47::i;:::-;2795:90;2698:187;2913:1;2899:16;;:2;:16;;;2895:183;;2932:45;2969:7;2932:36;:45::i;:::-;2895:183;;;3005:4;2999:10;;:2;:10;;;2995:83;;3026:40;3054:2;3058:7;3026:27;:40::i;:::-;2995:83;2895:183;2336:749;2170:915;;;;:::o;16493:153:3:-;;;;;:::o;14086:831::-;14235:4;14255:15;:2;:13;;;:15::i;:::-;14251:660;;;14306:2;14290:36;;;14327:12;:10;:12::i;:::-;14341:4;14347:7;14356:4;14290:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14286:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14545:1;14528:6;:13;:18;14524:321;;14570:60;;;;;;;;;;:::i;:::-;;;;;;;;14524:321;14797:6;14791:13;14782:6;14778:2;14774:15;14767:38;14286:573;14421:41;;;14411:51;;;:6;:51;;;;14404:58;;;;;14251:660;14896:4;14889:11;;14086:831;;;;;;;:::o;10146:922:10:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::o;8066:108:3:-;8141:26;8151:2;8155:7;8141:26;;;;;;;;;;;;:9;:26::i;:::-;8066:108;;:::o;15633:154::-;;;;;:::o;3808:164:4:-;3912:10;:17;;;;3885:15;:24;3901:7;3885:24;;;;;;;;;;;:44;;;;3940:10;3956:7;3940:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3808:164;:::o;4599:988::-;4865:22;4915:1;4890:22;4907:4;4890:16;:22::i;:::-;:26;;;;:::i;:::-;4865:51;;4927:18;4948:17;:26;4966:7;4948:26;;;;;;;;;;;;4927:47;;5095:14;5081:10;:28;5077:328;;5126:19;5148:12;:18;5161:4;5148:18;;;;;;;;;;;;;;;:34;5167:14;5148:34;;;;;;;;;;;;5126:56;;5232:11;5199:12;:18;5212:4;5199:18;;;;;;;;;;;;;;;:30;5218:10;5199:30;;;;;;;;;;;:44;;;;5349:10;5316:17;:30;5334:11;5316:30;;;;;;;;;;;:43;;;;5111:294;5077:328;5501:17;:26;5519:7;5501:26;;;;;;;;;;;5494:33;;;5545:12;:18;5558:4;5545:18;;;;;;;;;;;;;;;:34;5564:14;5545:34;;;;;;;;;;;5538:41;;;4680:907;;4599:988;;:::o;5882:1079::-;6135:22;6180:1;6160:10;:17;;;;:21;;;;:::i;:::-;6135:46;;6192:18;6213:15;:24;6229:7;6213:24;;;;;;;;;;;;6192:45;;6564:19;6586:10;6597:14;6586:26;;;;;;;;:::i;:::-;;;;;;;;;;6564:48;;6650:11;6625:10;6636;6625:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6761:10;6730:15;:28;6746:11;6730:28;;;;;;;;;;;:41;;;;6902:15;:24;6918:7;6902:24;;;;;;;;;;;6895:31;;;6937:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5953:1008;;;5882:1079;:::o;3386:221::-;3471:14;3488:20;3505:2;3488:16;:20::i;:::-;3471:37;;3546:7;3519:12;:16;3532:2;3519:16;;;;;;;;;;;;;;;:24;3536:6;3519:24;;;;;;;;;;;:34;;;;3593:6;3564:17;:26;3582:7;3564:26;;;;;;;;;;;:35;;;;3460:147;3386:221;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;8395:309:3:-;8519:18;8525:2;8529:7;8519:5;:18::i;:::-;8568:53;8599:1;8603:2;8607:7;8616:4;8568:22;:53::i;:::-;8547:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8395:309;;;:::o;9026:920::-;9119:1;9105:16;;:2;:16;;;9097:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9177:16;9185:7;9177;:16::i;:::-;9176:17;9168:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9237:48;9266:1;9270:2;9274:7;9283:1;9237:20;:48::i;:::-;9381:16;9389:7;9381;:16::i;:::-;9380:17;9372:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9789:1;9772:9;:13;9782:2;9772:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9830:2;9811:7;:16;9819:7;9811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9873:7;9869:2;9848:33;;9865:1;9848:33;;;;;;;;;;;;9892:47;9920:1;9924:2;9928:7;9937:1;9892:19;:47::i;:::-;9026:920;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:220::-;12743:34;12739:1;12731:6;12727:14;12720:58;12812:3;12807:2;12799:6;12795:15;12788:28;12603:220;:::o;12829:366::-;12971:3;12992:67;13056:2;13051:3;12992:67;:::i;:::-;12985:74;;13068:93;13157:3;13068:93;:::i;:::-;13186:2;13181:3;13177:12;13170:19;;12829:366;;;:::o;13201:419::-;13367:4;13405:2;13394:9;13390:18;13382:26;;13454:9;13448:4;13444:20;13440:1;13429:9;13425:17;13418:47;13482:131;13608:4;13482:131;:::i;:::-;13474:139;;13201:419;;;:::o;13626:248::-;13766:34;13762:1;13754:6;13750:14;13743:58;13835:31;13830:2;13822:6;13818:15;13811:56;13626:248;:::o;13880:366::-;14022:3;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14119:93;14208:3;14119:93;:::i;:::-;14237:2;14232:3;14228:12;14221:19;;13880:366;;;:::o;14252:419::-;14418:4;14456:2;14445:9;14441:18;14433:26;;14505:9;14499:4;14495:20;14491:1;14480:9;14476:17;14469:47;14533:131;14659:4;14533:131;:::i;:::-;14525:139;;14252:419;;;:::o;14677:232::-;14817:34;14813:1;14805:6;14801:14;14794:58;14886:15;14881:2;14873:6;14869:15;14862:40;14677:232;:::o;14915:366::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;14915:366;;;:::o;15287:419::-;15453:4;15491:2;15480:9;15476:18;15468:26;;15540:9;15534:4;15530:20;15526:1;15515:9;15511:17;15504:47;15568:131;15694:4;15568:131;:::i;:::-;15560:139;;15287:419;;;:::o;15712:230::-;15852:34;15848:1;15840:6;15836:14;15829:58;15921:13;15916:2;15908:6;15904:15;15897:38;15712:230;:::o;15948:366::-;16090:3;16111:67;16175:2;16170:3;16111:67;:::i;:::-;16104:74;;16187:93;16276:3;16187:93;:::i;:::-;16305:2;16300:3;16296:12;16289:19;;15948:366;;;:::o;16320:419::-;16486:4;16524:2;16513:9;16509:18;16501:26;;16573:9;16567:4;16563:20;16559:1;16548:9;16544:17;16537:47;16601:131;16727:4;16601:131;:::i;:::-;16593:139;;16320:419;;;:::o;16745:231::-;16885:34;16881:1;16873:6;16869:14;16862:58;16954:14;16949:2;16941:6;16937:15;16930:39;16745:231;:::o;16982:366::-;17124:3;17145:67;17209:2;17204:3;17145:67;:::i;:::-;17138:74;;17221:93;17310:3;17221:93;:::i;:::-;17339:2;17334:3;17330:12;17323:19;;16982:366;;;:::o;17354:419::-;17520:4;17558:2;17547:9;17543:18;17535:26;;17607:9;17601:4;17597:20;17593:1;17582:9;17578:17;17571:47;17635:131;17761:4;17635:131;:::i;:::-;17627:139;;17354:419;;;:::o;17779:180::-;17827:77;17824:1;17817:88;17924:4;17921:1;17914:15;17948:4;17945:1;17938:15;17965:141;18014:4;18037:3;18029:11;;18060:3;18057:1;18050:14;18094:4;18091:1;18081:18;18073:26;;17965:141;;;:::o;18112:93::-;18149:6;18196:2;18191;18184:5;18180:14;18176:23;18166:33;;18112:93;;;:::o;18211:107::-;18255:8;18305:5;18299:4;18295:16;18274:37;;18211:107;;;;:::o;18324:393::-;18393:6;18443:1;18431:10;18427:18;18466:97;18496:66;18485:9;18466:97;:::i;:::-;18584:39;18614:8;18603:9;18584:39;:::i;:::-;18572:51;;18656:4;18652:9;18645:5;18641:21;18632:30;;18705:4;18695:8;18691:19;18684:5;18681:30;18671:40;;18400:317;;18324:393;;;;;:::o;18723:60::-;18751:3;18772:5;18765:12;;18723:60;;;:::o;18789:142::-;18839:9;18872:53;18890:34;18899:24;18917:5;18899:24;:::i;:::-;18890:34;:::i;:::-;18872:53;:::i;:::-;18859:66;;18789:142;;;:::o;18937:75::-;18980:3;19001:5;18994:12;;18937:75;;;:::o;19018:269::-;19128:39;19159:7;19128:39;:::i;:::-;19189:91;19238:41;19262:16;19238:41;:::i;:::-;19230:6;19223:4;19217:11;19189:91;:::i;:::-;19183:4;19176:105;19094:193;19018:269;;;:::o;19293:73::-;19338:3;19293:73;:::o;19372:189::-;19449:32;;:::i;:::-;19490:65;19548:6;19540;19534:4;19490:65;:::i;:::-;19425:136;19372:189;;:::o;19567:186::-;19627:120;19644:3;19637:5;19634:14;19627:120;;;19698:39;19735:1;19728:5;19698:39;:::i;:::-;19671:1;19664:5;19660:13;19651:22;;19627:120;;;19567:186;;:::o;19759:543::-;19860:2;19855:3;19852:11;19849:446;;;19894:38;19926:5;19894:38;:::i;:::-;19978:29;19996:10;19978:29;:::i;:::-;19968:8;19964:44;20161:2;20149:10;20146:18;20143:49;;;20182:8;20167:23;;20143:49;20205:80;20261:22;20279:3;20261:22;:::i;:::-;20251:8;20247:37;20234:11;20205:80;:::i;:::-;19864:431;;19849:446;19759:543;;;:::o;20308:117::-;20362:8;20412:5;20406:4;20402:16;20381:37;;20308:117;;;;:::o;20431:169::-;20475:6;20508:51;20556:1;20552:6;20544:5;20541:1;20537:13;20508:51;:::i;:::-;20504:56;20589:4;20583;20579:15;20569:25;;20482:118;20431:169;;;;:::o;20605:295::-;20681:4;20827:29;20852:3;20846:4;20827:29;:::i;:::-;20819:37;;20889:3;20886:1;20882:11;20876:4;20873:21;20865:29;;20605:295;;;;:::o;20905:1395::-;21022:37;21055:3;21022:37;:::i;:::-;21124:18;21116:6;21113:30;21110:56;;;21146:18;;:::i;:::-;21110:56;21190:38;21222:4;21216:11;21190:38;:::i;:::-;21275:67;21335:6;21327;21321:4;21275:67;:::i;:::-;21369:1;21393:4;21380:17;;21425:2;21417:6;21414:14;21442:1;21437:618;;;;22099:1;22116:6;22113:77;;;22165:9;22160:3;22156:19;22150:26;22141:35;;22113:77;22216:67;22276:6;22269:5;22216:67;:::i;:::-;22210:4;22203:81;22072:222;21407:887;;21437:618;21489:4;21485:9;21477:6;21473:22;21523:37;21555:4;21523:37;:::i;:::-;21582:1;21596:208;21610:7;21607:1;21604:14;21596:208;;;21689:9;21684:3;21680:19;21674:26;21666:6;21659:42;21740:1;21732:6;21728:14;21718:24;;21787:2;21776:9;21772:18;21759:31;;21633:4;21630:1;21626:12;21621:17;;21596:208;;;21832:6;21823:7;21820:19;21817:179;;;21890:9;21885:3;21881:19;21875:26;21933:48;21975:4;21967:6;21963:17;21952:9;21933:48;:::i;:::-;21925:6;21918:64;21840:156;21817:179;22042:1;22038;22030:6;22026:14;22022:22;22016:4;22009:36;21444:611;;;21407:887;;20997:1303;;;20905:1395;;:::o;22306:174::-;22446:26;22442:1;22434:6;22430:14;22423:50;22306:174;:::o;22486:366::-;22628:3;22649:67;22713:2;22708:3;22649:67;:::i;:::-;22642:74;;22725:93;22814:3;22725:93;:::i;:::-;22843:2;22838:3;22834:12;22827:19;;22486:366;;;:::o;22858:419::-;23024:4;23062:2;23051:9;23047:18;23039:26;;23111:9;23105:4;23101:20;23097:1;23086:9;23082:17;23075:47;23139:131;23265:4;23139:131;:::i;:::-;23131:139;;22858:419;;;:::o;23283:228::-;23423:34;23419:1;23411:6;23407:14;23400:58;23492:11;23487:2;23479:6;23475:15;23468:36;23283:228;:::o;23517:366::-;23659:3;23680:67;23744:2;23739:3;23680:67;:::i;:::-;23673:74;;23756:93;23845:3;23756:93;:::i;:::-;23874:2;23869:3;23865:12;23858:19;;23517:366;;;:::o;23889:419::-;24055:4;24093:2;24082:9;24078:18;24070:26;;24142:9;24136:4;24132:20;24128:1;24117:9;24113:17;24106:47;24170:131;24296:4;24170:131;:::i;:::-;24162:139;;23889:419;;;:::o;24314:234::-;24454:34;24450:1;24442:6;24438:14;24431:58;24523:17;24518:2;24510:6;24506:15;24499:42;24314:234;:::o;24554:366::-;24696:3;24717:67;24781:2;24776:3;24717:67;:::i;:::-;24710:74;;24793:93;24882:3;24793:93;:::i;:::-;24911:2;24906:3;24902:12;24895:19;;24554:366;;;:::o;24926:419::-;25092:4;25130:2;25119:9;25115:18;25107:26;;25179:9;25173:4;25169:20;25165:1;25154:9;25150:17;25143:47;25207:131;25333:4;25207:131;:::i;:::-;25199:139;;24926:419;;;:::o;25351:148::-;25453:11;25490:3;25475:18;;25351:148;;;;:::o;25505:390::-;25611:3;25639:39;25672:5;25639:39;:::i;:::-;25694:89;25776:6;25771:3;25694:89;:::i;:::-;25687:96;;25792:65;25850:6;25845:3;25838:4;25831:5;25827:16;25792:65;:::i;:::-;25882:6;25877:3;25873:16;25866:23;;25615:280;25505:390;;;;:::o;25901:435::-;26081:3;26103:95;26194:3;26185:6;26103:95;:::i;:::-;26096:102;;26215:95;26306:3;26297:6;26215:95;:::i;:::-;26208:102;;26327:3;26320:10;;25901:435;;;;;:::o;26366:874::-;26469:3;26506:5;26500:12;26535:36;26561:9;26535:36;:::i;:::-;26587:89;26669:6;26664:3;26587:89;:::i;:::-;26580:96;;26707:1;26696:9;26692:17;26723:1;26718:166;;;;26898:1;26893:341;;;;26685:549;;26718:166;26802:4;26798:9;26787;26783:25;26778:3;26771:38;26864:6;26857:14;26850:22;26842:6;26838:35;26833:3;26829:45;26822:52;;26718:166;;26893:341;26960:38;26992:5;26960:38;:::i;:::-;27020:1;27034:154;27048:6;27045:1;27042:13;27034:154;;;27122:7;27116:14;27112:1;27107:3;27103:11;27096:35;27172:1;27163:7;27159:15;27148:26;;27070:4;27067:1;27063:12;27058:17;;27034:154;;;27217:6;27212:3;27208:16;27201:23;;26900:334;;26685:549;;26473:767;;26366:874;;;;:::o;27246:589::-;27471:3;27493:95;27584:3;27575:6;27493:95;:::i;:::-;27486:102;;27605:95;27696:3;27687:6;27605:95;:::i;:::-;27598:102;;27717:92;27805:3;27796:6;27717:92;:::i;:::-;27710:99;;27826:3;27819:10;;27246:589;;;;;;:::o;27841:180::-;27889:77;27886:1;27879:88;27986:4;27983:1;27976:15;28010:4;28007:1;28000:15;28027:191;28067:3;28086:20;28104:1;28086:20;:::i;:::-;28081:25;;28120:20;28138:1;28120:20;:::i;:::-;28115:25;;28163:1;28160;28156:9;28149:16;;28184:3;28181:1;28178:10;28175:36;;;28191:18;;:::i;:::-;28175:36;28027:191;;;;:::o;28224:178::-;28364:30;28360:1;28352:6;28348:14;28341:54;28224:178;:::o;28408:366::-;28550:3;28571:67;28635:2;28630:3;28571:67;:::i;:::-;28564:74;;28647:93;28736:3;28647:93;:::i;:::-;28765:2;28760:3;28756:12;28749:19;;28408:366;;;:::o;28780:419::-;28946:4;28984:2;28973:9;28969:18;28961:26;;29033:9;29027:4;29023:20;29019:1;29008:9;29004:17;28997:47;29061:131;29187:4;29061:131;:::i;:::-;29053:139;;28780:419;;;:::o;29205:229::-;29345:34;29341:1;29333:6;29329:14;29322:58;29414:12;29409:2;29401:6;29397:15;29390:37;29205:229;:::o;29440:366::-;29582:3;29603:67;29667:2;29662:3;29603:67;:::i;:::-;29596:74;;29679:93;29768:3;29679:93;:::i;:::-;29797:2;29792:3;29788:12;29781:19;;29440:366;;;:::o;29812:419::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:179::-;30377:31;30373:1;30365:6;30361:14;30354:55;30237:179;:::o;30422:366::-;30564:3;30585:67;30649:2;30644:3;30585:67;:::i;:::-;30578:74;;30661:93;30750:3;30661:93;:::i;:::-;30779:2;30774:3;30770:12;30763:19;;30422:366;;;:::o;30794:419::-;30960:4;30998:2;30987:9;30983:18;30975:26;;31047:9;31041:4;31037:20;31033:1;31022:9;31018:17;31011:47;31075:131;31201:4;31075:131;:::i;:::-;31067:139;;30794:419;;;:::o;31219:410::-;31259:7;31282:20;31300:1;31282:20;:::i;:::-;31277:25;;31316:20;31334:1;31316:20;:::i;:::-;31311:25;;31371:1;31368;31364:9;31393:30;31411:11;31393:30;:::i;:::-;31382:41;;31572:1;31563:7;31559:15;31556:1;31553:22;31533:1;31526:9;31506:83;31483:139;;31602:18;;:::i;:::-;31483:139;31267:362;31219:410;;;;:::o;31635:171::-;31775:23;31771:1;31763:6;31759:14;31752:47;31635:171;:::o;31812:366::-;31954:3;31975:67;32039:2;32034:3;31975:67;:::i;:::-;31968:74;;32051:93;32140:3;32051:93;:::i;:::-;32169:2;32164:3;32160:12;32153:19;;31812:366;;;:::o;32184:419::-;32350:4;32388:2;32377:9;32373:18;32365:26;;32437:9;32431:4;32427:20;32423:1;32412:9;32408:17;32401:47;32465:131;32591:4;32465:131;:::i;:::-;32457:139;;32184:419;;;:::o;32609:182::-;32749:34;32745:1;32737:6;32733:14;32726:58;32609:182;:::o;32797:366::-;32939:3;32960:67;33024:2;33019:3;32960:67;:::i;:::-;32953:74;;33036:93;33125:3;33036:93;:::i;:::-;33154:2;33149:3;33145:12;33138:19;;32797:366;;;:::o;33169:419::-;33335:4;33373:2;33362:9;33358:18;33350:26;;33422:9;33416:4;33412:20;33408:1;33397:9;33393:17;33386:47;33450:131;33576:4;33450:131;:::i;:::-;33442:139;;33169:419;;;:::o;33594:225::-;33734:34;33730:1;33722:6;33718:14;33711:58;33803:8;33798:2;33790:6;33786:15;33779:33;33594:225;:::o;33825:366::-;33967:3;33988:67;34052:2;34047:3;33988:67;:::i;:::-;33981:74;;34064:93;34153:3;34064:93;:::i;:::-;34182:2;34177:3;34173:12;34166:19;;33825:366;;;:::o;34197:419::-;34363:4;34401:2;34390:9;34386:18;34378:26;;34450:9;34444:4;34440:20;34436:1;34425:9;34421:17;34414:47;34478:131;34604:4;34478:131;:::i;:::-;34470:139;;34197:419;;;:::o;34622:224::-;34762:34;34758:1;34750:6;34746:14;34739:58;34831:7;34826:2;34818:6;34814:15;34807:32;34622:224;:::o;34852:366::-;34994:3;35015:67;35079:2;35074:3;35015:67;:::i;:::-;35008:74;;35091:93;35180:3;35091:93;:::i;:::-;35209:2;35204:3;35200:12;35193:19;;34852:366;;;:::o;35224:419::-;35390:4;35428:2;35417:9;35413:18;35405:26;;35477:9;35471:4;35467:20;35463:1;35452:9;35448:17;35441:47;35505:131;35631:4;35505:131;:::i;:::-;35497:139;;35224:419;;;:::o;35649:223::-;35789:34;35785:1;35777:6;35773:14;35766:58;35858:6;35853:2;35845:6;35841:15;35834:31;35649:223;:::o;35878:366::-;36020:3;36041:67;36105:2;36100:3;36041:67;:::i;:::-;36034:74;;36117:93;36206:3;36117:93;:::i;:::-;36235:2;36230:3;36226:12;36219:19;;35878:366;;;:::o;36250:419::-;36416:4;36454:2;36443:9;36439:18;36431:26;;36503:9;36497:4;36493:20;36489:1;36478:9;36474:17;36467:47;36531:131;36657:4;36531:131;:::i;:::-;36523:139;;36250:419;;;:::o;36675:182::-;36815:34;36811:1;36803:6;36799:14;36792:58;36675:182;:::o;36863:366::-;37005:3;37026:67;37090:2;37085:3;37026:67;:::i;:::-;37019:74;;37102:93;37191:3;37102:93;:::i;:::-;37220:2;37215:3;37211:12;37204:19;;36863:366;;;:::o;37235:419::-;37401:4;37439:2;37428:9;37424:18;37416:26;;37488:9;37482:4;37478:20;37474:1;37463:9;37459:17;37452:47;37516:131;37642:4;37516:131;:::i;:::-;37508:139;;37235:419;;;:::o;37660:175::-;37800:27;37796:1;37788:6;37784:14;37777:51;37660:175;:::o;37841:366::-;37983:3;38004:67;38068:2;38063:3;38004:67;:::i;:::-;37997:74;;38080:93;38169:3;38080:93;:::i;:::-;38198:2;38193:3;38189:12;38182:19;;37841:366;;;:::o;38213:419::-;38379:4;38417:2;38406:9;38402:18;38394:26;;38466:9;38460:4;38456:20;38452:1;38441:9;38437:17;38430:47;38494:131;38620:4;38494:131;:::i;:::-;38486:139;;38213:419;;;:::o;38638:237::-;38778:34;38774:1;38766:6;38762:14;38755:58;38847:20;38842:2;38834:6;38830:15;38823:45;38638:237;:::o;38881:366::-;39023:3;39044:67;39108:2;39103:3;39044:67;:::i;:::-;39037:74;;39120:93;39209:3;39120:93;:::i;:::-;39238:2;39233:3;39229:12;39222:19;;38881:366;;;:::o;39253:419::-;39419:4;39457:2;39446:9;39442:18;39434:26;;39506:9;39500:4;39496:20;39492:1;39481:9;39477:17;39470:47;39534:131;39660:4;39534:131;:::i;:::-;39526:139;;39253:419;;;:::o;39678:180::-;39726:77;39723:1;39716:88;39823:4;39820:1;39813:15;39847:4;39844:1;39837:15;39864:233;39903:3;39926:24;39944:5;39926:24;:::i;:::-;39917:33;;39972:66;39965:5;39962:77;39959:103;;40042:18;;:::i;:::-;39959:103;40089:1;40082:5;40078:13;40071:20;;39864:233;;;:::o;40103:240::-;40243:34;40239:1;40231:6;40227:14;40220:58;40312:23;40307:2;40299:6;40295:15;40288:48;40103:240;:::o;40349:366::-;40491:3;40512:67;40576:2;40571:3;40512:67;:::i;:::-;40505:74;;40588:93;40677:3;40588:93;:::i;:::-;40706:2;40701:3;40697:12;40690:19;;40349:366;;;:::o;40721:419::-;40887:4;40925:2;40914:9;40910:18;40902:26;;40974:9;40968:4;40964:20;40960:1;40949:9;40945:17;40938:47;41002:131;41128:4;41002:131;:::i;:::-;40994:139;;40721:419;;;:::o;41146:98::-;41197:6;41231:5;41225:12;41215:22;;41146:98;;;:::o;41250:168::-;41333:11;41367:6;41362:3;41355:19;41407:4;41402:3;41398:14;41383:29;;41250:168;;;;:::o;41424:373::-;41510:3;41538:38;41570:5;41538:38;:::i;:::-;41592:70;41655:6;41650:3;41592:70;:::i;:::-;41585:77;;41671:65;41729:6;41724:3;41717:4;41710:5;41706:16;41671:65;:::i;:::-;41761:29;41783:6;41761:29;:::i;:::-;41756:3;41752:39;41745:46;;41514:283;41424:373;;;;:::o;41803:640::-;41998:4;42036:3;42025:9;42021:19;42013:27;;42050:71;42118:1;42107:9;42103:17;42094:6;42050:71;:::i;:::-;42131:72;42199:2;42188:9;42184:18;42175:6;42131:72;:::i;:::-;42213;42281:2;42270:9;42266:18;42257:6;42213:72;:::i;:::-;42332:9;42326:4;42322:20;42317:2;42306:9;42302:18;42295:48;42360:76;42431:4;42422:6;42360:76;:::i;:::-;42352:84;;41803:640;;;;;;;:::o;42449:141::-;42505:5;42536:6;42530:13;42521:22;;42552:32;42578:5;42552:32;:::i;:::-;42449:141;;;;:::o;42596:349::-;42665:6;42714:2;42702:9;42693:7;42689:23;42685:32;42682:119;;;42720:79;;:::i;:::-;42682:119;42840:1;42865:63;42920:7;42911:6;42900:9;42896:22;42865:63;:::i;:::-;42855:73;;42811:127;42596:349;;;;:::o;42951:194::-;42991:4;43011:20;43029:1;43011:20;:::i;:::-;43006:25;;43045:20;43063:1;43045:20;:::i;:::-;43040:25;;43089:1;43086;43082:9;43074:17;;43113:1;43107:4;43104:11;43101:37;;;43118:18;;:::i;:::-;43101:37;42951:194;;;;:::o;43151:180::-;43199:77;43196:1;43189:88;43296:4;43293:1;43286:15;43320:4;43317:1;43310:15;43337:182;43477:34;43473:1;43465:6;43461:14;43454:58;43337:182;:::o;43525:366::-;43667:3;43688:67;43752:2;43747:3;43688:67;:::i;:::-;43681:74;;43764:93;43853:3;43764:93;:::i;:::-;43882:2;43877:3;43873:12;43866:19;;43525:366;;;:::o;43897:419::-;44063:4;44101:2;44090:9;44086:18;44078:26;;44150:9;44144:4;44140:20;44136:1;44125:9;44121:17;44114:47;44178:131;44304:4;44178:131;:::i;:::-;44170:139;;43897:419;;;:::o;44322:178::-;44462:30;44458:1;44450:6;44446:14;44439:54;44322:178;:::o;44506:366::-;44648:3;44669:67;44733:2;44728:3;44669:67;:::i;:::-;44662:74;;44745:93;44834:3;44745:93;:::i;:::-;44863:2;44858:3;44854:12;44847:19;;44506:366;;;:::o;44878:419::-;45044:4;45082:2;45071:9;45067:18;45059:26;;45131:9;45125:4;45121:20;45117:1;45106:9;45102:17;45095:47;45159:131;45285:4;45159:131;:::i;:::-;45151:139;;44878:419;;;:::o

Swarm Source

ipfs://d2a935b71a0d99769cede2b3737bcc279bde7e0b19a88578f6fd08024db06c39
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.