ETH Price: $3,446.04 (-0.27%)
Gas: 4 Gwei

Token

siimplex (siimplex)
 

Overview

Max Total Supply

7,395 siimplex

Holders

703

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
20 siimplex
0x76f9e5Ed218D70E895f1BFEAfF6AdEAD0355512c
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:
siimplex

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-23
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

// File: contracts/siimplex.sol



pragma solidity ^0.8.4;





contract siimplex is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    bytes32 public MERKLE_ROOT; 

    uint256 public PRICE;
    string private BASE_URI;

    bool public IS_PRE_SALE_ACTIVE;
    bool public IS_PUBLIC_SALE_ACTIVE;
    
    uint256 public MAX_MINT_PER_TRANSACTION;
    uint256 public MAX_FREE_MINT_PER_WALLET;
    
    uint256 public MAX_FREE_MINT_SUPPLY; 
    uint256 public MAX_SUPPLY;
    
    mapping(address => uint256) private freeMintCounts;

    constructor(
        bytes32 merkleRoot, 
        uint256 price, 
        string memory baseURI, 
        uint256 maxFreeMintPerWallet, 
        uint256 maxMintPerTransaction,
        uint256 maxFreeMintSupply,
        uint256 maxSupply
        ) ERC721A("siimplex", "siimplex") {

        MERKLE_ROOT = merkleRoot;
        
        PRICE = price;
        
        BASE_URI = baseURI;

        IS_PRE_SALE_ACTIVE = false;
        IS_PUBLIC_SALE_ACTIVE = false;

        MAX_FREE_MINT_PER_WALLET = maxFreeMintPerWallet;
        MAX_MINT_PER_TRANSACTION = maxMintPerTransaction;

        MAX_FREE_MINT_SUPPLY = maxFreeMintSupply;
        MAX_SUPPLY = maxSupply;
    }

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

    function setMerkleRoot(bytes32 newMerkleRoot) external onlyOwner {
        MERKLE_ROOT = newMerkleRoot;
    }

    function setMaxFreeMintPerWallet(uint256 maxFreeMint) external onlyOwner {
        MAX_FREE_MINT_PER_WALLET = maxFreeMint;
    }

    function setMaxMintPerTransaction(uint256 newMaxMintPerTransaction) external onlyOwner {
        MAX_MINT_PER_TRANSACTION = newMaxMintPerTransaction;
    }

    function setPrice(uint256 customPrice) external onlyOwner {
        PRICE = customPrice;
    }
    
    function lowerMaxSupply(uint256 newMaxSupply) external onlyOwner {
        require(newMaxSupply < MAX_SUPPLY, "New max supply must be lower than current");
        require(newMaxSupply >= _currentIndex, "New max supply lower than total number of mints");
        MAX_SUPPLY = newMaxSupply;
    }

    function raiseMaxFreeMintSupply(uint256 newMaxFreeMintSupply) external onlyOwner {
        require(newMaxFreeMintSupply <= MAX_SUPPLY, "New max free mint supply must be lower or equal to max supply");
        require(newMaxFreeMintSupply > MAX_FREE_MINT_SUPPLY, "New max free mint supply must be higher than current");
        require(newMaxFreeMintSupply > _currentIndex, "New max free mint supply must be higher than the current index");

        MAX_FREE_MINT_SUPPLY = newMaxFreeMintSupply;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        BASE_URI = newBaseURI;
    }

    function setPreSaleActive(bool preSaleIsActive) external onlyOwner {
        IS_PRE_SALE_ACTIVE = preSaleIsActive;
    }

    function setPublicSaleActive(bool publicSaleIsActive) external onlyOwner {
        IS_PUBLIC_SALE_ACTIVE = publicSaleIsActive;
    }

    modifier validMintAmount(uint256 _mintAmount) {
        require(_mintAmount > 0, "Must mint at least one token");
        require(_currentIndex + _mintAmount <= MAX_SUPPLY, "Exceeded max tokens minted");
        _;
    }

    function freeMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable validMintAmount(_mintAmount) {
        require(IS_PRE_SALE_ACTIVE, "Pre-sale is not active");
        require(MerkleProof.verify(_merkleProof, MERKLE_ROOT, keccak256(abi.encodePacked(msg.sender))), "Address is not whitelisted");
        require(freeMintCounts[msg.sender] + _mintAmount <= MAX_FREE_MINT_PER_WALLET, "Max amount of free mints per wallet exceeded");
        require(totalSupply() + _mintAmount <= MAX_FREE_MINT_SUPPLY, "Max free mint supply exceeded");

        freeMintCounts[msg.sender] += _mintAmount;

        _safeMint(msg.sender, _mintAmount);
    }

    function mint(uint256 _mintAmount) public payable validMintAmount(_mintAmount) {
        require(IS_PUBLIC_SALE_ACTIVE, "Public sale is not active");
        require(_mintAmount <= MAX_MINT_PER_TRANSACTION, "Max amount of mints per transaction exceeded");
        require(msg.value >= SafeMath.mul(PRICE, _mintAmount), "Insufficient funds");
        
        _safeMint(msg.sender, _mintAmount);
    }

    function mintOwner(address _to, uint256 _mintAmount) public onlyOwner {
        require(_mintAmount > 0, "Must mint at least one token");
        require(_currentIndex + _mintAmount <= MAX_SUPPLY, "Exceeded max tokens minted");
        
        _safeMint(_to, _mintAmount);
    }

    address private constant payoutAddress = 0xDaA7E2c646E2A9A6ab9bCB503881eD790A849C49;

    function withdraw() public onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(payoutAddress), balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"uint256","name":"maxFreeMintPerWallet","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTransaction","type":"uint256"},{"internalType":"uint256","name":"maxFreeMintSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"IS_PRE_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_PUBLIC_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"lowerMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxFreeMintSupply","type":"uint256"}],"name":"raiseMaxFreeMintSupply","outputs":[],"stateMutability":"nonpayable","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxFreeMint","type":"uint256"}],"name":"setMaxFreeMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintPerTransaction","type":"uint256"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"preSaleIsActive","type":"bool"}],"name":"setPreSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"customPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"publicSaleIsActive","type":"bool"}],"name":"setPublicSaleActive","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005528380380620055288339818101604052810190620000379190620003af565b6040518060400160405280600881526020017f7369696d706c65780000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f7369696d706c65780000000000000000000000000000000000000000000000008152508160019080519060200190620000bb92919062000253565b508060029080519060200190620000d492919062000253565b505050620000f7620000eb6200018560201b60201c565b6200018d60201b60201c565b60016008819055508660098190555085600a8190555084600b90805190602001906200012592919062000253565b506000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff02191690831515021790555083600e8190555082600d8190555081600f8190555080601081905550505050505050506200064d565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000261906200052a565b90600052602060002090601f016020900481019282620002855760008555620002d1565b82601f10620002a057805160ff1916838001178555620002d1565b82800160010185558215620002d1579182015b82811115620002d0578251825591602001919060010190620002b3565b5b509050620002e09190620002e4565b5090565b5b80821115620002ff576000816000905550600101620002e5565b5090565b60006200031a6200031484620004aa565b62000481565b905082815260208101848484011115620003395762000338620005f9565b5b62000346848285620004f4565b509392505050565b6000815190506200035f8162000619565b92915050565b600082601f8301126200037d576200037c620005f4565b5b81516200038f84826020860162000303565b91505092915050565b600081519050620003a98162000633565b92915050565b600080600080600080600060e0888a031215620003d157620003d062000603565b5b6000620003e18a828b016200034e565b9750506020620003f48a828b0162000398565b965050604088015167ffffffffffffffff811115620004185762000417620005fe565b5b620004268a828b0162000365565b9550506060620004398a828b0162000398565b94505060806200044c8a828b0162000398565b93505060a06200045f8a828b0162000398565b92505060c0620004728a828b0162000398565b91505092959891949750929550565b60006200048d620004a0565b90506200049b828262000560565b919050565b6000604051905090565b600067ffffffffffffffff821115620004c857620004c7620005c5565b5b620004d38262000608565b9050602081019050919050565b6000819050919050565b6000819050919050565b60005b8381101562000514578082015181840152602081019050620004f7565b8381111562000524576000848401525b50505050565b600060028204905060018216806200054357607f821691505b602082108114156200055a576200055962000596565b5b50919050565b6200056b8262000608565b810181811067ffffffffffffffff821117156200058d576200058c620005c5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200062481620004e0565b81146200063057600080fd5b50565b6200063e81620004ea565b81146200064a57600080fd5b50565b614ecb806200065d6000396000f3fe60806040526004361061023b5760003560e01c80637cb647591161012e578063c4e9374d116100ab578063e985e9c51161006f578063e985e9c51461083f578063efc017291461087c578063f0571446146108a7578063f2fde38b146108d0578063f77b1edd146108f95761023b565b8063c4e9374d14610769578063c87b56dd14610792578063e2e06fa3146107cf578063e2f36dce146107f8578063e94d75f3146108145761023b565b806395d89b41116100f257806395d89b41146106a5578063a0712d68146106d0578063a22cb465146106ec578063a6eb27e214610715578063b88d4fde146107405761023b565b80637cb64759146105d25780638d859f3e146105fb5780638da5cb5b146106265780638e70d2741461065157806391b7f5ed1461067c5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104ef5780636352211e1461051857806364d2e9d01461055557806370a082311461057e578063715018a6146105bb5761023b565b80633ccfd60b1461041e578063408cbf941461043557806342842e0e1461045e5780634f6ccce71461048757806351e75e8b146104c45761023b565b806323b872dd1161020357806323b872dd1461033957806324ef901e146103625780632e6cebe51461038d5780632f745c59146103b657806332cb6b0c146103f35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613c7c565b610922565b6040516102749190614219565b60405180910390f35b34801561028957600080fd5b50610292610a6c565b60405161029f919061424f565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613d1f565b610afe565b6040516102dc91906141b2565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613be2565b610b7a565b005b34801561031a57600080fd5b50610323610c85565b60405161033091906144d1565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613acc565b610cda565b005b34801561036e57600080fd5b50610377610cea565b60405161038491906144d1565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613d1f565b610cf0565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613be2565b610d76565b6040516103ea91906144d1565b60405180910390f35b3480156103ff57600080fd5b50610408610f7d565b60405161041591906144d1565b60405180910390f35b34801561042a57600080fd5b50610433610f83565b005b34801561044157600080fd5b5061045c60048036038101906104579190613be2565b61107b565b005b34801561046a57600080fd5b5061048560048036038101906104809190613acc565b6111c6565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613d1f565b6111e6565b6040516104bb91906144d1565b60405180910390f35b3480156104d057600080fd5b506104d9611357565b6040516104e69190614234565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613cd6565b61135d565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613d1f565b6113f3565b60405161054c91906141b2565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613c22565b611409565b005b34801561058a57600080fd5b506105a560048036038101906105a09190613a5f565b6114a2565b6040516105b291906144d1565b60405180910390f35b3480156105c757600080fd5b506105d0611572565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613c4f565b6115fa565b005b34801561060757600080fd5b50610610611680565b60405161061d91906144d1565b60405180910390f35b34801561063257600080fd5b5061063b611686565b60405161064891906141b2565b60405180910390f35b34801561065d57600080fd5b506106666116b0565b6040516106739190614219565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613d1f565b6116c3565b005b3480156106b157600080fd5b506106ba611749565b6040516106c7919061424f565b60405180910390f35b6106ea60048036038101906106e59190613d1f565b6117db565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613ba2565b61198d565b005b34801561072157600080fd5b5061072a611b05565b60405161073791906144d1565b60405180910390f35b34801561074c57600080fd5b5061076760048036038101906107629190613b1f565b611b0b565b005b34801561077557600080fd5b50610790600480360381019061078b9190613d1f565b611b5e565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613d1f565b611c99565b6040516107c6919061424f565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613c22565b611d38565b005b610812600480360381019061080d9190613d4c565b611dd1565b005b34801561082057600080fd5b506108296120e1565b6040516108369190614219565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613a8c565b6120f4565b6040516108739190614219565b60405180910390f35b34801561088857600080fd5b50610891612188565b60405161089e91906144d1565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190613d1f565b61218e565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613a5f565b61230d565b005b34801561090557600080fd5b50610920600480360381019061091b9190613d1f565b612405565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a655750610a648261248b565b5b9050919050565b606060018054610a7b90614796565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa790614796565b8015610af45780601f10610ac957610100808354040283529160200191610af4565b820191906000526020600020905b815481529060010190602001808311610ad757829003601f168201915b5050505050905090565b6000610b09826124f5565b610b3f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b85826113f3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bed576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0c61255d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c3e5750610c3c81610c3761255d565b6120f4565b155b15610c75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c80838383612565565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610ce5838383612617565b505050565b600d5481565b610cf861255d565b73ffffffffffffffffffffffffffffffffffffffff16610d16611686565b73ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906143d1565b60405180910390fd5b80600d8190555050565b6000610d81836114a2565b8210610db9576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f71576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610ed05750610f64565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f1057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f625786841415610f59578195505050505050610f77565b83806001019450505b505b8080600101915050610df3565b50600080fd5b92915050565b60105481565b610f8b61255d565b73ffffffffffffffffffffffffffffffffffffffff16610fa9611686565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906143d1565b60405180910390fd5b60026008541415611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906144b1565b60405180910390fd5b6002600881905550600047905061107073daa7e2c646e2a9a6ab9bcb503881ed790a849c4982612b34565b506001600881905550565b61108361255d565b73ffffffffffffffffffffffffffffffffffffffff166110a1611686565b73ffffffffffffffffffffffffffffffffffffffff16146110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee906143d1565b60405180910390fd5b6000811161113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1661117791906145c1565b11156111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90614491565b60405180910390fd5b6111c28282612c28565b5050565b6111e183838360405180602001604052806000815250611b0b565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561131f576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161131157858314156113085781945050505050611352565b82806001019350505b50808060010191505061121e565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60095481565b61136561255d565b73ffffffffffffffffffffffffffffffffffffffff16611383611686565b73ffffffffffffffffffffffffffffffffffffffff16146113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906143d1565b60405180910390fd5b80600b90805190602001906113ef9291906137c5565b5050565b60006113fe82612c46565b600001519050919050565b61141161255d565b73ffffffffffffffffffffffffffffffffffffffff1661142f611686565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c906143d1565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61157a61255d565b73ffffffffffffffffffffffffffffffffffffffff16611598611686565b73ffffffffffffffffffffffffffffffffffffffff16146115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906143d1565b60405180910390fd5b6115f86000612eee565b565b61160261255d565b73ffffffffffffffffffffffffffffffffffffffff16611620611686565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d906143d1565b60405180910390fd5b8060098190555050565b600a5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900460ff1681565b6116cb61255d565b73ffffffffffffffffffffffffffffffffffffffff166116e9611686565b73ffffffffffffffffffffffffffffffffffffffff161461173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611736906143d1565b60405180910390fd5b80600a8190555050565b60606002805461175890614796565b80601f016020809104026020016040519081016040528092919081815260200182805461178490614796565b80156117d15780601f106117a6576101008083540402835291602001916117d1565b820191906000526020600020905b8154815290600101906020018083116117b457829003601f168201915b5050505050905090565b806000811161181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1661185c91906145c1565b111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614491565b60405180910390fd5b600c60019054906101000a900460ff166118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614391565b60405180910390fd5b600d54821115611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890614451565b60405180910390fd5b61193d600a5483612fb4565b34101561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690614331565b60405180910390fd5b6119893383612c28565b5050565b61199561255d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611a0761255d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab461255d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af99190614219565b60405180910390a35050565b600e5481565b611b16848484612617565b611b2284848484612fca565b611b58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611b6661255d565b73ffffffffffffffffffffffffffffffffffffffff16611b84611686565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906143d1565b60405180910390fd5b6010548110611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614411565b60405180910390fd5b60008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614351565b60405180910390fd5b8060108190555050565b6060611ca4826124f5565b611cda576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ce4613158565b9050600081511415611d055760405180602001604052806000815250611d30565b80611d0f846131ea565b604051602001611d20929190614179565b6040516020818303038152906040525b915050919050565b611d4061255d565b73ffffffffffffffffffffffffffffffffffffffff16611d5e611686565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906143d1565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b8260008111611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c90614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16611e5291906145c1565b1115611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614491565b60405180910390fd5b600c60009054906101000a900460ff16611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed9906143f1565b60405180910390fd5b611f56838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095433604051602001611f3b919061415e565b6040516020818303038152906040528051906020012061334b565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90614291565b60405180910390fd5b600e5484601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fe391906145c1565b1115612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b906142d1565b60405180910390fd5b600f5484612030610c85565b61203a91906145c1565b111561207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614471565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ca91906145c1565b925050819055506120db3385612c28565b50505050565b600c60019054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b61219661255d565b73ffffffffffffffffffffffffffffffffffffffff166121b4611686565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906143d1565b60405180910390fd5b60105481111561224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906142b1565b60405180910390fd5b600f548111612293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228a906143b1565b60405180910390fd5b60008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168111612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614371565b60405180910390fd5b80600f8190555050565b61231561255d565b73ffffffffffffffffffffffffffffffffffffffff16612333611686565b73ffffffffffffffffffffffffffffffffffffffff1614612389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612380906143d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614271565b60405180910390fd5b61240281612eee565b50565b61240d61255d565b73ffffffffffffffffffffffffffffffffffffffff1661242b611686565b73ffffffffffffffffffffffffffffffffffffffff1614612481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612478906143d1565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612556575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061262282612c46565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661264961255d565b73ffffffffffffffffffffffffffffffffffffffff16148061267c575061267b826000015161267661255d565b6120f4565b5b806126c1575061268a61255d565b73ffffffffffffffffffffffffffffffffffffffff166126a984610afe565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612763576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127ca576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127d78585856001613362565b6127e76000848460000151612565565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ac45760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612ac35782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b2d8585856001613368565b5050505050565b80471015612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614311565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b9d9061419d565b60006040518083038185875af1925050503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5050905080612c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1a906142f1565b60405180910390fd5b505050565b612c4282826040518060200160405280600081525061336e565b5050565b612c4e61384b565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612eb7576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eb557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d99578092505050612ee9565b5b600115612eb457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eaf578092505050612ee9565b612d9a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612fc29190614648565b905092915050565b6000612feb8473ffffffffffffffffffffffffffffffffffffffff16613380565b1561314b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301461255d565b8786866040518563ffffffff1660e01b815260040161303694939291906141cd565b602060405180830381600087803b15801561305057600080fd5b505af192505050801561308157506040513d601f19601f8201168201806040525081019061307e9190613ca9565b60015b6130fb573d80600081146130b1576040519150601f19603f3d011682016040523d82523d6000602084013e6130b6565b606091505b506000815114156130f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613150565b600190505b949350505050565b6060600b805461316790614796565b80601f016020809104026020016040519081016040528092919081815260200182805461319390614796565b80156131e05780601f106131b5576101008083540402835291602001916131e0565b820191906000526020600020905b8154815290600101906020018083116131c357829003601f168201915b5050505050905090565b60606000821415613232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613346565b600082905060005b6000821461326457808061324d906147f9565b915050600a8261325d9190614617565b915061323a565b60008167ffffffffffffffff8111156132805761327f614953565b5b6040519080825280601f01601f1916602001820160405280156132b25781602001600182028036833780820191505090505b5090505b6000851461333f576001826132cb91906146a2565b9150600a856132da9190614866565b60306132e691906145c1565b60f81b8183815181106132fc576132fb614924565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133389190614617565b94506132b6565b8093505050505b919050565b60008261335885846133a3565b1490509392505050565b50505050565b50505050565b61337b8383836001613418565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b845181101561340d5760008582815181106133ca576133c9614924565b5b602002602001015190508083116133ec576133e583826137ae565b92506133f9565b6133f681846137ae565b92505b508080613405906147f9565b9150506133ac565b508091505092915050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134b3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134ee576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134fb6000868387613362565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561376057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561371457506137126000888488612fca565b155b1561374b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613699565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506137a76000868387613368565b5050505050565b600082600052816020526040600020905092915050565b8280546137d190614796565b90600052602060002090601f0160209004810192826137f3576000855561383a565b82601f1061380c57805160ff191683800117855561383a565b8280016001018555821561383a579182015b8281111561383957825182559160200191906001019061381e565b5b509050613847919061388e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156138a757600081600090555060010161388f565b5090565b60006138be6138b984614511565b6144ec565b9050828152602081018484840111156138da576138d9614991565b5b6138e5848285614754565b509392505050565b60006139006138fb84614542565b6144ec565b90508281526020810184848401111561391c5761391b614991565b5b613927848285614754565b509392505050565b60008135905061393e81614e22565b92915050565b60008083601f84011261395a57613959614987565b5b8235905067ffffffffffffffff81111561397757613976614982565b5b6020830191508360208202830111156139935761399261498c565b5b9250929050565b6000813590506139a981614e39565b92915050565b6000813590506139be81614e50565b92915050565b6000813590506139d381614e67565b92915050565b6000815190506139e881614e67565b92915050565b600082601f830112613a0357613a02614987565b5b8135613a138482602086016138ab565b91505092915050565b600082601f830112613a3157613a30614987565b5b8135613a418482602086016138ed565b91505092915050565b600081359050613a5981614e7e565b92915050565b600060208284031215613a7557613a7461499b565b5b6000613a838482850161392f565b91505092915050565b60008060408385031215613aa357613aa261499b565b5b6000613ab18582860161392f565b9250506020613ac28582860161392f565b9150509250929050565b600080600060608486031215613ae557613ae461499b565b5b6000613af38682870161392f565b9350506020613b048682870161392f565b9250506040613b1586828701613a4a565b9150509250925092565b60008060008060808587031215613b3957613b3861499b565b5b6000613b478782880161392f565b9450506020613b588782880161392f565b9350506040613b6987828801613a4a565b925050606085013567ffffffffffffffff811115613b8a57613b89614996565b5b613b96878288016139ee565b91505092959194509250565b60008060408385031215613bb957613bb861499b565b5b6000613bc78582860161392f565b9250506020613bd88582860161399a565b9150509250929050565b60008060408385031215613bf957613bf861499b565b5b6000613c078582860161392f565b9250506020613c1885828601613a4a565b9150509250929050565b600060208284031215613c3857613c3761499b565b5b6000613c468482850161399a565b91505092915050565b600060208284031215613c6557613c6461499b565b5b6000613c73848285016139af565b91505092915050565b600060208284031215613c9257613c9161499b565b5b6000613ca0848285016139c4565b91505092915050565b600060208284031215613cbf57613cbe61499b565b5b6000613ccd848285016139d9565b91505092915050565b600060208284031215613cec57613ceb61499b565b5b600082013567ffffffffffffffff811115613d0a57613d09614996565b5b613d1684828501613a1c565b91505092915050565b600060208284031215613d3557613d3461499b565b5b6000613d4384828501613a4a565b91505092915050565b600080600060408486031215613d6557613d6461499b565b5b6000613d7386828701613a4a565b935050602084013567ffffffffffffffff811115613d9457613d93614996565b5b613da086828701613944565b92509250509250925092565b613db5816146d6565b82525050565b613dcc613dc7826146d6565b614842565b82525050565b613ddb816146e8565b82525050565b613dea816146f4565b82525050565b6000613dfb82614573565b613e058185614589565b9350613e15818560208601614763565b613e1e816149a0565b840191505092915050565b6000613e348261457e565b613e3e81856145a5565b9350613e4e818560208601614763565b613e57816149a0565b840191505092915050565b6000613e6d8261457e565b613e7781856145b6565b9350613e87818560208601614763565b80840191505092915050565b6000613ea06026836145a5565b9150613eab826149be565b604082019050919050565b6000613ec3601a836145a5565b9150613ece82614a0d565b602082019050919050565b6000613ee6603d836145a5565b9150613ef182614a36565b604082019050919050565b6000613f09602c836145a5565b9150613f1482614a85565b604082019050919050565b6000613f2c603a836145a5565b9150613f3782614ad4565b604082019050919050565b6000613f4f601d836145a5565b9150613f5a82614b23565b602082019050919050565b6000613f726012836145a5565b9150613f7d82614b4c565b602082019050919050565b6000613f95602f836145a5565b9150613fa082614b75565b604082019050919050565b6000613fb8603e836145a5565b9150613fc382614bc4565b604082019050919050565b6000613fdb6019836145a5565b9150613fe682614c13565b602082019050919050565b6000613ffe6034836145a5565b915061400982614c3c565b604082019050919050565b60006140216020836145a5565b915061402c82614c8b565b602082019050919050565b60006140446016836145a5565b915061404f82614cb4565b602082019050919050565b60006140676029836145a5565b915061407282614cdd565b604082019050919050565b600061408a601c836145a5565b915061409582614d2c565b602082019050919050565b60006140ad602c836145a5565b91506140b882614d55565b604082019050919050565b60006140d0601d836145a5565b91506140db82614da4565b602082019050919050565b60006140f360008361459a565b91506140fe82614dcd565b600082019050919050565b6000614116601a836145a5565b915061412182614dd0565b602082019050919050565b6000614139601f836145a5565b915061414482614df9565b602082019050919050565b6141588161474a565b82525050565b600061416a8284613dbb565b60148201915081905092915050565b60006141858285613e62565b91506141918284613e62565b91508190509392505050565b60006141a8826140e6565b9150819050919050565b60006020820190506141c76000830184613dac565b92915050565b60006080820190506141e26000830187613dac565b6141ef6020830186613dac565b6141fc604083018561414f565b818103606083015261420e8184613df0565b905095945050505050565b600060208201905061422e6000830184613dd2565b92915050565b60006020820190506142496000830184613de1565b92915050565b600060208201905081810360008301526142698184613e29565b905092915050565b6000602082019050818103600083015261428a81613e93565b9050919050565b600060208201905081810360008301526142aa81613eb6565b9050919050565b600060208201905081810360008301526142ca81613ed9565b9050919050565b600060208201905081810360008301526142ea81613efc565b9050919050565b6000602082019050818103600083015261430a81613f1f565b9050919050565b6000602082019050818103600083015261432a81613f42565b9050919050565b6000602082019050818103600083015261434a81613f65565b9050919050565b6000602082019050818103600083015261436a81613f88565b9050919050565b6000602082019050818103600083015261438a81613fab565b9050919050565b600060208201905081810360008301526143aa81613fce565b9050919050565b600060208201905081810360008301526143ca81613ff1565b9050919050565b600060208201905081810360008301526143ea81614014565b9050919050565b6000602082019050818103600083015261440a81614037565b9050919050565b6000602082019050818103600083015261442a8161405a565b9050919050565b6000602082019050818103600083015261444a8161407d565b9050919050565b6000602082019050818103600083015261446a816140a0565b9050919050565b6000602082019050818103600083015261448a816140c3565b9050919050565b600060208201905081810360008301526144aa81614109565b9050919050565b600060208201905081810360008301526144ca8161412c565b9050919050565b60006020820190506144e6600083018461414f565b92915050565b60006144f6614507565b905061450282826147c8565b919050565b6000604051905090565b600067ffffffffffffffff82111561452c5761452b614953565b5b614535826149a0565b9050602081019050919050565b600067ffffffffffffffff82111561455d5761455c614953565b5b614566826149a0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145cc8261474a565b91506145d78361474a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460c5761460b614897565b5b828201905092915050565b60006146228261474a565b915061462d8361474a565b92508261463d5761463c6148c6565b5b828204905092915050565b60006146538261474a565b915061465e8361474a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561469757614696614897565b5b828202905092915050565b60006146ad8261474a565b91506146b88361474a565b9250828210156146cb576146ca614897565b5b828203905092915050565b60006146e18261472a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614781578082015181840152602081019050614766565b83811115614790576000848401525b50505050565b600060028204905060018216806147ae57607f821691505b602082108114156147c2576147c16148f5565b5b50919050565b6147d1826149a0565b810181811067ffffffffffffffff821117156147f0576147ef614953565b5b80604052505050565b60006148048261474a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561483757614836614897565b5b600182019050919050565b600061484d82614854565b9050919050565b600061485f826149b1565b9050919050565b60006148718261474a565b915061487c8361474a565b92508261488c5761488b6148c6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f742077686974656c6973746564000000000000600082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f206c6f776572206f7220657175616c20746f206d617820737570706c79000000602082015250565b7f4d617820616d6f756e74206f662066726565206d696e7473207065722077616c60008201527f6c65742065786365656465640000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4e6577206d617820737570706c79206c6f776572207468616e20746f74616c2060008201527f6e756d626572206f66206d696e74730000000000000000000000000000000000602082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f20686967686572207468616e207468652063757272656e7420696e6465780000602082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f20686967686572207468616e2063757272656e74000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652d73616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4e6577206d617820737570706c79206d757374206265206c6f7765722074686160008201527f6e2063757272656e740000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b7f4d617820616d6f756e74206f66206d696e747320706572207472616e7361637460008201527f696f6e2065786365656465640000000000000000000000000000000000000000602082015250565b7f4d61782066726565206d696e7420737570706c79206578636565646564000000600082015250565b50565b7f4578636565646564206d617820746f6b656e73206d696e746564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614e2b816146d6565b8114614e3657600080fd5b50565b614e42816146e8565b8114614e4d57600080fd5b50565b614e59816146f4565b8114614e6457600080fd5b50565b614e70816146fe565b8114614e7b57600080fd5b50565b614e878161474a565b8114614e9257600080fd5b5056fea2646970667358221220b59fc9f761acc9850583e1f1d746e76f3ab4f10bad4b3c15a5c383cd5d9e8ac664736f6c63430008070033d9d9ae5555a5b4828ad4ed996ef509ba0707c089e19df1f7e5f4ee582e253bbc000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000270f0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d624a4241704b765157584b6d656d5063506934377a50446a6e5a4c61466a333679683256534d4d79483556332f00000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80637cb647591161012e578063c4e9374d116100ab578063e985e9c51161006f578063e985e9c51461083f578063efc017291461087c578063f0571446146108a7578063f2fde38b146108d0578063f77b1edd146108f95761023b565b8063c4e9374d14610769578063c87b56dd14610792578063e2e06fa3146107cf578063e2f36dce146107f8578063e94d75f3146108145761023b565b806395d89b41116100f257806395d89b41146106a5578063a0712d68146106d0578063a22cb465146106ec578063a6eb27e214610715578063b88d4fde146107405761023b565b80637cb64759146105d25780638d859f3e146105fb5780638da5cb5b146106265780638e70d2741461065157806391b7f5ed1461067c5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104ef5780636352211e1461051857806364d2e9d01461055557806370a082311461057e578063715018a6146105bb5761023b565b80633ccfd60b1461041e578063408cbf941461043557806342842e0e1461045e5780634f6ccce71461048757806351e75e8b146104c45761023b565b806323b872dd1161020357806323b872dd1461033957806324ef901e146103625780632e6cebe51461038d5780632f745c59146103b657806332cb6b0c146103f35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613c7c565b610922565b6040516102749190614219565b60405180910390f35b34801561028957600080fd5b50610292610a6c565b60405161029f919061424f565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613d1f565b610afe565b6040516102dc91906141b2565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613be2565b610b7a565b005b34801561031a57600080fd5b50610323610c85565b60405161033091906144d1565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613acc565b610cda565b005b34801561036e57600080fd5b50610377610cea565b60405161038491906144d1565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613d1f565b610cf0565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613be2565b610d76565b6040516103ea91906144d1565b60405180910390f35b3480156103ff57600080fd5b50610408610f7d565b60405161041591906144d1565b60405180910390f35b34801561042a57600080fd5b50610433610f83565b005b34801561044157600080fd5b5061045c60048036038101906104579190613be2565b61107b565b005b34801561046a57600080fd5b5061048560048036038101906104809190613acc565b6111c6565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613d1f565b6111e6565b6040516104bb91906144d1565b60405180910390f35b3480156104d057600080fd5b506104d9611357565b6040516104e69190614234565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613cd6565b61135d565b005b34801561052457600080fd5b5061053f600480360381019061053a9190613d1f565b6113f3565b60405161054c91906141b2565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613c22565b611409565b005b34801561058a57600080fd5b506105a560048036038101906105a09190613a5f565b6114a2565b6040516105b291906144d1565b60405180910390f35b3480156105c757600080fd5b506105d0611572565b005b3480156105de57600080fd5b506105f960048036038101906105f49190613c4f565b6115fa565b005b34801561060757600080fd5b50610610611680565b60405161061d91906144d1565b60405180910390f35b34801561063257600080fd5b5061063b611686565b60405161064891906141b2565b60405180910390f35b34801561065d57600080fd5b506106666116b0565b6040516106739190614219565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613d1f565b6116c3565b005b3480156106b157600080fd5b506106ba611749565b6040516106c7919061424f565b60405180910390f35b6106ea60048036038101906106e59190613d1f565b6117db565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613ba2565b61198d565b005b34801561072157600080fd5b5061072a611b05565b60405161073791906144d1565b60405180910390f35b34801561074c57600080fd5b5061076760048036038101906107629190613b1f565b611b0b565b005b34801561077557600080fd5b50610790600480360381019061078b9190613d1f565b611b5e565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613d1f565b611c99565b6040516107c6919061424f565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f19190613c22565b611d38565b005b610812600480360381019061080d9190613d4c565b611dd1565b005b34801561082057600080fd5b506108296120e1565b6040516108369190614219565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190613a8c565b6120f4565b6040516108739190614219565b60405180910390f35b34801561088857600080fd5b50610891612188565b60405161089e91906144d1565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190613d1f565b61218e565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613a5f565b61230d565b005b34801561090557600080fd5b50610920600480360381019061091b9190613d1f565b612405565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a655750610a648261248b565b5b9050919050565b606060018054610a7b90614796565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa790614796565b8015610af45780601f10610ac957610100808354040283529160200191610af4565b820191906000526020600020905b815481529060010190602001808311610ad757829003601f168201915b5050505050905090565b6000610b09826124f5565b610b3f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b85826113f3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bed576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0c61255d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c3e5750610c3c81610c3761255d565b6120f4565b155b15610c75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c80838383612565565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610ce5838383612617565b505050565b600d5481565b610cf861255d565b73ffffffffffffffffffffffffffffffffffffffff16610d16611686565b73ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906143d1565b60405180910390fd5b80600d8190555050565b6000610d81836114a2565b8210610db9576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f71576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610ed05750610f64565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f1057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f625786841415610f59578195505050505050610f77565b83806001019450505b505b8080600101915050610df3565b50600080fd5b92915050565b60105481565b610f8b61255d565b73ffffffffffffffffffffffffffffffffffffffff16610fa9611686565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff6906143d1565b60405180910390fd5b60026008541415611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906144b1565b60405180910390fd5b6002600881905550600047905061107073daa7e2c646e2a9a6ab9bcb503881ed790a849c4982612b34565b506001600881905550565b61108361255d565b73ffffffffffffffffffffffffffffffffffffffff166110a1611686565b73ffffffffffffffffffffffffffffffffffffffff16146110f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ee906143d1565b60405180910390fd5b6000811161113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1661117791906145c1565b11156111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90614491565b60405180910390fd5b6111c28282612c28565b5050565b6111e183838360405180602001604052806000815250611b0b565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561131f576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161131157858314156113085781945050505050611352565b82806001019350505b50808060010191505061121e565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60095481565b61136561255d565b73ffffffffffffffffffffffffffffffffffffffff16611383611686565b73ffffffffffffffffffffffffffffffffffffffff16146113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906143d1565b60405180910390fd5b80600b90805190602001906113ef9291906137c5565b5050565b60006113fe82612c46565b600001519050919050565b61141161255d565b73ffffffffffffffffffffffffffffffffffffffff1661142f611686565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c906143d1565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61157a61255d565b73ffffffffffffffffffffffffffffffffffffffff16611598611686565b73ffffffffffffffffffffffffffffffffffffffff16146115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906143d1565b60405180910390fd5b6115f86000612eee565b565b61160261255d565b73ffffffffffffffffffffffffffffffffffffffff16611620611686565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d906143d1565b60405180910390fd5b8060098190555050565b600a5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900460ff1681565b6116cb61255d565b73ffffffffffffffffffffffffffffffffffffffff166116e9611686565b73ffffffffffffffffffffffffffffffffffffffff161461173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611736906143d1565b60405180910390fd5b80600a8190555050565b60606002805461175890614796565b80601f016020809104026020016040519081016040528092919081815260200182805461178490614796565b80156117d15780601f106117a6576101008083540402835291602001916117d1565b820191906000526020600020905b8154815290600101906020018083116117b457829003601f168201915b5050505050905090565b806000811161181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1661185c91906145c1565b111561189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490614491565b60405180910390fd5b600c60019054906101000a900460ff166118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614391565b60405180910390fd5b600d54821115611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890614451565b60405180910390fd5b61193d600a5483612fb4565b34101561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690614331565b60405180910390fd5b6119893383612c28565b5050565b61199561255d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611a0761255d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab461255d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af99190614219565b60405180910390a35050565b600e5481565b611b16848484612617565b611b2284848484612fca565b611b58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611b6661255d565b73ffffffffffffffffffffffffffffffffffffffff16611b84611686565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd1906143d1565b60405180910390fd5b6010548110611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614411565b60405180910390fd5b60008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614351565b60405180910390fd5b8060108190555050565b6060611ca4826124f5565b611cda576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ce4613158565b9050600081511415611d055760405180602001604052806000815250611d30565b80611d0f846131ea565b604051602001611d20929190614179565b6040516020818303038152906040525b915050919050565b611d4061255d565b73ffffffffffffffffffffffffffffffffffffffff16611d5e611686565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906143d1565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b8260008111611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c90614431565b60405180910390fd5b6010548160008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16611e5291906145c1565b1115611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614491565b60405180910390fd5b600c60009054906101000a900460ff16611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed9906143f1565b60405180910390fd5b611f56838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095433604051602001611f3b919061415e565b6040516020818303038152906040528051906020012061334b565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90614291565b60405180910390fd5b600e5484601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fe391906145c1565b1115612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b906142d1565b60405180910390fd5b600f5484612030610c85565b61203a91906145c1565b111561207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614471565b60405180910390fd5b83601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ca91906145c1565b925050819055506120db3385612c28565b50505050565b600c60019054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b61219661255d565b73ffffffffffffffffffffffffffffffffffffffff166121b4611686565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906143d1565b60405180910390fd5b60105481111561224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906142b1565b60405180910390fd5b600f548111612293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228a906143b1565b60405180910390fd5b60008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168111612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614371565b60405180910390fd5b80600f8190555050565b61231561255d565b73ffffffffffffffffffffffffffffffffffffffff16612333611686565b73ffffffffffffffffffffffffffffffffffffffff1614612389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612380906143d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614271565b60405180910390fd5b61240281612eee565b50565b61240d61255d565b73ffffffffffffffffffffffffffffffffffffffff1661242b611686565b73ffffffffffffffffffffffffffffffffffffffff1614612481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612478906143d1565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612556575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061262282612c46565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661264961255d565b73ffffffffffffffffffffffffffffffffffffffff16148061267c575061267b826000015161267661255d565b6120f4565b5b806126c1575061268a61255d565b73ffffffffffffffffffffffffffffffffffffffff166126a984610afe565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126fa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612763576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127ca576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127d78585856001613362565b6127e76000848460000151612565565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ac45760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612ac35782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b2d8585856001613368565b5050505050565b80471015612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614311565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b9d9061419d565b60006040518083038185875af1925050503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5050905080612c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1a906142f1565b60405180910390fd5b505050565b612c4282826040518060200160405280600081525061336e565b5050565b612c4e61384b565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612eb7576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eb557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d99578092505050612ee9565b5b600115612eb457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eaf578092505050612ee9565b612d9a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612fc29190614648565b905092915050565b6000612feb8473ffffffffffffffffffffffffffffffffffffffff16613380565b1561314b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301461255d565b8786866040518563ffffffff1660e01b815260040161303694939291906141cd565b602060405180830381600087803b15801561305057600080fd5b505af192505050801561308157506040513d601f19601f8201168201806040525081019061307e9190613ca9565b60015b6130fb573d80600081146130b1576040519150601f19603f3d011682016040523d82523d6000602084013e6130b6565b606091505b506000815114156130f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613150565b600190505b949350505050565b6060600b805461316790614796565b80601f016020809104026020016040519081016040528092919081815260200182805461319390614796565b80156131e05780601f106131b5576101008083540402835291602001916131e0565b820191906000526020600020905b8154815290600101906020018083116131c357829003601f168201915b5050505050905090565b60606000821415613232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613346565b600082905060005b6000821461326457808061324d906147f9565b915050600a8261325d9190614617565b915061323a565b60008167ffffffffffffffff8111156132805761327f614953565b5b6040519080825280601f01601f1916602001820160405280156132b25781602001600182028036833780820191505090505b5090505b6000851461333f576001826132cb91906146a2565b9150600a856132da9190614866565b60306132e691906145c1565b60f81b8183815181106132fc576132fb614924565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133389190614617565b94506132b6565b8093505050505b919050565b60008261335885846133a3565b1490509392505050565b50505050565b50505050565b61337b8383836001613418565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b845181101561340d5760008582815181106133ca576133c9614924565b5b602002602001015190508083116133ec576133e583826137ae565b92506133f9565b6133f681846137ae565b92505b508080613405906147f9565b9150506133ac565b508091505092915050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134b3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156134ee576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134fb6000868387613362565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561376057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801561371457506137126000888488612fca565b155b1561374b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613699565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506137a76000868387613368565b5050505050565b600082600052816020526040600020905092915050565b8280546137d190614796565b90600052602060002090601f0160209004810192826137f3576000855561383a565b82601f1061380c57805160ff191683800117855561383a565b8280016001018555821561383a579182015b8281111561383957825182559160200191906001019061381e565b5b509050613847919061388e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156138a757600081600090555060010161388f565b5090565b60006138be6138b984614511565b6144ec565b9050828152602081018484840111156138da576138d9614991565b5b6138e5848285614754565b509392505050565b60006139006138fb84614542565b6144ec565b90508281526020810184848401111561391c5761391b614991565b5b613927848285614754565b509392505050565b60008135905061393e81614e22565b92915050565b60008083601f84011261395a57613959614987565b5b8235905067ffffffffffffffff81111561397757613976614982565b5b6020830191508360208202830111156139935761399261498c565b5b9250929050565b6000813590506139a981614e39565b92915050565b6000813590506139be81614e50565b92915050565b6000813590506139d381614e67565b92915050565b6000815190506139e881614e67565b92915050565b600082601f830112613a0357613a02614987565b5b8135613a138482602086016138ab565b91505092915050565b600082601f830112613a3157613a30614987565b5b8135613a418482602086016138ed565b91505092915050565b600081359050613a5981614e7e565b92915050565b600060208284031215613a7557613a7461499b565b5b6000613a838482850161392f565b91505092915050565b60008060408385031215613aa357613aa261499b565b5b6000613ab18582860161392f565b9250506020613ac28582860161392f565b9150509250929050565b600080600060608486031215613ae557613ae461499b565b5b6000613af38682870161392f565b9350506020613b048682870161392f565b9250506040613b1586828701613a4a565b9150509250925092565b60008060008060808587031215613b3957613b3861499b565b5b6000613b478782880161392f565b9450506020613b588782880161392f565b9350506040613b6987828801613a4a565b925050606085013567ffffffffffffffff811115613b8a57613b89614996565b5b613b96878288016139ee565b91505092959194509250565b60008060408385031215613bb957613bb861499b565b5b6000613bc78582860161392f565b9250506020613bd88582860161399a565b9150509250929050565b60008060408385031215613bf957613bf861499b565b5b6000613c078582860161392f565b9250506020613c1885828601613a4a565b9150509250929050565b600060208284031215613c3857613c3761499b565b5b6000613c468482850161399a565b91505092915050565b600060208284031215613c6557613c6461499b565b5b6000613c73848285016139af565b91505092915050565b600060208284031215613c9257613c9161499b565b5b6000613ca0848285016139c4565b91505092915050565b600060208284031215613cbf57613cbe61499b565b5b6000613ccd848285016139d9565b91505092915050565b600060208284031215613cec57613ceb61499b565b5b600082013567ffffffffffffffff811115613d0a57613d09614996565b5b613d1684828501613a1c565b91505092915050565b600060208284031215613d3557613d3461499b565b5b6000613d4384828501613a4a565b91505092915050565b600080600060408486031215613d6557613d6461499b565b5b6000613d7386828701613a4a565b935050602084013567ffffffffffffffff811115613d9457613d93614996565b5b613da086828701613944565b92509250509250925092565b613db5816146d6565b82525050565b613dcc613dc7826146d6565b614842565b82525050565b613ddb816146e8565b82525050565b613dea816146f4565b82525050565b6000613dfb82614573565b613e058185614589565b9350613e15818560208601614763565b613e1e816149a0565b840191505092915050565b6000613e348261457e565b613e3e81856145a5565b9350613e4e818560208601614763565b613e57816149a0565b840191505092915050565b6000613e6d8261457e565b613e7781856145b6565b9350613e87818560208601614763565b80840191505092915050565b6000613ea06026836145a5565b9150613eab826149be565b604082019050919050565b6000613ec3601a836145a5565b9150613ece82614a0d565b602082019050919050565b6000613ee6603d836145a5565b9150613ef182614a36565b604082019050919050565b6000613f09602c836145a5565b9150613f1482614a85565b604082019050919050565b6000613f2c603a836145a5565b9150613f3782614ad4565b604082019050919050565b6000613f4f601d836145a5565b9150613f5a82614b23565b602082019050919050565b6000613f726012836145a5565b9150613f7d82614b4c565b602082019050919050565b6000613f95602f836145a5565b9150613fa082614b75565b604082019050919050565b6000613fb8603e836145a5565b9150613fc382614bc4565b604082019050919050565b6000613fdb6019836145a5565b9150613fe682614c13565b602082019050919050565b6000613ffe6034836145a5565b915061400982614c3c565b604082019050919050565b60006140216020836145a5565b915061402c82614c8b565b602082019050919050565b60006140446016836145a5565b915061404f82614cb4565b602082019050919050565b60006140676029836145a5565b915061407282614cdd565b604082019050919050565b600061408a601c836145a5565b915061409582614d2c565b602082019050919050565b60006140ad602c836145a5565b91506140b882614d55565b604082019050919050565b60006140d0601d836145a5565b91506140db82614da4565b602082019050919050565b60006140f360008361459a565b91506140fe82614dcd565b600082019050919050565b6000614116601a836145a5565b915061412182614dd0565b602082019050919050565b6000614139601f836145a5565b915061414482614df9565b602082019050919050565b6141588161474a565b82525050565b600061416a8284613dbb565b60148201915081905092915050565b60006141858285613e62565b91506141918284613e62565b91508190509392505050565b60006141a8826140e6565b9150819050919050565b60006020820190506141c76000830184613dac565b92915050565b60006080820190506141e26000830187613dac565b6141ef6020830186613dac565b6141fc604083018561414f565b818103606083015261420e8184613df0565b905095945050505050565b600060208201905061422e6000830184613dd2565b92915050565b60006020820190506142496000830184613de1565b92915050565b600060208201905081810360008301526142698184613e29565b905092915050565b6000602082019050818103600083015261428a81613e93565b9050919050565b600060208201905081810360008301526142aa81613eb6565b9050919050565b600060208201905081810360008301526142ca81613ed9565b9050919050565b600060208201905081810360008301526142ea81613efc565b9050919050565b6000602082019050818103600083015261430a81613f1f565b9050919050565b6000602082019050818103600083015261432a81613f42565b9050919050565b6000602082019050818103600083015261434a81613f65565b9050919050565b6000602082019050818103600083015261436a81613f88565b9050919050565b6000602082019050818103600083015261438a81613fab565b9050919050565b600060208201905081810360008301526143aa81613fce565b9050919050565b600060208201905081810360008301526143ca81613ff1565b9050919050565b600060208201905081810360008301526143ea81614014565b9050919050565b6000602082019050818103600083015261440a81614037565b9050919050565b6000602082019050818103600083015261442a8161405a565b9050919050565b6000602082019050818103600083015261444a8161407d565b9050919050565b6000602082019050818103600083015261446a816140a0565b9050919050565b6000602082019050818103600083015261448a816140c3565b9050919050565b600060208201905081810360008301526144aa81614109565b9050919050565b600060208201905081810360008301526144ca8161412c565b9050919050565b60006020820190506144e6600083018461414f565b92915050565b60006144f6614507565b905061450282826147c8565b919050565b6000604051905090565b600067ffffffffffffffff82111561452c5761452b614953565b5b614535826149a0565b9050602081019050919050565b600067ffffffffffffffff82111561455d5761455c614953565b5b614566826149a0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145cc8261474a565b91506145d78361474a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460c5761460b614897565b5b828201905092915050565b60006146228261474a565b915061462d8361474a565b92508261463d5761463c6148c6565b5b828204905092915050565b60006146538261474a565b915061465e8361474a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561469757614696614897565b5b828202905092915050565b60006146ad8261474a565b91506146b88361474a565b9250828210156146cb576146ca614897565b5b828203905092915050565b60006146e18261472a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614781578082015181840152602081019050614766565b83811115614790576000848401525b50505050565b600060028204905060018216806147ae57607f821691505b602082108114156147c2576147c16148f5565b5b50919050565b6147d1826149a0565b810181811067ffffffffffffffff821117156147f0576147ef614953565b5b80604052505050565b60006148048261474a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561483757614836614897565b5b600182019050919050565b600061484d82614854565b9050919050565b600061485f826149b1565b9050919050565b60006148718261474a565b915061487c8361474a565b92508261488c5761488b6148c6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41646472657373206973206e6f742077686974656c6973746564000000000000600082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f206c6f776572206f7220657175616c20746f206d617820737570706c79000000602082015250565b7f4d617820616d6f756e74206f662066726565206d696e7473207065722077616c60008201527f6c65742065786365656465640000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4e6577206d617820737570706c79206c6f776572207468616e20746f74616c2060008201527f6e756d626572206f66206d696e74730000000000000000000000000000000000602082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f20686967686572207468616e207468652063757272656e7420696e6465780000602082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4e6577206d61782066726565206d696e7420737570706c79206d75737420626560008201527f20686967686572207468616e2063757272656e74000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652d73616c65206973206e6f742061637469766500000000000000000000600082015250565b7f4e6577206d617820737570706c79206d757374206265206c6f7765722074686160008201527f6e2063757272656e740000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e6520746f6b656e00000000600082015250565b7f4d617820616d6f756e74206f66206d696e747320706572207472616e7361637460008201527f696f6e2065786365656465640000000000000000000000000000000000000000602082015250565b7f4d61782066726565206d696e7420737570706c79206578636565646564000000600082015250565b50565b7f4578636565646564206d617820746f6b656e73206d696e746564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614e2b816146d6565b8114614e3657600080fd5b50565b614e42816146e8565b8114614e4d57600080fd5b50565b614e59816146f4565b8114614e6457600080fd5b50565b614e70816146fe565b8114614e7b57600080fd5b50565b614e878161474a565b8114614e9257600080fd5b5056fea2646970667358221220b59fc9f761acc9850583e1f1d746e76f3ab4f10bad4b3c15a5c383cd5d9e8ac664736f6c63430008070033

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

d9d9ae5555a5b4828ad4ed996ef509ba0707c089e19df1f7e5f4ee582e253bbc000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000270f0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d624a4241704b765157584b6d656d5063506934377a50446a6e5a4c61466a333679683256534d4d79483556332f00000000000000000000

-----Decoded View---------------
Arg [0] : merkleRoot (bytes32): 0xd9d9ae5555a5b4828ad4ed996ef509ba0707c089e19df1f7e5f4ee582e253bbc
Arg [1] : price (uint256): 10000000000000000
Arg [2] : baseURI (string): ipfs://QmbJBApKvQWXKmemPcPi47zPDjnZLaFj36yh2VSMMyH5V3/
Arg [3] : maxFreeMintPerWallet (uint256): 3
Arg [4] : maxMintPerTransaction (uint256): 20
Arg [5] : maxFreeMintSupply (uint256): 1000
Arg [6] : maxSupply (uint256): 9999

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : d9d9ae5555a5b4828ad4ed996ef509ba0707c089e19df1f7e5f4ee582e253bbc
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [6] : 000000000000000000000000000000000000000000000000000000000000270f
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d624a4241704b765157584b6d656d5063506934377a5044
Arg [9] : 6a6e5a4c61466a333679683256534d4d79483556332f00000000000000000000


Deployed Bytecode Sourcemap

58508:4940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27269:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29879:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31382:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30945:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24506:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32239:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58784:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60093:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26092:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58925:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63274:169;;;;;;;;;;;;;:::i;:::-;;62890:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32480:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25079:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58606:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61186:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29688:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61299:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27705:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45442:103;;;;;;;;;;;;;:::i;:::-;;59836:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58642:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44791:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58701:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60258:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30048:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62476:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31658:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58830:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32736:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60366:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30223:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61429:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61803:665;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58738:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32008:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58882:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60673:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45700:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59955:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27269:372;27371:4;27423:25;27408:40;;;:11;:40;;;;:105;;;;27480:33;27465:48;;;:11;:48;;;;27408:105;:172;;;;27545:35;27530:50;;;:11;:50;;;;27408:172;:225;;;;27597:36;27621:11;27597:23;:36::i;:::-;27408:225;27388:245;;27269:372;;;:::o;29879:100::-;29933:13;29966:5;29959:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29879:100;:::o;31382:204::-;31450:7;31475:16;31483:7;31475;:16::i;:::-;31470:64;;31500:34;;;;;;;;;;;;;;31470:64;31554:15;:24;31570:7;31554:24;;;;;;;;;;;;;;;;;;;;;31547:31;;31382:204;;;:::o;30945:371::-;31018:13;31034:24;31050:7;31034:15;:24::i;:::-;31018:40;;31079:5;31073:11;;:2;:11;;;31069:48;;;31093:24;;;;;;;;;;;;;;31069:48;31150:5;31134:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31160:37;31177:5;31184:12;:10;:12::i;:::-;31160:16;:37::i;:::-;31159:38;31134:63;31130:138;;;31221:35;;;;;;;;;;;;;;31130:138;31280:28;31289:2;31293:7;31302:5;31280:8;:28::i;:::-;31007:309;30945:371;;:::o;24506:280::-;24559:7;24751:12;;;;;;;;;;;24735:13;;;;;;;;;;:28;24728:35;;;;24506:280;:::o;32239:170::-;32373:28;32383:4;32389:2;32393:7;32373:9;:28::i;:::-;32239:170;;;:::o;58784:39::-;;;;:::o;60093:157::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60218:24:::1;60191;:51;;;;60093:157:::0;:::o;26092:1105::-;26181:7;26214:16;26224:5;26214:9;:16::i;:::-;26205:5;:25;26201:61;;26239:23;;;;;;;;;;;;;;26201:61;26273:22;26298:13;;;;;;;;;;;26273:38;;;;26322:19;26352:25;26553:9;26548:557;26568:14;26564:1;:18;26548:557;;;26608:31;26642:11;:14;26654:1;26642:14;;;;;;;;;;;26608:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26679:9;:16;;;26675:73;;;26720:8;;;26675:73;26796:1;26770:28;;:9;:14;;;:28;;;26766:111;;26843:9;:14;;;26823:34;;26766:111;26920:5;26899:26;;:17;:26;;;26895:195;;;26969:5;26954:11;:20;26950:85;;;27010:1;27003:8;;;;;;;;;26950:85;27057:13;;;;;;;26895:195;26589:516;26548:557;26584:3;;;;;;;26548:557;;;;27181:8;;;26092:1105;;;;;:::o;58925:25::-;;;;:::o;63274:169::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48071:1:::1;48669:7;;:19;;48661:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48071:1;48802:7;:18;;;;63335:15:::2;63353:21;63335:39;;63385:50;63223:42;63427:7;63385:17;:50::i;:::-;63324:119;48027:1:::1;48981:7;:22;;;;63274:169::o:0;62890:284::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62993:1:::1;62979:11;:15;62971:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;63077:10;;63062:11;63046:13;::::0;::::1;;;;;;;;:27;;;;;;:::i;:::-;:41;;63038:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;63139:27;63149:3;63154:11;63139:9;:27::i;:::-;62890:284:::0;;:::o;32480:185::-;32618:39;32635:4;32641:2;32645:7;32618:39;;;;;;;;;;;;:16;:39::i;:::-;32480:185;;;:::o;25079:713::-;25146:7;25166:22;25191:13;;;;;;;;;;25166:38;;;;25215:19;25410:9;25405:328;25425:14;25421:1;:18;25405:328;;;25465:31;25499:11;:14;25511:1;25499:14;;;;;;;;;;;25465:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25537:9;:16;;;25532:186;;25597:5;25582:11;:20;25578:85;;;25638:1;25631:8;;;;;;;;25578:85;25685:13;;;;;;;25532:186;25446:287;25441:3;;;;;;;25405:328;;;;25761:23;;;;;;;;;;;;;;25079:713;;;;:::o;58606:26::-;;;;:::o;61186:105::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61273:10:::1;61262:8;:21;;;;;;;;;;;;:::i;:::-;;61186:105:::0;:::o;29688:124::-;29752:7;29779:20;29791:7;29779:11;:20::i;:::-;:25;;;29772:32;;29688:124;;;:::o;61299:122::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61398:15:::1;61377:18;;:36;;;;;;;;;;;;;;;;;;61299:122:::0;:::o;27705:206::-;27769:7;27810:1;27793:19;;:5;:19;;;27789:60;;;27821:28;;;;;;;;;;;;;;27789:60;27875:12;:19;27888:5;27875:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27867:36;;27860:43;;27705:206;;;:::o;45442:103::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45507:30:::1;45534:1;45507:18;:30::i;:::-;45442:103::o:0;59836:111::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59926:13:::1;59912:11;:27;;;;59836:111:::0;:::o;58642:20::-;;;;:::o;44791:87::-;44837:7;44864:6;;;;;;;;;;;44857:13;;44791:87;:::o;58701:30::-;;;;;;;;;;;;;:::o;60258:96::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60335:11:::1;60327:5;:19;;;;60258:96:::0;:::o;30048:104::-;30104:13;30137:7;30130:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30048:104;:::o;62476:406::-;62542:11;61650:1;61636:11;:15;61628:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;61734:10;;61719:11;61703:13;;;;;;;;;;:27;;;;;;:::i;:::-;:41;;61695:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;62574:21:::1;;;;;;;;;;;62566:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62659:24;;62644:11;:39;;62636:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;62764:32;62777:5;;62784:11;62764:12;:32::i;:::-;62751:9;:45;;62743:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;62840:34;62850:10;62862:11;62840:9;:34::i;:::-;62476:406:::0;;:::o;31658:279::-;31761:12;:10;:12::i;:::-;31749:24;;:8;:24;;;31745:54;;;31782:17;;;;;;;;;;;;;;31745:54;31857:8;31812:18;:32;31831:12;:10;:12::i;:::-;31812:32;;;;;;;;;;;;;;;:42;31845:8;31812:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31910:8;31881:48;;31896:12;:10;:12::i;:::-;31881:48;;;31920:8;31881:48;;;;;;:::i;:::-;;;;;;;;31658:279;;:::o;58830:39::-;;;;:::o;32736:342::-;32903:28;32913:4;32919:2;32923:7;32903:9;:28::i;:::-;32947:48;32970:4;32976:2;32980:7;32989:5;32947:22;:48::i;:::-;32942:129;;33019:40;;;;;;;;;;;;;;32942:129;32736:342;;;;:::o;60366:299::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60465:10:::1;;60450:12;:25;60442:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;60556:13;::::0;::::1;;;;;;;;60540:29;;:12;:29;;60532:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;60645:12;60632:10;:25;;;;60366:299:::0;:::o;30223:318::-;30296:13;30327:16;30335:7;30327;:16::i;:::-;30322:59;;30352:29;;;;;;;;;;;;;;30322:59;30394:21;30418:10;:8;:10::i;:::-;30394:34;;30471:1;30452:7;30446:21;:26;;:87;;;;;;;;;;;;;;;;;30499:7;30508:18;:7;:16;:18::i;:::-;30482:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30446:87;30439:94;;;30223:318;;;:::o;61429:134::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61537:18:::1;61513:21;;:42;;;;;;;;;;;;;;;;;;61429:134:::0;:::o;61803:665::-;61906:11;61650:1;61636:11;:15;61628:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;61734:10;;61719:11;61703:13;;;;;;;;;;:27;;;;;;:::i;:::-;:41;;61695:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;61938:18:::1;;;;;;;;;;;61930:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62002:86;62021:12;;62002:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62035:11;;62075:10;62058:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62048:39;;;;;;62002:18;:86::i;:::-;61994:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;62182:24;;62167:11;62138:14;:26;62153:10;62138:26;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:68;;62130:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;62305:20;;62290:11;62274:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:51;;62266:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;62402:11;62372:14;:26;62387:10;62372:26;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;62426:34;62436:10;62448:11;62426:9;:34::i;:::-;61803:665:::0;;;;:::o;58738:33::-;;;;;;;;;;;;;:::o;32008:164::-;32105:4;32129:18;:25;32148:5;32129:25;;;;;;;;;;;;;;;:35;32155:8;32129:35;;;;;;;;;;;;;;;;;;;;;;;;;32122:42;;32008:164;;;;:::o;58882:35::-;;;;:::o;60673:505::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60797:10:::1;;60773:20;:34;;60765:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;60915:20;;60892;:43;60884:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;61034:13;::::0;::::1;;;;;;;;61011:36;;:20;:36;61003:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;61150:20;61127;:43;;;;60673:505:::0;:::o;45700:201::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45809:1:::1;45789:22;;:8;:22;;;;45781:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45865:28;45884:8;45865:18;:28::i;:::-;45700:201:::0;:::o;59955:130::-;45022:12;:10;:12::i;:::-;45011:23;;:7;:5;:7::i;:::-;:23;;;45003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60066:11:::1;60039:24;:38;;;;59955:130:::0;:::o;21080:157::-;21165:4;21204:25;21189:40;;;:11;:40;;;;21182:47;;21080:157;;;:::o;33333:144::-;33390:4;33424:13;;;;;;;;;;;33414:23;;:7;:23;:55;;;;;33442:11;:20;33454:7;33442:20;;;;;;;;;;;:27;;;;;;;;;;;;33441:28;33414:55;33407:62;;33333:144;;;:::o;17879:98::-;17932:7;17959:10;17952:17;;17879:98;:::o;40549:196::-;40691:2;40664:15;:24;40680:7;40664:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40729:7;40725:2;40709:28;;40718:5;40709:28;;;;;;;;;;;;40549:196;;;:::o;36050:2112::-;36165:35;36203:20;36215:7;36203:11;:20::i;:::-;36165:58;;36236:22;36278:13;:18;;;36262:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;36313:50;36330:13;:18;;;36350:12;:10;:12::i;:::-;36313:16;:50::i;:::-;36262:101;:154;;;;36404:12;:10;:12::i;:::-;36380:36;;:20;36392:7;36380:11;:20::i;:::-;:36;;;36262:154;36236:181;;36435:17;36430:66;;36461:35;;;;;;;;;;;;;;36430:66;36533:4;36511:26;;:13;:18;;;:26;;;36507:67;;36546:28;;;;;;;;;;;;;;36507:67;36603:1;36589:16;;:2;:16;;;36585:52;;;36614:23;;;;;;;;;;;;;;36585:52;36650:43;36672:4;36678:2;36682:7;36691:1;36650:21;:43::i;:::-;36758:49;36775:1;36779:7;36788:13;:18;;;36758:8;:49::i;:::-;37133:1;37103:12;:18;37116:4;37103:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37177:1;37149:12;:16;37162:2;37149:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37223:2;37195:11;:20;37207:7;37195:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;37285:15;37240:11;:20;37252:7;37240:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37553:19;37585:1;37575:7;:11;37553:33;;37646:1;37605:43;;:11;:24;37617:11;37605:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37601:445;;;37830:13;;;;;;;;;;37816:27;;:11;:27;37812:219;;;37900:13;:18;;;37868:11;:24;37880:11;37868:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37983:13;:28;;;37941:11;:24;37953:11;37941:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37812:219;37601:445;37078:979;38093:7;38089:2;38074:27;;38083:4;38074:27;;;;;;;;;;;;38112:42;38133:4;38139:2;38143:7;38152:1;38112:20;:42::i;:::-;36154:2008;;36050:2112;;;:::o;11191:317::-;11306:6;11281:21;:31;;11273:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11360:12;11378:9;:14;;11400:6;11378:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11359:52;;;11430:7;11422:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;11262:246;11191:317;;:::o;33485:104::-;33554:27;33564:2;33568:8;33554:27;;;;;;;;;;;;:9;:27::i;:::-;33485:104;;:::o;28543:1083::-;28604:21;;:::i;:::-;28638:12;28653:7;28638:22;;28709:13;;;;;;;;;;28702:20;;:4;:20;28698:861;;;28743:31;28777:11;:17;28789:4;28777:17;;;;;;;;;;;28743:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28818:9;:16;;;28813:731;;28889:1;28863:28;;:9;:14;;;:28;;;28859:101;;28927:9;28920:16;;;;;;28859:101;29264:261;29271:4;29264:261;;;29304:6;;;;;;;;29349:11;:17;29361:4;29349:17;;;;;;;;;;;29337:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29423:1;29397:28;;:9;:14;;;:28;;;29393:109;;29465:9;29458:16;;;;;;29393:109;29264:261;;;28813:731;28724:835;28698:861;29587:31;;;;;;;;;;;;;;28543:1083;;;;:::o;46061:191::-;46135:16;46154:6;;;;;;;;;;;46135:25;;46180:8;46171:6;;:17;;;;;;;;;;;;;;;;;;46235:8;46204:40;;46225:8;46204:40;;;;;;;;;;;;46124:128;46061:191;:::o;52618:98::-;52676:7;52707:1;52703;:5;;;;:::i;:::-;52696:12;;52618:98;;;;:::o;41310:790::-;41465:4;41486:15;:2;:13;;;:15::i;:::-;41482:611;;;41538:2;41522:36;;;41559:12;:10;:12::i;:::-;41573:4;41579:7;41588:5;41522:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41518:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41785:1;41768:6;:13;:18;41764:259;;;41818:40;;;;;;;;;;;;;;41764:259;41973:6;41967:13;41958:6;41954:2;41950:15;41943:38;41518:520;41655:45;;;41645:55;;;:6;:55;;;;41638:62;;;;;41482:611;42077:4;42070:11;;41310:790;;;;;;;:::o;59719:109::-;59779:13;59812:8;59805:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59719:109;:::o;18458:723::-;18514:13;18744:1;18735:5;:10;18731:53;;;18762:10;;;;;;;;;;;;;;;;;;;;;18731:53;18794:12;18809:5;18794:20;;18825:14;18850:78;18865:1;18857:4;:9;18850:78;;18883:8;;;;;:::i;:::-;;;;18914:2;18906:10;;;;;:::i;:::-;;;18850:78;;;18938:19;18970:6;18960:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18938:39;;18988:154;19004:1;18995:5;:10;18988:154;;19032:1;19022:11;;;;;:::i;:::-;;;19099:2;19091:5;:10;;;;:::i;:::-;19078:2;:24;;;;:::i;:::-;19065:39;;19048:6;19055;19048:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19128:2;19119:11;;;;;:::i;:::-;;;18988:154;;;19166:6;19152:21;;;;;18458:723;;;;:::o;56968:190::-;57093:4;57146;57117:25;57130:5;57137:4;57117:12;:25::i;:::-;:33;57110:40;;56968:190;;;;;:::o;42748:159::-;;;;;:::o;43566:158::-;;;;;:::o;33952:163::-;34075:32;34081:2;34085:8;34095:5;34102:4;34075:5;:32::i;:::-;33952:163;;;:::o;9930:326::-;9990:4;10247:1;10225:7;:19;;;:23;10218:30;;9930:326;;;:::o;57520:675::-;57603:7;57623:20;57646:4;57623:27;;57666:9;57661:497;57685:5;:12;57681:1;:16;57661:497;;;57719:20;57742:5;57748:1;57742:8;;;;;;;;:::i;:::-;;;;;;;;57719:31;;57785:12;57769;:28;57765:382;;57912:42;57927:12;57941;57912:14;:42::i;:::-;57897:57;;57765:382;;;58089:42;58104:12;58118;58089:14;:42::i;:::-;58074:57;;57765:382;57704:454;57699:3;;;;;:::i;:::-;;;;57661:497;;;;58175:12;58168:19;;;57520:675;;;;:::o;34374:1422::-;34513:20;34536:13;;;;;;;;;;;34513:36;;;;34578:1;34564:16;;:2;:16;;;34560:48;;;34589:19;;;;;;;;;;;;;;34560:48;34635:1;34623:8;:13;34619:44;;;34645:18;;;;;;;;;;;;;;34619:44;34676:61;34706:1;34710:2;34714:12;34728:8;34676:21;:61::i;:::-;35050:8;35015:12;:16;35028:2;35015:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35114:8;35074:12;:16;35087:2;35074:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35173:2;35140:11;:25;35152:12;35140:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35240:15;35190:11;:25;35202:12;35190:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;35273:20;35296:12;35273:35;;35330:9;35325:328;35345:8;35341:1;:12;35325:328;;;35409:12;35405:2;35384:38;;35401:1;35384:38;;;;;;;;;;;;35445:4;:68;;;;;35454:59;35485:1;35489:2;35493:12;35507:5;35454:22;:59::i;:::-;35453:60;35445:68;35441:164;;;35545:40;;;;;;;;;;;;;;35441:164;35623:14;;;;;;;35355:3;;;;;;;35325:328;;;;35693:12;35669:13;;:37;;;;;;;;;;;;;;;;;;34990:728;35728:60;35757:1;35761:2;35765:12;35779:8;35728:20;:60::i;:::-;34502:1294;34374:1422;;;;:::o;58203:224::-;58271:13;58334:1;58328:4;58321:15;58363:1;58357:4;58350:15;58404:4;58398;58388:21;58379:30;;58203:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:323::-;6412:6;6461:2;6449:9;6440:7;6436:23;6432:32;6429:119;;;6467:79;;:::i;:::-;6429:119;6587:1;6612:50;6654:7;6645:6;6634:9;6630:22;6612:50;:::i;:::-;6602:60;;6558:114;6356:323;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:327::-;7078:6;7127:2;7115:9;7106:7;7102:23;7098:32;7095:119;;;7133:79;;:::i;:::-;7095:119;7253:1;7278:52;7322:7;7313:6;7302:9;7298:22;7278:52;:::i;:::-;7268:62;;7224:116;7020:327;;;;:::o;7353:349::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7597:1;7622:63;7677:7;7668:6;7657:9;7653:22;7622:63;:::i;:::-;7612:73;;7568:127;7353:349;;;;:::o;7708:509::-;7777:6;7826:2;7814:9;7805:7;7801:23;7797:32;7794:119;;;7832:79;;:::i;:::-;7794:119;7980:1;7969:9;7965:17;7952:31;8010:18;8002:6;7999:30;7996:117;;;8032:79;;:::i;:::-;7996:117;8137:63;8192:7;8183:6;8172:9;8168:22;8137:63;:::i;:::-;8127:73;;7923:287;7708:509;;;;:::o;8223:329::-;8282:6;8331:2;8319:9;8310:7;8306:23;8302:32;8299:119;;;8337:79;;:::i;:::-;8299:119;8457:1;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8428:117;8223:329;;;;:::o;8558:704::-;8653:6;8661;8669;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8844:1;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8815:117;8999:2;8988:9;8984:18;8971:32;9030:18;9022:6;9019:30;9016:117;;;9052:79;;:::i;:::-;9016:117;9165:80;9237:7;9228:6;9217:9;9213:22;9165:80;:::i;:::-;9147:98;;;;8942:313;8558:704;;;;;:::o;9268:118::-;9355:24;9373:5;9355:24;:::i;:::-;9350:3;9343:37;9268:118;;:::o;9392:157::-;9497:45;9517:24;9535:5;9517:24;:::i;:::-;9497:45;:::i;:::-;9492:3;9485:58;9392:157;;:::o;9555:109::-;9636:21;9651:5;9636:21;:::i;:::-;9631:3;9624:34;9555:109;;:::o;9670:118::-;9757:24;9775:5;9757:24;:::i;:::-;9752:3;9745:37;9670:118;;:::o;9794:360::-;9880:3;9908:38;9940:5;9908:38;:::i;:::-;9962:70;10025:6;10020:3;9962:70;:::i;:::-;9955:77;;10041:52;10086:6;10081:3;10074:4;10067:5;10063:16;10041:52;:::i;:::-;10118:29;10140:6;10118:29;:::i;:::-;10113:3;10109:39;10102:46;;9884:270;9794:360;;;;:::o;10160:364::-;10248:3;10276:39;10309:5;10276:39;:::i;:::-;10331:71;10395:6;10390:3;10331:71;:::i;:::-;10324:78;;10411:52;10456:6;10451:3;10444:4;10437:5;10433:16;10411:52;:::i;:::-;10488:29;10510:6;10488:29;:::i;:::-;10483:3;10479:39;10472:46;;10252:272;10160:364;;;;:::o;10530:377::-;10636:3;10664:39;10697:5;10664:39;:::i;:::-;10719:89;10801:6;10796:3;10719:89;:::i;:::-;10712:96;;10817:52;10862:6;10857:3;10850:4;10843:5;10839:16;10817:52;:::i;:::-;10894:6;10889:3;10885:16;10878:23;;10640:267;10530:377;;;;:::o;10913:366::-;11055:3;11076:67;11140:2;11135:3;11076:67;:::i;:::-;11069:74;;11152:93;11241:3;11152:93;:::i;:::-;11270:2;11265:3;11261:12;11254:19;;10913:366;;;:::o;11285:::-;11427:3;11448:67;11512:2;11507:3;11448:67;:::i;:::-;11441:74;;11524:93;11613:3;11524:93;:::i;:::-;11642:2;11637:3;11633:12;11626:19;;11285:366;;;:::o;11657:::-;11799:3;11820:67;11884:2;11879:3;11820:67;:::i;:::-;11813:74;;11896:93;11985:3;11896:93;:::i;:::-;12014:2;12009:3;12005:12;11998:19;;11657:366;;;:::o;12029:::-;12171:3;12192:67;12256:2;12251:3;12192:67;:::i;:::-;12185:74;;12268:93;12357:3;12268:93;:::i;:::-;12386:2;12381:3;12377:12;12370:19;;12029:366;;;:::o;12401:::-;12543:3;12564:67;12628:2;12623:3;12564:67;:::i;:::-;12557:74;;12640:93;12729:3;12640:93;:::i;:::-;12758:2;12753:3;12749:12;12742:19;;12401:366;;;:::o;12773:::-;12915:3;12936:67;13000:2;12995:3;12936:67;:::i;:::-;12929:74;;13012:93;13101:3;13012:93;:::i;:::-;13130:2;13125:3;13121:12;13114:19;;12773:366;;;:::o;13145:::-;13287:3;13308:67;13372:2;13367:3;13308:67;:::i;:::-;13301:74;;13384:93;13473:3;13384:93;:::i;:::-;13502:2;13497:3;13493:12;13486:19;;13145:366;;;:::o;13517:::-;13659:3;13680:67;13744:2;13739:3;13680:67;:::i;:::-;13673:74;;13756:93;13845:3;13756:93;:::i;:::-;13874:2;13869:3;13865:12;13858:19;;13517:366;;;:::o;13889:::-;14031:3;14052:67;14116:2;14111:3;14052:67;:::i;:::-;14045:74;;14128:93;14217:3;14128:93;:::i;:::-;14246:2;14241:3;14237:12;14230:19;;13889:366;;;:::o;14261:::-;14403:3;14424:67;14488:2;14483:3;14424:67;:::i;:::-;14417:74;;14500:93;14589:3;14500:93;:::i;:::-;14618:2;14613:3;14609:12;14602:19;;14261:366;;;:::o;14633:::-;14775:3;14796:67;14860:2;14855:3;14796:67;:::i;:::-;14789:74;;14872:93;14961:3;14872:93;:::i;:::-;14990:2;14985:3;14981:12;14974:19;;14633:366;;;:::o;15005:::-;15147:3;15168:67;15232:2;15227:3;15168:67;:::i;:::-;15161:74;;15244:93;15333:3;15244:93;:::i;:::-;15362:2;15357:3;15353:12;15346:19;;15005:366;;;:::o;15377:::-;15519:3;15540:67;15604:2;15599:3;15540:67;:::i;:::-;15533:74;;15616:93;15705:3;15616:93;:::i;:::-;15734:2;15729:3;15725:12;15718:19;;15377:366;;;:::o;15749:::-;15891:3;15912:67;15976:2;15971:3;15912:67;:::i;:::-;15905:74;;15988:93;16077:3;15988:93;:::i;:::-;16106:2;16101:3;16097:12;16090:19;;15749:366;;;:::o;16121:::-;16263:3;16284:67;16348:2;16343:3;16284:67;:::i;:::-;16277:74;;16360:93;16449:3;16360:93;:::i;:::-;16478:2;16473:3;16469:12;16462:19;;16121:366;;;:::o;16493:::-;16635:3;16656:67;16720:2;16715:3;16656:67;:::i;:::-;16649:74;;16732:93;16821:3;16732:93;:::i;:::-;16850:2;16845:3;16841:12;16834:19;;16493:366;;;:::o;16865:::-;17007:3;17028:67;17092:2;17087:3;17028:67;:::i;:::-;17021:74;;17104:93;17193:3;17104:93;:::i;:::-;17222:2;17217:3;17213:12;17206:19;;16865:366;;;:::o;17237:398::-;17396:3;17417:83;17498:1;17493:3;17417:83;:::i;:::-;17410:90;;17509:93;17598:3;17509:93;:::i;:::-;17627:1;17622:3;17618:11;17611:18;;17237:398;;;:::o;17641:366::-;17783:3;17804:67;17868:2;17863:3;17804:67;:::i;:::-;17797:74;;17880:93;17969:3;17880:93;:::i;:::-;17998:2;17993:3;17989:12;17982:19;;17641:366;;;:::o;18013:::-;18155:3;18176:67;18240:2;18235:3;18176:67;:::i;:::-;18169:74;;18252:93;18341:3;18252:93;:::i;:::-;18370:2;18365:3;18361:12;18354:19;;18013:366;;;:::o;18385:118::-;18472:24;18490:5;18472:24;:::i;:::-;18467:3;18460:37;18385:118;;:::o;18509:256::-;18621:3;18636:75;18707:3;18698:6;18636:75;:::i;:::-;18736:2;18731:3;18727:12;18720:19;;18756:3;18749:10;;18509:256;;;;:::o;18771:435::-;18951:3;18973:95;19064:3;19055:6;18973:95;:::i;:::-;18966:102;;19085:95;19176:3;19167:6;19085:95;:::i;:::-;19078:102;;19197:3;19190:10;;18771:435;;;;;:::o;19212:379::-;19396:3;19418:147;19561:3;19418:147;:::i;:::-;19411:154;;19582:3;19575:10;;19212:379;;;:::o;19597:222::-;19690:4;19728:2;19717:9;19713:18;19705:26;;19741:71;19809:1;19798:9;19794:17;19785:6;19741:71;:::i;:::-;19597:222;;;;:::o;19825:640::-;20020:4;20058:3;20047:9;20043:19;20035:27;;20072:71;20140:1;20129:9;20125:17;20116:6;20072:71;:::i;:::-;20153:72;20221:2;20210:9;20206:18;20197:6;20153:72;:::i;:::-;20235;20303:2;20292:9;20288:18;20279:6;20235:72;:::i;:::-;20354:9;20348:4;20344:20;20339:2;20328:9;20324:18;20317:48;20382:76;20453:4;20444:6;20382:76;:::i;:::-;20374:84;;19825:640;;;;;;;:::o;20471:210::-;20558:4;20596:2;20585:9;20581:18;20573:26;;20609:65;20671:1;20660:9;20656:17;20647:6;20609:65;:::i;:::-;20471:210;;;;:::o;20687:222::-;20780:4;20818:2;20807:9;20803:18;20795:26;;20831:71;20899:1;20888:9;20884:17;20875:6;20831:71;:::i;:::-;20687:222;;;;:::o;20915:313::-;21028:4;21066:2;21055:9;21051:18;21043:26;;21115:9;21109:4;21105:20;21101:1;21090:9;21086:17;21079:47;21143:78;21216:4;21207:6;21143:78;:::i;:::-;21135:86;;20915:313;;;;:::o;21234:419::-;21400:4;21438:2;21427:9;21423:18;21415:26;;21487:9;21481:4;21477:20;21473:1;21462:9;21458:17;21451:47;21515:131;21641:4;21515:131;:::i;:::-;21507:139;;21234:419;;;:::o;21659:::-;21825:4;21863:2;21852:9;21848:18;21840:26;;21912:9;21906:4;21902:20;21898:1;21887:9;21883:17;21876:47;21940:131;22066:4;21940:131;:::i;:::-;21932:139;;21659:419;;;:::o;22084:::-;22250:4;22288:2;22277:9;22273:18;22265:26;;22337:9;22331:4;22327:20;22323:1;22312:9;22308:17;22301:47;22365:131;22491:4;22365:131;:::i;:::-;22357:139;;22084:419;;;:::o;22509:::-;22675:4;22713:2;22702:9;22698:18;22690:26;;22762:9;22756:4;22752:20;22748:1;22737:9;22733:17;22726:47;22790:131;22916:4;22790:131;:::i;:::-;22782:139;;22509:419;;;:::o;22934:::-;23100:4;23138:2;23127:9;23123:18;23115:26;;23187:9;23181:4;23177:20;23173:1;23162:9;23158:17;23151:47;23215:131;23341:4;23215:131;:::i;:::-;23207:139;;22934:419;;;:::o;23359:::-;23525:4;23563:2;23552:9;23548:18;23540:26;;23612:9;23606:4;23602:20;23598:1;23587:9;23583:17;23576:47;23640:131;23766:4;23640:131;:::i;:::-;23632:139;;23359:419;;;:::o;23784:::-;23950:4;23988:2;23977:9;23973:18;23965:26;;24037:9;24031:4;24027:20;24023:1;24012:9;24008:17;24001:47;24065:131;24191:4;24065:131;:::i;:::-;24057:139;;23784:419;;;:::o;24209:::-;24375:4;24413:2;24402:9;24398:18;24390:26;;24462:9;24456:4;24452:20;24448:1;24437:9;24433:17;24426:47;24490:131;24616:4;24490:131;:::i;:::-;24482:139;;24209:419;;;:::o;24634:::-;24800:4;24838:2;24827:9;24823:18;24815:26;;24887:9;24881:4;24877:20;24873:1;24862:9;24858:17;24851:47;24915:131;25041:4;24915:131;:::i;:::-;24907:139;;24634:419;;;:::o;25059:::-;25225:4;25263:2;25252:9;25248:18;25240:26;;25312:9;25306:4;25302:20;25298:1;25287:9;25283:17;25276:47;25340:131;25466:4;25340:131;:::i;:::-;25332:139;;25059:419;;;:::o;25484:::-;25650:4;25688:2;25677:9;25673:18;25665:26;;25737:9;25731:4;25727:20;25723:1;25712:9;25708:17;25701:47;25765:131;25891:4;25765:131;:::i;:::-;25757:139;;25484:419;;;:::o;25909:::-;26075:4;26113:2;26102:9;26098:18;26090:26;;26162:9;26156:4;26152:20;26148:1;26137:9;26133:17;26126:47;26190:131;26316:4;26190:131;:::i;:::-;26182:139;;25909:419;;;:::o;26334:::-;26500:4;26538:2;26527:9;26523:18;26515:26;;26587:9;26581:4;26577:20;26573:1;26562:9;26558:17;26551:47;26615:131;26741:4;26615:131;:::i;:::-;26607:139;;26334:419;;;:::o;26759:::-;26925:4;26963:2;26952:9;26948:18;26940:26;;27012:9;27006:4;27002:20;26998:1;26987:9;26983:17;26976:47;27040:131;27166:4;27040:131;:::i;:::-;27032:139;;26759:419;;;:::o;27184:::-;27350:4;27388:2;27377:9;27373:18;27365:26;;27437:9;27431:4;27427:20;27423:1;27412:9;27408:17;27401:47;27465:131;27591:4;27465:131;:::i;:::-;27457:139;;27184:419;;;:::o;27609:::-;27775:4;27813:2;27802:9;27798:18;27790:26;;27862:9;27856:4;27852:20;27848:1;27837:9;27833:17;27826:47;27890:131;28016:4;27890:131;:::i;:::-;27882:139;;27609:419;;;:::o;28034:::-;28200:4;28238:2;28227:9;28223:18;28215:26;;28287:9;28281:4;28277:20;28273:1;28262:9;28258:17;28251:47;28315:131;28441:4;28315:131;:::i;:::-;28307:139;;28034:419;;;:::o;28459:::-;28625:4;28663:2;28652:9;28648:18;28640:26;;28712:9;28706:4;28702:20;28698:1;28687:9;28683:17;28676:47;28740:131;28866:4;28740:131;:::i;:::-;28732:139;;28459:419;;;:::o;28884:::-;29050:4;29088:2;29077:9;29073:18;29065:26;;29137:9;29131:4;29127:20;29123:1;29112:9;29108:17;29101:47;29165:131;29291:4;29165:131;:::i;:::-;29157:139;;28884:419;;;:::o;29309:222::-;29402:4;29440:2;29429:9;29425:18;29417:26;;29453:71;29521:1;29510:9;29506:17;29497:6;29453:71;:::i;:::-;29309:222;;;;:::o;29537:129::-;29571:6;29598:20;;:::i;:::-;29588:30;;29627:33;29655:4;29647:6;29627:33;:::i;:::-;29537:129;;;:::o;29672:75::-;29705:6;29738:2;29732:9;29722:19;;29672:75;:::o;29753:307::-;29814:4;29904:18;29896:6;29893:30;29890:56;;;29926:18;;:::i;:::-;29890:56;29964:29;29986:6;29964:29;:::i;:::-;29956:37;;30048:4;30042;30038:15;30030:23;;29753:307;;;:::o;30066:308::-;30128:4;30218:18;30210:6;30207:30;30204:56;;;30240:18;;:::i;:::-;30204:56;30278:29;30300:6;30278:29;:::i;:::-;30270:37;;30362:4;30356;30352:15;30344:23;;30066:308;;;:::o;30380:98::-;30431:6;30465:5;30459:12;30449:22;;30380:98;;;:::o;30484:99::-;30536:6;30570:5;30564:12;30554:22;;30484:99;;;:::o;30589:168::-;30672:11;30706:6;30701:3;30694:19;30746:4;30741:3;30737:14;30722:29;;30589:168;;;;:::o;30763:147::-;30864:11;30901:3;30886:18;;30763:147;;;;:::o;30916:169::-;31000:11;31034:6;31029:3;31022:19;31074:4;31069:3;31065:14;31050:29;;30916:169;;;;:::o;31091:148::-;31193:11;31230:3;31215:18;;31091:148;;;;:::o;31245:305::-;31285:3;31304:20;31322:1;31304:20;:::i;:::-;31299:25;;31338:20;31356:1;31338:20;:::i;:::-;31333:25;;31492:1;31424:66;31420:74;31417:1;31414:81;31411:107;;;31498:18;;:::i;:::-;31411:107;31542:1;31539;31535:9;31528:16;;31245:305;;;;:::o;31556:185::-;31596:1;31613:20;31631:1;31613:20;:::i;:::-;31608:25;;31647:20;31665:1;31647:20;:::i;:::-;31642:25;;31686:1;31676:35;;31691:18;;:::i;:::-;31676:35;31733:1;31730;31726:9;31721:14;;31556:185;;;;:::o;31747:348::-;31787:7;31810:20;31828:1;31810:20;:::i;:::-;31805:25;;31844:20;31862:1;31844:20;:::i;:::-;31839:25;;32032:1;31964:66;31960:74;31957:1;31954:81;31949:1;31942:9;31935:17;31931:105;31928:131;;;32039:18;;:::i;:::-;31928:131;32087:1;32084;32080:9;32069:20;;31747:348;;;;:::o;32101:191::-;32141:4;32161:20;32179:1;32161:20;:::i;:::-;32156:25;;32195:20;32213:1;32195:20;:::i;:::-;32190:25;;32234:1;32231;32228:8;32225:34;;;32239:18;;:::i;:::-;32225:34;32284:1;32281;32277:9;32269:17;;32101:191;;;;:::o;32298:96::-;32335:7;32364:24;32382:5;32364:24;:::i;:::-;32353:35;;32298:96;;;:::o;32400:90::-;32434:7;32477:5;32470:13;32463:21;32452:32;;32400:90;;;:::o;32496:77::-;32533:7;32562:5;32551:16;;32496:77;;;:::o;32579:149::-;32615:7;32655:66;32648:5;32644:78;32633:89;;32579:149;;;:::o;32734:126::-;32771:7;32811:42;32804:5;32800:54;32789:65;;32734:126;;;:::o;32866:77::-;32903:7;32932:5;32921:16;;32866:77;;;:::o;32949:154::-;33033:6;33028:3;33023;33010:30;33095:1;33086:6;33081:3;33077:16;33070:27;32949:154;;;:::o;33109:307::-;33177:1;33187:113;33201:6;33198:1;33195:13;33187:113;;;33286:1;33281:3;33277:11;33271:18;33267:1;33262:3;33258:11;33251:39;33223:2;33220:1;33216:10;33211:15;;33187:113;;;33318:6;33315:1;33312:13;33309:101;;;33398:1;33389:6;33384:3;33380:16;33373:27;33309:101;33158:258;33109:307;;;:::o;33422:320::-;33466:6;33503:1;33497:4;33493:12;33483:22;;33550:1;33544:4;33540:12;33571:18;33561:81;;33627:4;33619:6;33615:17;33605:27;;33561:81;33689:2;33681:6;33678:14;33658:18;33655:38;33652:84;;;33708:18;;:::i;:::-;33652:84;33473:269;33422:320;;;:::o;33748:281::-;33831:27;33853:4;33831:27;:::i;:::-;33823:6;33819:40;33961:6;33949:10;33946:22;33925:18;33913:10;33910:34;33907:62;33904:88;;;33972:18;;:::i;:::-;33904:88;34012:10;34008:2;34001:22;33791:238;33748:281;;:::o;34035:233::-;34074:3;34097:24;34115:5;34097:24;:::i;:::-;34088:33;;34143:66;34136:5;34133:77;34130:103;;;34213:18;;:::i;:::-;34130:103;34260:1;34253:5;34249:13;34242:20;;34035:233;;;:::o;34274:100::-;34313:7;34342:26;34362:5;34342:26;:::i;:::-;34331:37;;34274:100;;;:::o;34380:94::-;34419:7;34448:20;34462:5;34448:20;:::i;:::-;34437:31;;34380:94;;;:::o;34480:176::-;34512:1;34529:20;34547:1;34529:20;:::i;:::-;34524:25;;34563:20;34581:1;34563:20;:::i;:::-;34558:25;;34602:1;34592:35;;34607:18;;:::i;:::-;34592:35;34648:1;34645;34641:9;34636:14;;34480:176;;;;:::o;34662:180::-;34710:77;34707:1;34700:88;34807:4;34804:1;34797:15;34831:4;34828:1;34821:15;34848:180;34896:77;34893:1;34886:88;34993:4;34990:1;34983:15;35017:4;35014:1;35007:15;35034:180;35082:77;35079:1;35072:88;35179:4;35176:1;35169:15;35203:4;35200:1;35193:15;35220:180;35268:77;35265:1;35258:88;35365:4;35362:1;35355:15;35389:4;35386:1;35379:15;35406:180;35454:77;35451:1;35444:88;35551:4;35548:1;35541:15;35575:4;35572:1;35565:15;35592:117;35701:1;35698;35691:12;35715:117;35824:1;35821;35814:12;35838:117;35947:1;35944;35937:12;35961:117;36070:1;36067;36060:12;36084:117;36193:1;36190;36183:12;36207:117;36316:1;36313;36306:12;36330:102;36371:6;36422:2;36418:7;36413:2;36406:5;36402:14;36398:28;36388:38;;36330:102;;;:::o;36438:94::-;36471:8;36519:5;36515:2;36511:14;36490:35;;36438:94;;;:::o;36538:225::-;36678:34;36674:1;36666:6;36662:14;36655:58;36747:8;36742:2;36734:6;36730:15;36723:33;36538:225;:::o;36769:176::-;36909:28;36905:1;36897:6;36893:14;36886:52;36769:176;:::o;36951:248::-;37091:34;37087:1;37079:6;37075:14;37068:58;37160:31;37155:2;37147:6;37143:15;37136:56;36951:248;:::o;37205:231::-;37345:34;37341:1;37333:6;37329:14;37322:58;37414:14;37409:2;37401:6;37397:15;37390:39;37205:231;:::o;37442:245::-;37582:34;37578:1;37570:6;37566:14;37559:58;37651:28;37646:2;37638:6;37634:15;37627:53;37442:245;:::o;37693:179::-;37833:31;37829:1;37821:6;37817:14;37810:55;37693:179;:::o;37878:168::-;38018:20;38014:1;38006:6;38002:14;37995:44;37878:168;:::o;38052:234::-;38192:34;38188:1;38180:6;38176:14;38169:58;38261:17;38256:2;38248:6;38244:15;38237:42;38052:234;:::o;38292:249::-;38432:34;38428:1;38420:6;38416:14;38409:58;38501:32;38496:2;38488:6;38484:15;38477:57;38292:249;:::o;38547:175::-;38687:27;38683:1;38675:6;38671:14;38664:51;38547:175;:::o;38728:239::-;38868:34;38864:1;38856:6;38852:14;38845:58;38937:22;38932:2;38924:6;38920:15;38913:47;38728:239;:::o;38973:182::-;39113:34;39109:1;39101:6;39097:14;39090:58;38973:182;:::o;39161:172::-;39301:24;39297:1;39289:6;39285:14;39278:48;39161:172;:::o;39339:228::-;39479:34;39475:1;39467:6;39463:14;39456:58;39548:11;39543:2;39535:6;39531:15;39524:36;39339:228;:::o;39573:178::-;39713:30;39709:1;39701:6;39697:14;39690:54;39573:178;:::o;39757:231::-;39897:34;39893:1;39885:6;39881:14;39874:58;39966:14;39961:2;39953:6;39949:15;39942:39;39757:231;:::o;39994:179::-;40134:31;40130:1;40122:6;40118:14;40111:55;39994:179;:::o;40179:114::-;;:::o;40299:176::-;40439:28;40435:1;40427:6;40423:14;40416:52;40299:176;:::o;40481:181::-;40621:33;40617:1;40609:6;40605:14;40598:57;40481:181;:::o;40668:122::-;40741:24;40759:5;40741:24;:::i;:::-;40734:5;40731:35;40721:63;;40780:1;40777;40770:12;40721:63;40668:122;:::o;40796:116::-;40866:21;40881:5;40866:21;:::i;:::-;40859:5;40856:32;40846:60;;40902:1;40899;40892:12;40846:60;40796:116;:::o;40918:122::-;40991:24;41009:5;40991:24;:::i;:::-;40984:5;40981:35;40971:63;;41030:1;41027;41020:12;40971:63;40918:122;:::o;41046:120::-;41118:23;41135:5;41118:23;:::i;:::-;41111:5;41108:34;41098:62;;41156:1;41153;41146:12;41098:62;41046:120;:::o;41172:122::-;41245:24;41263:5;41245:24;:::i;:::-;41238:5;41235:35;41225:63;;41284:1;41281;41274:12;41225:63;41172:122;:::o

Swarm Source

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

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