ETH Price: $3,363.81 (-2.34%)
Gas: 2 Gwei

Token

Shinsekai Drifters (DRIFT)
 

Overview

Max Total Supply

5,555 DRIFT

Holders

1,836

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
19921111.eth
Balance
3 DRIFT
0xdE4E81A778b99e8412ea3a3F765EB6179b87f198
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:
ShinsekaiDrifters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/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/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/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/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: @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/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/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/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: @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: 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 AuxQueryForZeroAddress();
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 extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 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**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    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;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * 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 (_startTokenId() <= curr && 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 (to.isContract() && !_checkContractOnERC721Received(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 _startTokenId() <= tokenId && 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 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;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            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**256.
        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**256.
        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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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))
                }
            }
        }
    }

    /**
     * @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: contracts/ShinsekaiDrifters.sol



pragma solidity ^0.8.4;




contract ShinsekaiDrifters is ERC721A, Ownable {
    using Address for address;
    using Strings for uint256;

    //  Format of files stores in ipfs
    string private uriPrefix = "";
    string private uriSuffix = ".json";
    
    //  Init uri for when collection is not revealed
    string public hiddenMetadataUri;

    //  Init values for cost, max supply, max mint amount, and allowlist mapping
    uint256 public whitelistPrice = 0.066 ether; 
    uint256 public publicPrice = 0.08 ether; 
    uint256 public maxSupply = 5555;
    uint256 public maxMintAmountWhitelist = 3;
    uint256 public maxMintAmountPublic = 3;
    mapping(address => uint256) public allowlistCount; 

    //  Contract will be initalized as paused and not revealed.
    bool public paused = true;
    bool public revealed = false;
    uint32 public publicSaleStartTime;

    bytes32 private whitelistMerkleRoot;
    constructor() ERC721A("Shinsekai Drifters", "DRIFT") {
        // must set hidden uri.
        setHiddenMetadataUri("ipfs://QmVnkNPDjSnoZ99zjSooqsQN3cyU3R5mdPV5WkgVDSEgF7/");

        // placeholder for public launch time. will update to prevent botting
        setPublicSaleStartTime(1648238400);

        /* hold back total 157 (2 minted through public/allowlist for testing
           to airdrop phase 1 holders 
           their respective mints and customizable nfts
           due to contract migration
        */
        _safeMint(msg.sender, 155);    
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        require(!paused, "NFT is not available for mint");
        _;
    }

    // general mint 
    function publicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(isPublicSaleOn() == true, "Public sale has not begun yet");
        require(_mintAmount > 0 && _numberMinted(msg.sender) + _mintAmount - allowlistCount[msg.sender] <= maxMintAmountPublic, "Invalid mint amount!");
        require(msg.value >= publicPrice * _mintAmount, "Insufficient funds!");
        _safeMint(msg.sender, _mintAmount);
        refundIfOver(publicPrice * _mintAmount);
    }

    // allowlist Mint
    function allowlistMint(bytes32[] calldata merkleProof, uint256 _mintAmount) public payable mintCompliance(_mintAmount) isValidMerkleProof(merkleProof, whitelistMerkleRoot){
        require(_mintAmount > 0 && _numberMinted(msg.sender) + _mintAmount <= maxMintAmountWhitelist, "Invalid mint amount!");
        require(msg.value >= whitelistPrice * _mintAmount, "Insufficient funds!");
        allowlistCount[msg.sender]+=_mintAmount;
        _safeMint(msg.sender, _mintAmount);
        refundIfOver(whitelistPrice * _mintAmount);
    }

    // for marketing etc.
    function devMint(uint256 _mintAmount) external onlyOwner {
        require(totalSupply() + _mintAmount <= maxSupply, "Too many already minted before dev mint");
        _safeMint(msg.sender, _mintAmount);
        
    }

    //  refund if value sent if more than price
    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
        payable(msg.sender).transfer(msg.value - price);
        }
    }

    // check if reached public sale 
    function isPublicSaleOn() public view returns (bool) {
        return block.timestamp >= publicSaleStartTime;
    }

    //  set merkleroot node
    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    //  verify merkletree 
    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))),
            "Address does not exist in list"
        );
        _;
    }

    function setPublicPrice(uint32 _publicPrice) public onlyOwner{
        publicPrice = _publicPrice;
    }

    function setWhitelistPrice(uint32 _whitelistPrice) public onlyOwner{
        whitelistPrice = _whitelistPrice;
    }
    
    // set public sale start time
    function setPublicSaleStartTime(uint32 timestamp) public onlyOwner{
        publicSaleStartTime = timestamp;
    }

    // set whitelist max mint if needed
    function setMaxMintAmountWhitelist(uint32 _maxMintAmountWhitelist) public onlyOwner{
        maxMintAmountWhitelist = _maxMintAmountWhitelist;
    }

    // set public max mint if needed
    function setMaxMintAmountPublic(uint32 _maxMintAmountPublic) public onlyOwner{
        maxMintAmountPublic = _maxMintAmountPublic;
    }

    //  reveal 
    function toggleReveal() public onlyOwner {
        revealed = !revealed;
    }
    
    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setMaxSupply(uint32 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setPause(bool _state) public onlyOwner {
        paused = _state;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        if (revealed == false) {
            return bytes(hiddenMetadataUri).length != 0 ? string(abi.encodePacked(hiddenMetadataUri, tokenId.toString(), uriSuffix)) : '';
        }
        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), uriSuffix)) : '';
    }

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

    function withdraw() public payable onlyOwner {
        // This will payout the owner the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","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"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxMintAmountPublic","type":"uint32"}],"name":"setMaxMintAmountPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxMintAmountWhitelist","type":"uint32"}],"name":"setMaxMintAmountWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxSupply","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_publicPrice","type":"uint32"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_whitelistPrice","type":"uint32"}],"name":"setWhitelistPrice","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":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","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":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b92919062000a4b565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007992919062000a4b565b5066ea7aa67b2d0000600c5567011c37937e080000600d556115b3600e556003600f5560036010556001601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550348015620000e457600080fd5b506040518060400160405280601281526020017f5368696e73656b616920447269667465727300000000000000000000000000008152506040518060400160405280600581526020017f445249465400000000000000000000000000000000000000000000000000000081525081600290805190602001906200016992919062000a4b565b5080600390805190602001906200018292919062000a4b565b50620001936200021360201b60201c565b6000819055505050620001bb620001af6200021860201b60201c565b6200022060201b60201c565b620001e5604051806060016040528060368152602001620056f860369139620002e660201b60201c565b620001fa63623e1f406200039160201b60201c565b6200020d33609b6200044460201b60201c565b62000dcf565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f66200021860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031c6200046a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000375576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036c9062000c22565b60405180910390fd5b80600b90805190602001906200038d92919062000a4b565b5050565b620003a16200021860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003c76200046a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004179062000c22565b60405180910390fd5b80601260026101000a81548163ffffffff021916908363ffffffff16021790555050565b620004668282604051806020016040528060008152506200049460201b60201c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004a98383836001620004ae60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200051c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000558576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200056d6000868387620008aa60201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620007455750620007448773ffffffffffffffffffffffffffffffffffffffff16620008b060201b6200225d1760201c565b5b1562000818575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620007c36000888480600101955088620008d360201b60201c565b620007fa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156200074c5782600054146200081257600080fd5b62000885565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000819575b816000819055505050620008a3600086838762000a4560201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620009016200021860201b60201c565b8786866040518563ffffffff1660e01b815260040162000925949392919062000bce565b602060405180830381600087803b1580156200094057600080fd5b505af19250505080156200097457506040513d601f19601f8201168201806040525081019062000971919062000b12565b60015b620009f2573d8060008114620009a7576040519150601f19603f3d011682016040523d82523d6000602084013e620009ac565b606091505b50600081511415620009ea576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b82805462000a599062000d11565b90600052602060002090601f01602090048101928262000a7d576000855562000ac9565b82601f1062000a9857805160ff191683800117855562000ac9565b8280016001018555821562000ac9579182015b8281111562000ac857825182559160200191906001019062000aab565b5b50905062000ad8919062000adc565b5090565b5b8082111562000af757600081600090555060010162000add565b5090565b60008151905062000b0c8162000db5565b92915050565b60006020828403121562000b2b5762000b2a62000d76565b5b600062000b3b8482850162000afb565b91505092915050565b62000b4f8162000c71565b82525050565b600062000b628262000c44565b62000b6e818562000c4f565b935062000b8081856020860162000cdb565b62000b8b8162000d7b565b840191505092915050565b600062000ba560208362000c60565b915062000bb28262000d8c565b602082019050919050565b62000bc88162000cd1565b82525050565b600060808201905062000be5600083018762000b44565b62000bf4602083018662000b44565b62000c03604083018562000bbd565b818103606083015262000c17818462000b55565b905095945050505050565b6000602082019050818103600083015262000c3d8162000b96565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000c7e8262000cb1565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000cfb57808201518184015260208101905062000cde565b8381111562000d0b576000848401525b50505050565b6000600282049050600182168062000d2a57607f821691505b6020821081141562000d415762000d4062000d47565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000dc08162000c85565b811462000dcc57600080fd5b50565b6149198062000ddf6000396000f3fe6080604052600436106102675760003560e01c80635fd84c2811610144578063a945bf80116100b6578063d5abeb011161007a578063d5abeb01146108b5578063d8d988da146108e0578063e985e9c514610909578063f2fde38b14610946578063f9da32241461096f578063fc1a1c361461099857610267565b8063a945bf80146107d2578063b88d4fde146107fd578063bd32fb6614610826578063bedb86fb1461084f578063c87b56dd1461087857610267565b806374d9e7ac1161010857806374d9e7ac146106d45780637ec4a659146106ff5780638da5cb5b1461072857806395d89b4114610753578063a22cb4651461077e578063a45ba8e7146107a757610267565b80635fd84c28146105ef5780636352211e146106185780636bb7b1d91461065557806370a0823114610680578063715018a6146106bd57610267565b806323b872dd116101dd5780633f5e4741116101a15780633f5e47411461050557806342842e0e146105305780634fdd43cb1461055957806351830227146105825780635b8ad429146105ad5780635c975abb146105c457610267565b806323b872dd1461046457806326a326271461048d5780632db11544146104b6578063375a069a146104d25780633ccfd60b146104fb57610267565b80631338a83f1161022f5780631338a83f1461036357806316ba10e01461037f57806317c862a2146103a857806317f7bece146103d157806318160ddd146103fc5780631e16ffba1461042757610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630c888ffd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613ada565b6109c3565b6040516102a09190613fc6565b60405180910390f35b3480156102b557600080fd5b506102be610aa5565b6040516102cb9190613fe1565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613b7d565b610b37565b6040516103089190613f5f565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906139e0565b610bb3565b005b34801561034657600080fd5b50610361600480360381019061035c9190613baa565b610cbe565b005b61037d60048036038101906103789190613a20565b610d4a565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613b34565b610fdb565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613baa565b611071565b005b3480156103dd57600080fd5b506103e66110fd565b6040516103f39190614143565b60405180910390f35b34801561040857600080fd5b50610411611103565b60405161041e9190614143565b60405180910390f35b34801561043357600080fd5b5061044e6004803603810190610449919061385d565b61111a565b60405161045b9190614143565b60405180910390f35b34801561047057600080fd5b5061048b600480360381019061048691906138ca565b611132565b005b34801561049957600080fd5b506104b460048036038101906104af9190613baa565b611142565b005b6104d060048036038101906104cb9190613b7d565b6111ce565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613b7d565b6113e6565b005b6105036114c6565b005b34801561051157600080fd5b5061051a6115c2565b6040516105279190613fc6565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906138ca565b6115e5565b005b34801561056557600080fd5b50610580600480360381019061057b9190613b34565b611605565b005b34801561058e57600080fd5b5061059761169b565b6040516105a49190613fc6565b60405180910390f35b3480156105b957600080fd5b506105c26116ae565b005b3480156105d057600080fd5b506105d9611756565b6040516105e69190613fc6565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613baa565b611769565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613b7d565b611809565b60405161064c9190613f5f565b60405180910390f35b34801561066157600080fd5b5061066a61181f565b604051610677919061415e565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061385d565b611835565b6040516106b49190614143565b60405180910390f35b3480156106c957600080fd5b506106d2611905565b005b3480156106e057600080fd5b506106e961198d565b6040516106f69190614143565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613b34565b611993565b005b34801561073457600080fd5b5061073d611a29565b60405161074a9190613f5f565b60405180910390f35b34801561075f57600080fd5b50610768611a53565b6040516107759190613fe1565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a091906139a0565b611ae5565b005b3480156107b357600080fd5b506107bc611c5d565b6040516107c99190613fe1565b60405180910390f35b3480156107de57600080fd5b506107e7611ceb565b6040516107f49190614143565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061391d565b611cf1565b005b34801561083257600080fd5b5061084d60048036038101906108489190613aad565b611d6d565b005b34801561085b57600080fd5b5061087660048036038101906108719190613a80565b611df3565b005b34801561088457600080fd5b5061089f600480360381019061089a9190613b7d565b611e8c565b6040516108ac9190613fe1565b60405180910390f35b3480156108c157600080fd5b506108ca611fad565b6040516108d79190614143565b60405180910390f35b3480156108ec57600080fd5b5061090760048036038101906109029190613baa565b611fb3565b005b34801561091557600080fd5b50610930600480360381019061092b919061388a565b61203f565b60405161093d9190613fc6565b60405180910390f35b34801561095257600080fd5b5061096d6004803603810190610968919061385d565b6120d3565b005b34801561097b57600080fd5b5061099660048036038101906109919190613baa565b6121cb565b005b3480156109a457600080fd5b506109ad612257565b6040516109ba9190614143565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9e5750610a9d82612280565b5b9050919050565b606060028054610ab490614448565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090614448565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b42826122ea565b610b78576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbe82611809565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c26576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c45612338565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c775750610c7581610c70612338565b61203f565b155b15610cae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb9838383612340565b505050565b610cc6612338565b73ffffffffffffffffffffffffffffffffffffffff16610ce4611a29565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190614083565b60405180910390fd5b8063ffffffff16600f8190555050565b80600e5481610d57611103565b610d619190614263565b1115610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d99906140c3565b60405180910390fd5b601260009054906101000a900460ff1615610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906140e3565b60405180910390fd5b8383601354610e69838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e4e9190613ecd565b604051602081830303815290604052805190602001206123f2565b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614063565b60405180910390fd5b600085118015610ecd5750600f5485610ec033612409565b610eca9190614263565b11155b610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390614043565b60405180910390fd5b84600c54610f1a91906142ea565b341015610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614123565b60405180910390fd5b84601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fab9190614263565b92505081905550610fbc33866124d9565b610fd285600c54610fcd91906142ea565b6124f7565b50505050505050565b610fe3612338565b73ffffffffffffffffffffffffffffffffffffffff16611001611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614083565b60405180910390fd5b80600a908051906020019061106d9291906135ae565b5050565b611079612338565b73ffffffffffffffffffffffffffffffffffffffff16611097611a29565b73ffffffffffffffffffffffffffffffffffffffff16146110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e490614083565b60405180910390fd5b8063ffffffff1660108190555050565b60105481565b600061110d612598565b6001546000540303905090565b60116020528060005260406000206000915090505481565b61113d83838361259d565b505050565b61114a612338565b73ffffffffffffffffffffffffffffffffffffffff16611168611a29565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590614083565b60405180910390fd5b8063ffffffff16600c8190555050565b80600e54816111db611103565b6111e59190614263565b1115611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906140c3565b60405180910390fd5b601260009054906101000a900460ff1615611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906140e3565b60405180910390fd5b600115156112826115c2565b1515146112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90614003565b60405180910390fd5b6000821180156113335750601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361131c33612409565b6113269190614263565b6113309190614344565b11155b611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990614043565b60405180910390fd5b81600d5461138091906142ea565b3410156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614123565b60405180910390fd5b6113cc33836124d9565b6113e282600d546113dd91906142ea565b6124f7565b5050565b6113ee612338565b73ffffffffffffffffffffffffffffffffffffffff1661140c611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990614083565b60405180910390fd5b600e548161146e611103565b6114789190614263565b11156114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906140a3565b60405180910390fd5b6114c333826124d9565b50565b6114ce612338565b73ffffffffffffffffffffffffffffffffffffffff166114ec611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990614083565b60405180910390fd5b600061154c611a29565b73ffffffffffffffffffffffffffffffffffffffff164760405161156f90613f4a565b60006040518083038185875af1925050503d80600081146115ac576040519150601f19603f3d011682016040523d82523d6000602084013e6115b1565b606091505b50509050806115bf57600080fd5b50565b6000601260029054906101000a900463ffffffff1663ffffffff16421015905090565b61160083838360405180602001604052806000815250611cf1565b505050565b61160d612338565b73ffffffffffffffffffffffffffffffffffffffff1661162b611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614083565b60405180910390fd5b80600b90805190602001906116979291906135ae565b5050565b601260019054906101000a900460ff1681565b6116b6612338565b73ffffffffffffffffffffffffffffffffffffffff166116d4611a29565b73ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614083565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b611771612338565b73ffffffffffffffffffffffffffffffffffffffff1661178f611a29565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614083565b60405180910390fd5b80601260026101000a81548163ffffffff021916908363ffffffff16021790555050565b600061181482612a8e565b600001519050919050565b601260029054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61190d612338565b73ffffffffffffffffffffffffffffffffffffffff1661192b611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614083565b60405180910390fd5b61198b6000612d1d565b565b600f5481565b61199b612338565b73ffffffffffffffffffffffffffffffffffffffff166119b9611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690614083565b60405180910390fd5b8060099080519060200190611a259291906135ae565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a6290614448565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8e90614448565b8015611adb5780601f10611ab057610100808354040283529160200191611adb565b820191906000526020600020905b815481529060010190602001808311611abe57829003601f168201915b5050505050905090565b611aed612338565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b5f612338565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0c612338565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c519190613fc6565b60405180910390a35050565b600b8054611c6a90614448565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9690614448565b8015611ce35780601f10611cb857610100808354040283529160200191611ce3565b820191906000526020600020905b815481529060010190602001808311611cc657829003601f168201915b505050505081565b600d5481565b611cfc84848461259d565b611d1b8373ffffffffffffffffffffffffffffffffffffffff1661225d565b8015611d305750611d2e84848484612de3565b155b15611d67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611d75612338565b73ffffffffffffffffffffffffffffffffffffffff16611d93611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090614083565b60405180910390fd5b8060138190555050565b611dfb612338565b73ffffffffffffffffffffffffffffffffffffffff16611e19611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690614083565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6060611e97826122ea565b611ecd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515601260019054906101000a900460ff1615151415611f4b576000600b8054611ef890614448565b90501415611f155760405180602001604052806000815250611f44565b600b611f2083612f43565b600a604051602001611f3493929190613f19565b6040516020818303038152906040525b9050611fa8565b6000611f556130a4565b9050600081511415611f765760405180602001604052806000815250611fa4565b80611f8084612f43565b600a604051602001611f9493929190613ee8565b6040516020818303038152906040525b9150505b919050565b600e5481565b611fbb612338565b73ffffffffffffffffffffffffffffffffffffffff16611fd9611a29565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614083565b60405180910390fd5b8063ffffffff16600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120db612338565b73ffffffffffffffffffffffffffffffffffffffff166120f9611a29565b73ffffffffffffffffffffffffffffffffffffffff161461214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614083565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614023565b60405180910390fd5b6121c881612d1d565b50565b6121d3612338565b73ffffffffffffffffffffffffffffffffffffffff166121f1611a29565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614083565b60405180910390fd5b8063ffffffff16600e8190555050565b600c5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816122f5612598565b11158015612304575060005482105b8015612331575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826123ff8584613136565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612471576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6124f38282604051806020016040528060008152506131ab565b5050565b8034101561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614103565b60405180910390fd5b80341115612595573373ffffffffffffffffffffffffffffffffffffffff166108fc82346125689190614344565b9081150290604051600060405180830381858888f19350505050158015612593573d6000803e3d6000fd5b505b50565b600090565b60006125a882612a8e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166125cf612338565b73ffffffffffffffffffffffffffffffffffffffff161480612602575061260182600001516125fc612338565b61203f565b5b806126475750612610612338565b73ffffffffffffffffffffffffffffffffffffffff1661262f84610b37565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612680576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612750576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61275d85858560016131bd565b61276d6000848460000151612340565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a1e57600054811015612a1d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a8785858560016131c3565b5050505050565b612a96613634565b600082905080612aa4612598565b11158015612ab3575060005481105b15612ce6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ce457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc8578092505050612d18565b5b600115612ce357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612cde578092505050612d18565b612bc9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e09612338565b8786866040518563ffffffff1660e01b8152600401612e2b9493929190613f7a565b602060405180830381600087803b158015612e4557600080fd5b505af1925050508015612e7657506040513d601f19601f82011682018060405250810190612e739190613b07565b60015b612ef0573d8060008114612ea6576040519150601f19603f3d011682016040523d82523d6000602084013e612eab565b606091505b50600081511415612ee8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612f8b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061309f565b600082905060005b60008214612fbd578080612fa6906144ab565b915050600a82612fb691906142b9565b9150612f93565b60008167ffffffffffffffff811115612fd957612fd8614605565b5b6040519080825280601f01601f19166020018201604052801561300b5781602001600182028036833780820191505090505b5090505b60008514613098576001826130249190614344565b9150600a856130339190614518565b603061303f9190614263565b60f81b818381518110613055576130546145d6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561309191906142b9565b945061300f565b8093505050505b919050565b6060600980546130b390614448565b80601f01602080910402602001604051908101604052809291908181526020018280546130df90614448565b801561312c5780601f106131015761010080835404028352916020019161312c565b820191906000526020600020905b81548152906001019060200180831161310f57829003601f168201915b5050505050905090565b60008082905060005b84518110156131a057600085828151811061315d5761315c6145d6565b5b6020026020010151905080831161317f5761317883826131c9565b925061318c565b61318981846131c9565b92505b508080613198906144ab565b91505061313f565b508091505092915050565b6131b883838360016131e0565b505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561324d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613288576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61329560008683876131bd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561345f575061345e8773ffffffffffffffffffffffffffffffffffffffff1661225d565b5b15613525575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134d46000888480600101955088612de3565b61350a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561346557826000541461352057600080fd5b613591565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613526575b8160008190555050506135a760008683876131c3565b5050505050565b8280546135ba90614448565b90600052602060002090601f0160209004810192826135dc5760008555613623565b82601f106135f557805160ff1916838001178555613623565b82800160010185558215613623579182015b82811115613622578251825591602001919060010190613607565b5b5090506136309190613677565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613690576000816000905550600101613678565b5090565b60006136a76136a28461419e565b614179565b9050828152602081018484840111156136c3576136c2614643565b5b6136ce848285614406565b509392505050565b60006136e96136e4846141cf565b614179565b90508281526020810184848401111561370557613704614643565b5b613710848285614406565b509392505050565b60008135905061372781614859565b92915050565b60008083601f84011261374357613742614639565b5b8235905067ffffffffffffffff8111156137605761375f614634565b5b60208301915083602082028301111561377c5761377b61463e565b5b9250929050565b60008135905061379281614870565b92915050565b6000813590506137a781614887565b92915050565b6000813590506137bc8161489e565b92915050565b6000815190506137d18161489e565b92915050565b600082601f8301126137ec576137eb614639565b5b81356137fc848260208601613694565b91505092915050565b600082601f83011261381a57613819614639565b5b813561382a8482602086016136d6565b91505092915050565b600081359050613842816148b5565b92915050565b600081359050613857816148cc565b92915050565b6000602082840312156138735761387261464d565b5b600061388184828501613718565b91505092915050565b600080604083850312156138a1576138a061464d565b5b60006138af85828601613718565b92505060206138c085828601613718565b9150509250929050565b6000806000606084860312156138e3576138e261464d565b5b60006138f186828701613718565b935050602061390286828701613718565b925050604061391386828701613833565b9150509250925092565b600080600080608085870312156139375761393661464d565b5b600061394587828801613718565b945050602061395687828801613718565b935050604061396787828801613833565b925050606085013567ffffffffffffffff81111561398857613987614648565b5b613994878288016137d7565b91505092959194509250565b600080604083850312156139b7576139b661464d565b5b60006139c585828601613718565b92505060206139d685828601613783565b9150509250929050565b600080604083850312156139f7576139f661464d565b5b6000613a0585828601613718565b9250506020613a1685828601613833565b9150509250929050565b600080600060408486031215613a3957613a3861464d565b5b600084013567ffffffffffffffff811115613a5757613a56614648565b5b613a638682870161372d565b93509350506020613a7686828701613833565b9150509250925092565b600060208284031215613a9657613a9561464d565b5b6000613aa484828501613783565b91505092915050565b600060208284031215613ac357613ac261464d565b5b6000613ad184828501613798565b91505092915050565b600060208284031215613af057613aef61464d565b5b6000613afe848285016137ad565b91505092915050565b600060208284031215613b1d57613b1c61464d565b5b6000613b2b848285016137c2565b91505092915050565b600060208284031215613b4a57613b4961464d565b5b600082013567ffffffffffffffff811115613b6857613b67614648565b5b613b7484828501613805565b91505092915050565b600060208284031215613b9357613b9261464d565b5b6000613ba184828501613833565b91505092915050565b600060208284031215613bc057613bbf61464d565b5b6000613bce84828501613848565b91505092915050565b613be081614378565b82525050565b613bf7613bf282614378565b6144f4565b82525050565b613c068161438a565b82525050565b6000613c1782614215565b613c21818561422b565b9350613c31818560208601614415565b613c3a81614652565b840191505092915050565b6000613c5082614220565b613c5a8185614247565b9350613c6a818560208601614415565b613c7381614652565b840191505092915050565b6000613c8982614220565b613c938185614258565b9350613ca3818560208601614415565b80840191505092915050565b60008154613cbc81614448565b613cc68186614258565b94506001821660008114613ce15760018114613cf257613d25565b60ff19831686528186019350613d25565b613cfb85614200565b60005b83811015613d1d57815481890152600182019150602081019050613cfe565b838801955050505b50505092915050565b6000613d3b601d83614247565b9150613d4682614670565b602082019050919050565b6000613d5e602683614247565b9150613d6982614699565b604082019050919050565b6000613d81601483614247565b9150613d8c826146e8565b602082019050919050565b6000613da4601e83614247565b9150613daf82614711565b602082019050919050565b6000613dc7602083614247565b9150613dd28261473a565b602082019050919050565b6000613dea602783614247565b9150613df582614763565b604082019050919050565b6000613e0d60008361423c565b9150613e18826147b2565b600082019050919050565b6000613e30601483614247565b9150613e3b826147b5565b602082019050919050565b6000613e53601d83614247565b9150613e5e826147de565b602082019050919050565b6000613e76601683614247565b9150613e8182614807565b602082019050919050565b6000613e99601383614247565b9150613ea482614830565b602082019050919050565b613eb8816143ec565b82525050565b613ec7816143f6565b82525050565b6000613ed98284613be6565b60148201915081905092915050565b6000613ef48286613c7e565b9150613f008285613c7e565b9150613f0c8284613caf565b9150819050949350505050565b6000613f258286613caf565b9150613f318285613c7e565b9150613f3d8284613caf565b9150819050949350505050565b6000613f5582613e00565b9150819050919050565b6000602082019050613f746000830184613bd7565b92915050565b6000608082019050613f8f6000830187613bd7565b613f9c6020830186613bd7565b613fa96040830185613eaf565b8181036060830152613fbb8184613c0c565b905095945050505050565b6000602082019050613fdb6000830184613bfd565b92915050565b60006020820190508181036000830152613ffb8184613c45565b905092915050565b6000602082019050818103600083015261401c81613d2e565b9050919050565b6000602082019050818103600083015261403c81613d51565b9050919050565b6000602082019050818103600083015261405c81613d74565b9050919050565b6000602082019050818103600083015261407c81613d97565b9050919050565b6000602082019050818103600083015261409c81613dba565b9050919050565b600060208201905081810360008301526140bc81613ddd565b9050919050565b600060208201905081810360008301526140dc81613e23565b9050919050565b600060208201905081810360008301526140fc81613e46565b9050919050565b6000602082019050818103600083015261411c81613e69565b9050919050565b6000602082019050818103600083015261413c81613e8c565b9050919050565b60006020820190506141586000830184613eaf565b92915050565b60006020820190506141736000830184613ebe565b92915050565b6000614183614194565b905061418f828261447a565b919050565b6000604051905090565b600067ffffffffffffffff8211156141b9576141b8614605565b5b6141c282614652565b9050602081019050919050565b600067ffffffffffffffff8211156141ea576141e9614605565b5b6141f382614652565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061426e826143ec565b9150614279836143ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142ae576142ad614549565b5b828201905092915050565b60006142c4826143ec565b91506142cf836143ec565b9250826142df576142de614578565b5b828204905092915050565b60006142f5826143ec565b9150614300836143ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561433957614338614549565b5b828202905092915050565b600061434f826143ec565b915061435a836143ec565b92508282101561436d5761436c614549565b5b828203905092915050565b6000614383826143cc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b83811015614433578082015181840152602081019050614418565b83811115614442576000848401525b50505050565b6000600282049050600182168061446057607f821691505b60208210811415614474576144736145a7565b5b50919050565b61448382614652565b810181811067ffffffffffffffff821117156144a2576144a1614605565b5b80604052505050565b60006144b6826143ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144e9576144e8614549565b5b600182019050919050565b60006144ff82614506565b9050919050565b600061451182614663565b9050919050565b6000614523826143ec565b915061452e836143ec565b92508261453e5761453d614578565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4e4654206973206e6f7420617661696c61626c6520666f72206d696e74000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61486281614378565b811461486d57600080fd5b50565b6148798161438a565b811461488457600080fd5b50565b61489081614396565b811461489b57600080fd5b50565b6148a7816143a0565b81146148b257600080fd5b50565b6148be816143ec565b81146148c957600080fd5b50565b6148d5816143f6565b81146148e057600080fd5b5056fea26469706673582212207886687583ee336a8f287b9cc940731e007da25be8847374d4d2f0405c10407e64736f6c63430008070033697066733a2f2f516d566e6b4e50446a536e6f5a39397a6a536f6f7173514e336379553352356d64505635576b67564453456746372f

Deployed Bytecode

0x6080604052600436106102675760003560e01c80635fd84c2811610144578063a945bf80116100b6578063d5abeb011161007a578063d5abeb01146108b5578063d8d988da146108e0578063e985e9c514610909578063f2fde38b14610946578063f9da32241461096f578063fc1a1c361461099857610267565b8063a945bf80146107d2578063b88d4fde146107fd578063bd32fb6614610826578063bedb86fb1461084f578063c87b56dd1461087857610267565b806374d9e7ac1161010857806374d9e7ac146106d45780637ec4a659146106ff5780638da5cb5b1461072857806395d89b4114610753578063a22cb4651461077e578063a45ba8e7146107a757610267565b80635fd84c28146105ef5780636352211e146106185780636bb7b1d91461065557806370a0823114610680578063715018a6146106bd57610267565b806323b872dd116101dd5780633f5e4741116101a15780633f5e47411461050557806342842e0e146105305780634fdd43cb1461055957806351830227146105825780635b8ad429146105ad5780635c975abb146105c457610267565b806323b872dd1461046457806326a326271461048d5780632db11544146104b6578063375a069a146104d25780633ccfd60b146104fb57610267565b80631338a83f1161022f5780631338a83f1461036357806316ba10e01461037f57806317c862a2146103a857806317f7bece146103d157806318160ddd146103fc5780631e16ffba1461042757610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630c888ffd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613ada565b6109c3565b6040516102a09190613fc6565b60405180910390f35b3480156102b557600080fd5b506102be610aa5565b6040516102cb9190613fe1565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613b7d565b610b37565b6040516103089190613f5f565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906139e0565b610bb3565b005b34801561034657600080fd5b50610361600480360381019061035c9190613baa565b610cbe565b005b61037d60048036038101906103789190613a20565b610d4a565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613b34565b610fdb565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613baa565b611071565b005b3480156103dd57600080fd5b506103e66110fd565b6040516103f39190614143565b60405180910390f35b34801561040857600080fd5b50610411611103565b60405161041e9190614143565b60405180910390f35b34801561043357600080fd5b5061044e6004803603810190610449919061385d565b61111a565b60405161045b9190614143565b60405180910390f35b34801561047057600080fd5b5061048b600480360381019061048691906138ca565b611132565b005b34801561049957600080fd5b506104b460048036038101906104af9190613baa565b611142565b005b6104d060048036038101906104cb9190613b7d565b6111ce565b005b3480156104de57600080fd5b506104f960048036038101906104f49190613b7d565b6113e6565b005b6105036114c6565b005b34801561051157600080fd5b5061051a6115c2565b6040516105279190613fc6565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906138ca565b6115e5565b005b34801561056557600080fd5b50610580600480360381019061057b9190613b34565b611605565b005b34801561058e57600080fd5b5061059761169b565b6040516105a49190613fc6565b60405180910390f35b3480156105b957600080fd5b506105c26116ae565b005b3480156105d057600080fd5b506105d9611756565b6040516105e69190613fc6565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613baa565b611769565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613b7d565b611809565b60405161064c9190613f5f565b60405180910390f35b34801561066157600080fd5b5061066a61181f565b604051610677919061415e565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a2919061385d565b611835565b6040516106b49190614143565b60405180910390f35b3480156106c957600080fd5b506106d2611905565b005b3480156106e057600080fd5b506106e961198d565b6040516106f69190614143565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190613b34565b611993565b005b34801561073457600080fd5b5061073d611a29565b60405161074a9190613f5f565b60405180910390f35b34801561075f57600080fd5b50610768611a53565b6040516107759190613fe1565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a091906139a0565b611ae5565b005b3480156107b357600080fd5b506107bc611c5d565b6040516107c99190613fe1565b60405180910390f35b3480156107de57600080fd5b506107e7611ceb565b6040516107f49190614143565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061391d565b611cf1565b005b34801561083257600080fd5b5061084d60048036038101906108489190613aad565b611d6d565b005b34801561085b57600080fd5b5061087660048036038101906108719190613a80565b611df3565b005b34801561088457600080fd5b5061089f600480360381019061089a9190613b7d565b611e8c565b6040516108ac9190613fe1565b60405180910390f35b3480156108c157600080fd5b506108ca611fad565b6040516108d79190614143565b60405180910390f35b3480156108ec57600080fd5b5061090760048036038101906109029190613baa565b611fb3565b005b34801561091557600080fd5b50610930600480360381019061092b919061388a565b61203f565b60405161093d9190613fc6565b60405180910390f35b34801561095257600080fd5b5061096d6004803603810190610968919061385d565b6120d3565b005b34801561097b57600080fd5b5061099660048036038101906109919190613baa565b6121cb565b005b3480156109a457600080fd5b506109ad612257565b6040516109ba9190614143565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a9e5750610a9d82612280565b5b9050919050565b606060028054610ab490614448565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090614448565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b42826122ea565b610b78576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbe82611809565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c26576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c45612338565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c775750610c7581610c70612338565b61203f565b155b15610cae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb9838383612340565b505050565b610cc6612338565b73ffffffffffffffffffffffffffffffffffffffff16610ce4611a29565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3190614083565b60405180910390fd5b8063ffffffff16600f8190555050565b80600e5481610d57611103565b610d619190614263565b1115610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d99906140c3565b60405180910390fd5b601260009054906101000a900460ff1615610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906140e3565b60405180910390fd5b8383601354610e69838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e4e9190613ecd565b604051602081830303815290604052805190602001206123f2565b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90614063565b60405180910390fd5b600085118015610ecd5750600f5485610ec033612409565b610eca9190614263565b11155b610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390614043565b60405180910390fd5b84600c54610f1a91906142ea565b341015610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390614123565b60405180910390fd5b84601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fab9190614263565b92505081905550610fbc33866124d9565b610fd285600c54610fcd91906142ea565b6124f7565b50505050505050565b610fe3612338565b73ffffffffffffffffffffffffffffffffffffffff16611001611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614083565b60405180910390fd5b80600a908051906020019061106d9291906135ae565b5050565b611079612338565b73ffffffffffffffffffffffffffffffffffffffff16611097611a29565b73ffffffffffffffffffffffffffffffffffffffff16146110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e490614083565b60405180910390fd5b8063ffffffff1660108190555050565b60105481565b600061110d612598565b6001546000540303905090565b60116020528060005260406000206000915090505481565b61113d83838361259d565b505050565b61114a612338565b73ffffffffffffffffffffffffffffffffffffffff16611168611a29565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590614083565b60405180910390fd5b8063ffffffff16600c8190555050565b80600e54816111db611103565b6111e59190614263565b1115611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906140c3565b60405180910390fd5b601260009054906101000a900460ff1615611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906140e3565b60405180910390fd5b600115156112826115c2565b1515146112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90614003565b60405180910390fd5b6000821180156113335750601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361131c33612409565b6113269190614263565b6113309190614344565b11155b611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990614043565b60405180910390fd5b81600d5461138091906142ea565b3410156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614123565b60405180910390fd5b6113cc33836124d9565b6113e282600d546113dd91906142ea565b6124f7565b5050565b6113ee612338565b73ffffffffffffffffffffffffffffffffffffffff1661140c611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990614083565b60405180910390fd5b600e548161146e611103565b6114789190614263565b11156114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906140a3565b60405180910390fd5b6114c333826124d9565b50565b6114ce612338565b73ffffffffffffffffffffffffffffffffffffffff166114ec611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990614083565b60405180910390fd5b600061154c611a29565b73ffffffffffffffffffffffffffffffffffffffff164760405161156f90613f4a565b60006040518083038185875af1925050503d80600081146115ac576040519150601f19603f3d011682016040523d82523d6000602084013e6115b1565b606091505b50509050806115bf57600080fd5b50565b6000601260029054906101000a900463ffffffff1663ffffffff16421015905090565b61160083838360405180602001604052806000815250611cf1565b505050565b61160d612338565b73ffffffffffffffffffffffffffffffffffffffff1661162b611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614083565b60405180910390fd5b80600b90805190602001906116979291906135ae565b5050565b601260019054906101000a900460ff1681565b6116b6612338565b73ffffffffffffffffffffffffffffffffffffffff166116d4611a29565b73ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614083565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b611771612338565b73ffffffffffffffffffffffffffffffffffffffff1661178f611a29565b73ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614083565b60405180910390fd5b80601260026101000a81548163ffffffff021916908363ffffffff16021790555050565b600061181482612a8e565b600001519050919050565b601260029054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61190d612338565b73ffffffffffffffffffffffffffffffffffffffff1661192b611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614083565b60405180910390fd5b61198b6000612d1d565b565b600f5481565b61199b612338565b73ffffffffffffffffffffffffffffffffffffffff166119b9611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690614083565b60405180910390fd5b8060099080519060200190611a259291906135ae565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611a6290614448565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8e90614448565b8015611adb5780601f10611ab057610100808354040283529160200191611adb565b820191906000526020600020905b815481529060010190602001808311611abe57829003601f168201915b5050505050905090565b611aed612338565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b5f612338565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0c612338565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c519190613fc6565b60405180910390a35050565b600b8054611c6a90614448565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9690614448565b8015611ce35780601f10611cb857610100808354040283529160200191611ce3565b820191906000526020600020905b815481529060010190602001808311611cc657829003601f168201915b505050505081565b600d5481565b611cfc84848461259d565b611d1b8373ffffffffffffffffffffffffffffffffffffffff1661225d565b8015611d305750611d2e84848484612de3565b155b15611d67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611d75612338565b73ffffffffffffffffffffffffffffffffffffffff16611d93611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090614083565b60405180910390fd5b8060138190555050565b611dfb612338565b73ffffffffffffffffffffffffffffffffffffffff16611e19611a29565b73ffffffffffffffffffffffffffffffffffffffff1614611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6690614083565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6060611e97826122ea565b611ecd576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515601260019054906101000a900460ff1615151415611f4b576000600b8054611ef890614448565b90501415611f155760405180602001604052806000815250611f44565b600b611f2083612f43565b600a604051602001611f3493929190613f19565b6040516020818303038152906040525b9050611fa8565b6000611f556130a4565b9050600081511415611f765760405180602001604052806000815250611fa4565b80611f8084612f43565b600a604051602001611f9493929190613ee8565b6040516020818303038152906040525b9150505b919050565b600e5481565b611fbb612338565b73ffffffffffffffffffffffffffffffffffffffff16611fd9611a29565b73ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614083565b60405180910390fd5b8063ffffffff16600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120db612338565b73ffffffffffffffffffffffffffffffffffffffff166120f9611a29565b73ffffffffffffffffffffffffffffffffffffffff161461214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614083565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b690614023565b60405180910390fd5b6121c881612d1d565b50565b6121d3612338565b73ffffffffffffffffffffffffffffffffffffffff166121f1611a29565b73ffffffffffffffffffffffffffffffffffffffff1614612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90614083565b60405180910390fd5b8063ffffffff16600e8190555050565b600c5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816122f5612598565b11158015612304575060005482105b8015612331575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826123ff8584613136565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612471576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6124f38282604051806020016040528060008152506131ab565b5050565b8034101561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614103565b60405180910390fd5b80341115612595573373ffffffffffffffffffffffffffffffffffffffff166108fc82346125689190614344565b9081150290604051600060405180830381858888f19350505050158015612593573d6000803e3d6000fd5b505b50565b600090565b60006125a882612a8e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166125cf612338565b73ffffffffffffffffffffffffffffffffffffffff161480612602575061260182600001516125fc612338565b61203f565b5b806126475750612610612338565b73ffffffffffffffffffffffffffffffffffffffff1661262f84610b37565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612680576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612750576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61275d85858560016131bd565b61276d6000848460000151612340565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a1e57600054811015612a1d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a8785858560016131c3565b5050505050565b612a96613634565b600082905080612aa4612598565b11158015612ab3575060005481105b15612ce6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612ce457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc8578092505050612d18565b5b600115612ce357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612cde578092505050612d18565b612bc9565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e09612338565b8786866040518563ffffffff1660e01b8152600401612e2b9493929190613f7a565b602060405180830381600087803b158015612e4557600080fd5b505af1925050508015612e7657506040513d601f19601f82011682018060405250810190612e739190613b07565b60015b612ef0573d8060008114612ea6576040519150601f19603f3d011682016040523d82523d6000602084013e612eab565b606091505b50600081511415612ee8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612f8b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061309f565b600082905060005b60008214612fbd578080612fa6906144ab565b915050600a82612fb691906142b9565b9150612f93565b60008167ffffffffffffffff811115612fd957612fd8614605565b5b6040519080825280601f01601f19166020018201604052801561300b5781602001600182028036833780820191505090505b5090505b60008514613098576001826130249190614344565b9150600a856130339190614518565b603061303f9190614263565b60f81b818381518110613055576130546145d6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561309191906142b9565b945061300f565b8093505050505b919050565b6060600980546130b390614448565b80601f01602080910402602001604051908101604052809291908181526020018280546130df90614448565b801561312c5780601f106131015761010080835404028352916020019161312c565b820191906000526020600020905b81548152906001019060200180831161310f57829003601f168201915b5050505050905090565b60008082905060005b84518110156131a057600085828151811061315d5761315c6145d6565b5b6020026020010151905080831161317f5761317883826131c9565b925061318c565b61318981846131c9565b92505b508080613198906144ab565b91505061313f565b508091505092915050565b6131b883838360016131e0565b505050565b50505050565b50505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561324d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613288576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61329560008683876131bd565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561345f575061345e8773ffffffffffffffffffffffffffffffffffffffff1661225d565b5b15613525575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134d46000888480600101955088612de3565b61350a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561346557826000541461352057600080fd5b613591565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613526575b8160008190555050506135a760008683876131c3565b5050505050565b8280546135ba90614448565b90600052602060002090601f0160209004810192826135dc5760008555613623565b82601f106135f557805160ff1916838001178555613623565b82800160010185558215613623579182015b82811115613622578251825591602001919060010190613607565b5b5090506136309190613677565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613690576000816000905550600101613678565b5090565b60006136a76136a28461419e565b614179565b9050828152602081018484840111156136c3576136c2614643565b5b6136ce848285614406565b509392505050565b60006136e96136e4846141cf565b614179565b90508281526020810184848401111561370557613704614643565b5b613710848285614406565b509392505050565b60008135905061372781614859565b92915050565b60008083601f84011261374357613742614639565b5b8235905067ffffffffffffffff8111156137605761375f614634565b5b60208301915083602082028301111561377c5761377b61463e565b5b9250929050565b60008135905061379281614870565b92915050565b6000813590506137a781614887565b92915050565b6000813590506137bc8161489e565b92915050565b6000815190506137d18161489e565b92915050565b600082601f8301126137ec576137eb614639565b5b81356137fc848260208601613694565b91505092915050565b600082601f83011261381a57613819614639565b5b813561382a8482602086016136d6565b91505092915050565b600081359050613842816148b5565b92915050565b600081359050613857816148cc565b92915050565b6000602082840312156138735761387261464d565b5b600061388184828501613718565b91505092915050565b600080604083850312156138a1576138a061464d565b5b60006138af85828601613718565b92505060206138c085828601613718565b9150509250929050565b6000806000606084860312156138e3576138e261464d565b5b60006138f186828701613718565b935050602061390286828701613718565b925050604061391386828701613833565b9150509250925092565b600080600080608085870312156139375761393661464d565b5b600061394587828801613718565b945050602061395687828801613718565b935050604061396787828801613833565b925050606085013567ffffffffffffffff81111561398857613987614648565b5b613994878288016137d7565b91505092959194509250565b600080604083850312156139b7576139b661464d565b5b60006139c585828601613718565b92505060206139d685828601613783565b9150509250929050565b600080604083850312156139f7576139f661464d565b5b6000613a0585828601613718565b9250506020613a1685828601613833565b9150509250929050565b600080600060408486031215613a3957613a3861464d565b5b600084013567ffffffffffffffff811115613a5757613a56614648565b5b613a638682870161372d565b93509350506020613a7686828701613833565b9150509250925092565b600060208284031215613a9657613a9561464d565b5b6000613aa484828501613783565b91505092915050565b600060208284031215613ac357613ac261464d565b5b6000613ad184828501613798565b91505092915050565b600060208284031215613af057613aef61464d565b5b6000613afe848285016137ad565b91505092915050565b600060208284031215613b1d57613b1c61464d565b5b6000613b2b848285016137c2565b91505092915050565b600060208284031215613b4a57613b4961464d565b5b600082013567ffffffffffffffff811115613b6857613b67614648565b5b613b7484828501613805565b91505092915050565b600060208284031215613b9357613b9261464d565b5b6000613ba184828501613833565b91505092915050565b600060208284031215613bc057613bbf61464d565b5b6000613bce84828501613848565b91505092915050565b613be081614378565b82525050565b613bf7613bf282614378565b6144f4565b82525050565b613c068161438a565b82525050565b6000613c1782614215565b613c21818561422b565b9350613c31818560208601614415565b613c3a81614652565b840191505092915050565b6000613c5082614220565b613c5a8185614247565b9350613c6a818560208601614415565b613c7381614652565b840191505092915050565b6000613c8982614220565b613c938185614258565b9350613ca3818560208601614415565b80840191505092915050565b60008154613cbc81614448565b613cc68186614258565b94506001821660008114613ce15760018114613cf257613d25565b60ff19831686528186019350613d25565b613cfb85614200565b60005b83811015613d1d57815481890152600182019150602081019050613cfe565b838801955050505b50505092915050565b6000613d3b601d83614247565b9150613d4682614670565b602082019050919050565b6000613d5e602683614247565b9150613d6982614699565b604082019050919050565b6000613d81601483614247565b9150613d8c826146e8565b602082019050919050565b6000613da4601e83614247565b9150613daf82614711565b602082019050919050565b6000613dc7602083614247565b9150613dd28261473a565b602082019050919050565b6000613dea602783614247565b9150613df582614763565b604082019050919050565b6000613e0d60008361423c565b9150613e18826147b2565b600082019050919050565b6000613e30601483614247565b9150613e3b826147b5565b602082019050919050565b6000613e53601d83614247565b9150613e5e826147de565b602082019050919050565b6000613e76601683614247565b9150613e8182614807565b602082019050919050565b6000613e99601383614247565b9150613ea482614830565b602082019050919050565b613eb8816143ec565b82525050565b613ec7816143f6565b82525050565b6000613ed98284613be6565b60148201915081905092915050565b6000613ef48286613c7e565b9150613f008285613c7e565b9150613f0c8284613caf565b9150819050949350505050565b6000613f258286613caf565b9150613f318285613c7e565b9150613f3d8284613caf565b9150819050949350505050565b6000613f5582613e00565b9150819050919050565b6000602082019050613f746000830184613bd7565b92915050565b6000608082019050613f8f6000830187613bd7565b613f9c6020830186613bd7565b613fa96040830185613eaf565b8181036060830152613fbb8184613c0c565b905095945050505050565b6000602082019050613fdb6000830184613bfd565b92915050565b60006020820190508181036000830152613ffb8184613c45565b905092915050565b6000602082019050818103600083015261401c81613d2e565b9050919050565b6000602082019050818103600083015261403c81613d51565b9050919050565b6000602082019050818103600083015261405c81613d74565b9050919050565b6000602082019050818103600083015261407c81613d97565b9050919050565b6000602082019050818103600083015261409c81613dba565b9050919050565b600060208201905081810360008301526140bc81613ddd565b9050919050565b600060208201905081810360008301526140dc81613e23565b9050919050565b600060208201905081810360008301526140fc81613e46565b9050919050565b6000602082019050818103600083015261411c81613e69565b9050919050565b6000602082019050818103600083015261413c81613e8c565b9050919050565b60006020820190506141586000830184613eaf565b92915050565b60006020820190506141736000830184613ebe565b92915050565b6000614183614194565b905061418f828261447a565b919050565b6000604051905090565b600067ffffffffffffffff8211156141b9576141b8614605565b5b6141c282614652565b9050602081019050919050565b600067ffffffffffffffff8211156141ea576141e9614605565b5b6141f382614652565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061426e826143ec565b9150614279836143ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142ae576142ad614549565b5b828201905092915050565b60006142c4826143ec565b91506142cf836143ec565b9250826142df576142de614578565b5b828204905092915050565b60006142f5826143ec565b9150614300836143ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561433957614338614549565b5b828202905092915050565b600061434f826143ec565b915061435a836143ec565b92508282101561436d5761436c614549565b5b828203905092915050565b6000614383826143cc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b83811015614433578082015181840152602081019050614418565b83811115614442576000848401525b50505050565b6000600282049050600182168061446057607f821691505b60208210811415614474576144736145a7565b5b50919050565b61448382614652565b810181811067ffffffffffffffff821117156144a2576144a1614605565b5b80604052505050565b60006144b6826143ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144e9576144e8614549565b5b600182019050919050565b60006144ff82614506565b9050919050565b600061451182614663565b9050919050565b6000614523826143ec565b915061452e836143ec565b92508261453e5761453d614578565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4e4654206973206e6f7420617661696c61626c6520666f72206d696e74000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61486281614378565b811461486d57600080fd5b50565b6148798161438a565b811461488457600080fd5b50565b61489081614396565b811461489b57600080fd5b50565b6148a7816143a0565b81146148b257600080fd5b50565b6148be816143ec565b81146148c957600080fd5b50565b6148d5816143f6565b81146148e057600080fd5b5056fea26469706673582212207886687583ee336a8f287b9cc940731e007da25be8847374d4d2f0405c10407e64736f6c63430008070033

Deployed Bytecode Sourcemap

48205:6607:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28131:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31516:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33019:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32582:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52668:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50483:539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53486:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52864:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48808:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27380:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48853:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33876:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52338:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49953:499;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51057:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54328:481;;;:::i;:::-;;51603:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34117:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53119:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49009:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53027:80;;;;;;;;;;;;;:::i;:::-;;48977:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52503:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31325:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49044:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28500:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47307:103;;;;;;;;;;;;;:::i;:::-;;48760:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53372:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46656:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31685:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33295:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48502:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48675:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34373:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51757:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53600:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53690:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48722:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52224:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33645:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47565:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53265:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48624:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28131:305;28233:4;28285:25;28270:40;;;:11;:40;;;;:105;;;;28342:33;28327:48;;;:11;:48;;;;28270:105;:158;;;;28392:36;28416:11;28392:23;:36::i;:::-;28270:158;28250:178;;28131:305;;;:::o;31516:100::-;31570:13;31603:5;31596:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31516:100;:::o;33019:204::-;33087:7;33112:16;33120:7;33112;:16::i;:::-;33107:64;;33137:34;;;;;;;;;;;;;;33107:64;33191:15;:24;33207:7;33191:24;;;;;;;;;;;;;;;;;;;;;33184:31;;33019:204;;;:::o;32582:371::-;32655:13;32671:24;32687:7;32671:15;:24::i;:::-;32655:40;;32716:5;32710:11;;:2;:11;;;32706:48;;;32730:24;;;;;;;;;;;;;;32706:48;32787:5;32771:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32797:37;32814:5;32821:12;:10;:12::i;:::-;32797:16;:37::i;:::-;32796:38;32771:63;32767:138;;;32858:35;;;;;;;;;;;;;;32767:138;32917:28;32926:2;32930:7;32939:5;32917:8;:28::i;:::-;32644:309;32582:371;;:::o;52668:150::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52787:23:::1;52762:48;;:22;:48;;;;52668:150:::0;:::o;50483:539::-;50589:11;49809:9;;49794:11;49778:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;49770:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49863:6;;;;;;;;;;;49862:7;49854:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50621:11:::1;;50634:19;;52008:130;52045:11;;52008:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52075:4;52125:10;52108:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52098:39;;;;;;52008:18;:130::i;:::-;52000:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;50687:1:::2;50673:11;:15;:84;;;;;50735:22;;50720:11;50692:25;50706:10;50692:13;:25::i;:::-;:39;;;;:::i;:::-;:65;;50673:84;50665:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50831:11;50814:14;;:28;;;;:::i;:::-;50801:9;:41;;50793:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50905:11;50877:14;:26;50892:10;50877:26;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;50927:34;50937:10;50949:11;50927:9;:34::i;:::-;50972:42;51002:11;50985:14;;:28;;;;:::i;:::-;50972:12;:42::i;:::-;49914:1:::1;;;50483:539:::0;;;;:::o;53486:106::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53574:10:::1;53562:9;:22;;;;;;;;;;;;:::i;:::-;;53486:106:::0;:::o;52864:138::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52974:20:::1;52952:42;;:19;:42;;;;52864:138:::0;:::o;48808:38::-;;;;:::o;27380:303::-;27424:7;27649:15;:13;:15::i;:::-;27634:12;;27618:13;;:28;:46;27611:53;;27380:303;:::o;48853:49::-;;;;;;;;;;;;;;;;;:::o;33876:170::-;34010:28;34020:4;34026:2;34030:7;34010:9;:28::i;:::-;33876:170;;;:::o;52338:118::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52433:15:::1;52416:32;;:14;:32;;;;52338:118:::0;:::o;49953:499::-;50024:11;49809:9;;49794:11;49778:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;49770:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49863:6;;;;;;;;;;;49862:7;49854:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50076:4:::1;50056:24;;:16;:14;:16::i;:::-;:24;;;50048:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50147:1;50133:11;:15;:110;;;;;50224:19;;50194:14;:26;50209:10;50194:26;;;;;;;;;;;;;;;;50180:11;50152:25;50166:10;50152:13;:25::i;:::-;:39;;;;:::i;:::-;:68;;;;:::i;:::-;:91;;50133:110;50125:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;50314:11;50300;;:25;;;;:::i;:::-;50287:9;:38;;50279:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50360:34;50370:10;50382:11;50360:9;:34::i;:::-;50405:39;50432:11;50418;;:25;;;;:::i;:::-;50405:12;:39::i;:::-;49953:499:::0;;:::o;51057:223::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51164:9:::1;;51149:11;51133:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;51125:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;51228:34;51238:10;51250:11;51228:9;:34::i;:::-;51057:223:::0;:::o;54328:481::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54621:7:::1;54642;:5;:7::i;:::-;54634:21;;54663;54634:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54620:69;;;54708:2;54700:11;;;::::0;::::1;;54373:436;54328:481::o:0;51603:117::-;51650:4;51693:19;;;;;;;;;;;51674:38;;:15;:38;;51667:45;;51603:117;:::o;34117:185::-;34255:39;34272:4;34278:2;34282:7;34255:39;;;;;;;;;;;;:16;:39::i;:::-;34117:185;;;:::o;53119:138::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53231:18:::1;53211:17;:38;;;;;;;;;;;;:::i;:::-;;53119:138:::0;:::o;49009:28::-;;;;;;;;;;;;;:::o;53027:80::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53091:8:::1;;;;;;;;;;;53090:9;53079:8;;:20;;;;;;;;;;;;;;;;;;53027:80::o:0;48977:25::-;;;;;;;;;;;;;:::o;52503:116::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52602:9:::1;52580:19;;:31;;;;;;;;;;;;;;;;;;52503:116:::0;:::o;31325:124::-;31389:7;31416:20;31428:7;31416:11;:20::i;:::-;:25;;;31409:32;;31325:124;;;:::o;49044:33::-;;;;;;;;;;;;;:::o;28500:206::-;28564:7;28605:1;28588:19;;:5;:19;;;28584:60;;;28616:28;;;;;;;;;;;;;;28584:60;28670:12;:19;28683:5;28670:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28662:36;;28655:43;;28500:206;;;:::o;47307:103::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47372:30:::1;47399:1;47372:18;:30::i;:::-;47307:103::o:0;48760:41::-;;;;:::o;53372:106::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53460:10:::1;53448:9;:22;;;;;;;;;;;;:::i;:::-;;53372:106:::0;:::o;46656:87::-;46702:7;46729:6;;;;;;;;;;;46722:13;;46656:87;:::o;31685:104::-;31741:13;31774:7;31767:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31685:104;:::o;33295:279::-;33398:12;:10;:12::i;:::-;33386:24;;:8;:24;;;33382:54;;;33419:17;;;;;;;;;;;;;;33382:54;33494:8;33449:18;:32;33468:12;:10;:12::i;:::-;33449:32;;;;;;;;;;;;;;;:42;33482:8;33449:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33547:8;33518:48;;33533:12;:10;:12::i;:::-;33518:48;;;33557:8;33518:48;;;;;;:::i;:::-;;;;;;;;33295:279;;:::o;48502:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48675:39::-;;;;:::o;34373:369::-;34540:28;34550:4;34556:2;34560:7;34540:9;:28::i;:::-;34583:15;:2;:13;;;:15::i;:::-;:76;;;;;34603:56;34634:4;34640:2;34644:7;34653:5;34603:30;:56::i;:::-;34602:57;34583:76;34579:156;;;34683:40;;;;;;;;;;;;;;34579:156;34373:369;;;;:::o;51757:122::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51861:10:::1;51839:19;:32;;;;51757:122:::0;:::o;53600:82::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53668:6:::1;53659;;:15;;;;;;;;;;;;;;;;;;53600:82:::0;:::o;53690:512::-;53763:13;53794:16;53802:7;53794;:16::i;:::-;53789:59;;53819:29;;;;;;;;;;;;;;53789:59;53875:5;53863:17;;:8;;;;;;;;;;;:17;;;53859:175;;;53939:1;53910:17;53904:31;;;;;:::i;:::-;;;:36;;:118;;;;;;;;;;;;;;;;;53967:17;53986:18;:7;:16;:18::i;:::-;54006:9;53950:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53904:118;53897:125;;;;53859:175;54044:21;54068:10;:8;:10::i;:::-;54044:34;;54121:1;54102:7;54096:21;:26;;:98;;;;;;;;;;;;;;;;;54149:7;54158:18;:7;:16;:18::i;:::-;54178:9;54132:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54096:98;54089:105;;;53690:512;;;;:::o;48722:31::-;;;;:::o;52224:106::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52310:12:::1;52296:26;;:11;:26;;;;52224:106:::0;:::o;33645:164::-;33742:4;33766:18;:25;33785:5;33766:25;;;;;;;;;;;;;;;:35;33792:8;33766:35;;;;;;;;;;;;;;;;;;;;;;;;;33759:42;;33645:164;;;;:::o;47565:201::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47674:1:::1;47654:22;;:8;:22;;;;47646:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47730:28;47749:8;47730:18;:28::i;:::-;47565:201:::0;:::o;53265:99::-;46887:12;:10;:12::i;:::-;46876:23;;:7;:5;:7::i;:::-;:23;;;46868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53346:10:::1;53334:22;;:9;:22;;;;53265:99:::0;:::o;48624:43::-;;;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;34997:187::-;35054:4;35097:7;35078:15;:13;:15::i;:::-;:26;;:53;;;;;35118:13;;35108:7;:23;35078:53;:98;;;;;35149:11;:20;35161:7;35149:20;;;;;;;;;;;:27;;;;;;;;;;;;35148:28;35078:98;35071:105;;34997:187;;;:::o;23427:98::-;23480:7;23507:10;23500:17;;23427:98;:::o;42608:196::-;42750:2;42723:15;:24;42739:7;42723:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42788:7;42784:2;42768:28;;42777:5;42768:28;;;;;;;;;;;;42608:196;;;:::o;21282:190::-;21407:4;21460;21431:25;21444:5;21451:4;21431:12;:25::i;:::-;:33;21424:40;;21282:190;;;;;:::o;28788:207::-;28849:7;28890:1;28873:19;;:5;:19;;;28869:59;;;28901:27;;;;;;;;;;;;;;28869:59;28954:12;:19;28967:5;28954:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28946:41;;28939:48;;28788:207;;;:::o;35192:104::-;35261:27;35271:2;35275:8;35261:27;;;;;;;;;;;;:9;:27::i;:::-;35192:104;;:::o;51337:220::-;51414:5;51401:9;:18;;51393:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51473:5;51461:9;:17;51457:93;;;51499:10;51491:28;;:47;51532:5;51520:9;:17;;;;:::i;:::-;51491:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51457:93;51337:220;:::o;27104:92::-;27160:7;27104:92;:::o;38110:2112::-;38225:35;38263:20;38275:7;38263:11;:20::i;:::-;38225:58;;38296:22;38338:13;:18;;;38322:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;38373:50;38390:13;:18;;;38410:12;:10;:12::i;:::-;38373:16;:50::i;:::-;38322:101;:154;;;;38464:12;:10;:12::i;:::-;38440:36;;:20;38452:7;38440:11;:20::i;:::-;:36;;;38322:154;38296:181;;38495:17;38490:66;;38521:35;;;;;;;;;;;;;;38490:66;38593:4;38571:26;;:13;:18;;;:26;;;38567:67;;38606:28;;;;;;;;;;;;;;38567:67;38663:1;38649:16;;:2;:16;;;38645:52;;;38674:23;;;;;;;;;;;;;;38645:52;38710:43;38732:4;38738:2;38742:7;38751:1;38710:21;:43::i;:::-;38818:49;38835:1;38839:7;38848:13;:18;;;38818:8;:49::i;:::-;39193:1;39163:12;:18;39176:4;39163:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39237:1;39209:12;:16;39222:2;39209:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39283:2;39255:11;:20;39267:7;39255:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39345:15;39300:11;:20;39312:7;39300:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;39613:19;39645:1;39635:7;:11;39613:33;;39706:1;39665:43;;:11;:24;39677:11;39665:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;39661:445;;;39890:13;;39876:11;:27;39872:219;;;39960:13;:18;;;39928:11;:24;39940:11;39928:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40043:13;:28;;;40001:11;:24;40013:11;40001:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;39872:219;39661:445;39138:979;40153:7;40149:2;40134:27;;40143:4;40134:27;;;;;;;;;;;;40172:42;40193:4;40199:2;40203:7;40212:1;40172:20;:42::i;:::-;38214:2008;;38110:2112;;;:::o;30155:1108::-;30216:21;;:::i;:::-;30250:12;30265:7;30250:22;;30333:4;30314:15;:13;:15::i;:::-;:23;;:47;;;;;30348:13;;30341:4;:20;30314:47;30310:886;;;30382:31;30416:11;:17;30428:4;30416:17;;;;;;;;;;;30382:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30457:9;:16;;;30452:729;;30528:1;30502:28;;:9;:14;;;:28;;;30498:101;;30566:9;30559:16;;;;;;30498:101;30901:261;30908:4;30901:261;;;30941:6;;;;;;;;30986:11;:17;30998:4;30986:17;;;;;;;;;;;30974:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31060:1;31034:28;;:9;:14;;;:28;;;31030:109;;31102:9;31095:16;;;;;;31030:109;30901:261;;;30452:729;30363:833;30310:886;31224:31;;;;;;;;;;;;;;30155:1108;;;;:::o;47926:191::-;48000:16;48019:6;;;;;;;;;;;48000:25;;48045:8;48036:6;;:17;;;;;;;;;;;;;;;;;;48100:8;48069:40;;48090:8;48069:40;;;;;;;;;;;;47989:128;47926:191;:::o;43296:667::-;43459:4;43496:2;43480:36;;;43517:12;:10;:12::i;:::-;43531:4;43537:7;43546:5;43480:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43476:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43731:1;43714:6;:13;:18;43710:235;;;43760:40;;;;;;;;;;;;;;43710:235;43903:6;43897:13;43888:6;43884:2;43880:15;43873:38;43476:480;43609:45;;;43599:55;;;:6;:55;;;;43592:62;;;43296:667;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;54210:110::-;54270:13;54303:9;54296:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54210:110;:::o;21834:675::-;21917:7;21937:20;21960:4;21937:27;;21980:9;21975:497;21999:5;:12;21995:1;:16;21975:497;;;22033:20;22056:5;22062:1;22056:8;;;;;;;;:::i;:::-;;;;;;;;22033:31;;22099:12;22083;:28;22079:382;;22226:42;22241:12;22255;22226:14;:42::i;:::-;22211:57;;22079:382;;;22403:42;22418:12;22432;22403:14;:42::i;:::-;22388:57;;22079:382;22018:454;22013:3;;;;;:::i;:::-;;;;21975:497;;;;22489:12;22482:19;;;21834:675;;;;:::o;35659:163::-;35782:32;35788:2;35792:8;35802:5;35809:4;35782:5;:32::i;:::-;35659:163;;;:::o;44611:159::-;;;;;:::o;45429:158::-;;;;;:::o;22517:224::-;22585:13;22648:1;22642:4;22635:15;22677:1;22671:4;22664:15;22718:4;22712;22702:21;22693:30;;22517:224;;;;:::o;36081:1775::-;36220:20;36243:13;;36220:36;;36285:1;36271:16;;:2;:16;;;36267:48;;;36296:19;;;;;;;;;;;;;;36267:48;36342:1;36330:8;:13;36326:44;;;36352:18;;;;;;;;;;;;;;36326:44;36383:61;36413:1;36417:2;36421:12;36435:8;36383:21;:61::i;:::-;36756:8;36721:12;:16;36734:2;36721:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36820:8;36780:12;:16;36793:2;36780:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36879:2;36846:11;:25;36858:12;36846:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36946:15;36896:11;:25;36908:12;36896:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36979:20;37002:12;36979:35;;37029:11;37058:8;37043:12;:23;37029:37;;37087:4;:23;;;;;37095:15;:2;:13;;;:15::i;:::-;37087:23;37083:641;;;37131:314;37187:12;37183:2;37162:38;;37179:1;37162:38;;;;;;;;;;;;37228:69;37267:1;37271:2;37275:14;;;;;;37291:5;37228:30;:69::i;:::-;37223:174;;37333:40;;;;;;;;;;;;;;37223:174;37440:3;37424:12;:19;;37131:314;;37526:12;37509:13;;:29;37505:43;;37540:8;;;37505:43;37083:641;;;37589:120;37645:14;;;;;;37641:2;37620:40;;37637:1;37620:40;;;;;;;;;;;;37704:3;37688:12;:19;;37589:120;;37083:641;37754:12;37738:13;:28;;;;36696:1082;;37788:60;37817:1;37821:2;37825:12;37839:8;37788:20;:60::i;:::-;36209:1647;36081:1775;;;;:::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:137::-;3058:5;3096:6;3083:20;3074:29;;3112:32;3138:5;3112:32;:::i;:::-;3013:137;;;;:::o;3156:329::-;3215:6;3264:2;3252:9;3243:7;3239:23;3235:32;3232:119;;;3270:79;;:::i;:::-;3232:119;3390:1;3415:53;3460:7;3451:6;3440:9;3436:22;3415:53;:::i;:::-;3405:63;;3361:117;3156:329;;;;:::o;3491:474::-;3559:6;3567;3616:2;3604:9;3595:7;3591:23;3587:32;3584:119;;;3622:79;;:::i;:::-;3584:119;3742:1;3767:53;3812:7;3803:6;3792:9;3788:22;3767:53;:::i;:::-;3757:63;;3713:117;3869:2;3895:53;3940:7;3931:6;3920:9;3916:22;3895:53;:::i;:::-;3885:63;;3840:118;3491:474;;;;;:::o;3971:619::-;4048:6;4056;4064;4113:2;4101:9;4092:7;4088:23;4084:32;4081:119;;;4119:79;;:::i;:::-;4081:119;4239:1;4264:53;4309:7;4300:6;4289:9;4285:22;4264:53;:::i;:::-;4254:63;;4210:117;4366:2;4392:53;4437:7;4428:6;4417:9;4413:22;4392:53;:::i;:::-;4382:63;;4337:118;4494:2;4520:53;4565:7;4556:6;4545:9;4541:22;4520:53;:::i;:::-;4510:63;;4465:118;3971:619;;;;;:::o;4596:943::-;4691:6;4699;4707;4715;4764:3;4752:9;4743:7;4739:23;4735:33;4732:120;;;4771:79;;:::i;:::-;4732:120;4891:1;4916:53;4961:7;4952:6;4941:9;4937:22;4916:53;:::i;:::-;4906:63;;4862:117;5018:2;5044:53;5089:7;5080:6;5069:9;5065:22;5044:53;:::i;:::-;5034:63;;4989:118;5146:2;5172:53;5217:7;5208:6;5197:9;5193:22;5172:53;:::i;:::-;5162:63;;5117:118;5302:2;5291:9;5287:18;5274:32;5333:18;5325:6;5322:30;5319:117;;;5355:79;;:::i;:::-;5319:117;5460:62;5514:7;5505:6;5494:9;5490:22;5460:62;:::i;:::-;5450:72;;5245:287;4596:943;;;;;;;:::o;5545:468::-;5610:6;5618;5667:2;5655:9;5646:7;5642:23;5638:32;5635:119;;;5673:79;;:::i;:::-;5635:119;5793:1;5818:53;5863:7;5854:6;5843:9;5839:22;5818:53;:::i;:::-;5808:63;;5764:117;5920:2;5946:50;5988:7;5979:6;5968:9;5964:22;5946:50;:::i;:::-;5936:60;;5891:115;5545:468;;;;;:::o;6019:474::-;6087:6;6095;6144:2;6132:9;6123:7;6119:23;6115:32;6112:119;;;6150:79;;:::i;:::-;6112:119;6270:1;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6241:117;6397:2;6423:53;6468:7;6459:6;6448:9;6444:22;6423:53;:::i;:::-;6413:63;;6368:118;6019:474;;;;;:::o;6499:704::-;6594:6;6602;6610;6659:2;6647:9;6638:7;6634:23;6630:32;6627:119;;;6665:79;;:::i;:::-;6627:119;6813:1;6802:9;6798:17;6785:31;6843:18;6835:6;6832:30;6829:117;;;6865:79;;:::i;:::-;6829:117;6978:80;7050:7;7041:6;7030:9;7026:22;6978:80;:::i;:::-;6960:98;;;;6756:312;7107:2;7133:53;7178:7;7169:6;7158:9;7154:22;7133:53;:::i;:::-;7123:63;;7078:118;6499:704;;;;;:::o;7209:323::-;7265:6;7314:2;7302:9;7293:7;7289:23;7285:32;7282:119;;;7320:79;;:::i;:::-;7282:119;7440:1;7465:50;7507:7;7498:6;7487:9;7483:22;7465:50;:::i;:::-;7455:60;;7411:114;7209:323;;;;:::o;7538:329::-;7597:6;7646:2;7634:9;7625:7;7621:23;7617:32;7614:119;;;7652:79;;:::i;:::-;7614:119;7772:1;7797:53;7842:7;7833:6;7822:9;7818:22;7797:53;:::i;:::-;7787:63;;7743:117;7538:329;;;;:::o;7873:327::-;7931:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8106:1;8131:52;8175:7;8166:6;8155:9;8151:22;8131:52;:::i;:::-;8121:62;;8077:116;7873:327;;;;:::o;8206:349::-;8275:6;8324:2;8312:9;8303:7;8299:23;8295:32;8292:119;;;8330:79;;:::i;:::-;8292:119;8450:1;8475:63;8530:7;8521:6;8510:9;8506:22;8475:63;:::i;:::-;8465:73;;8421:127;8206:349;;;;:::o;8561:509::-;8630:6;8679:2;8667:9;8658:7;8654:23;8650:32;8647:119;;;8685:79;;:::i;:::-;8647:119;8833:1;8822:9;8818:17;8805:31;8863:18;8855:6;8852:30;8849:117;;;8885:79;;:::i;:::-;8849:117;8990:63;9045:7;9036:6;9025:9;9021:22;8990:63;:::i;:::-;8980:73;;8776:287;8561:509;;;;:::o;9076:329::-;9135:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:119;;;9190:79;;:::i;:::-;9152:119;9310:1;9335:53;9380:7;9371:6;9360:9;9356:22;9335:53;:::i;:::-;9325:63;;9281:117;9076:329;;;;:::o;9411:327::-;9469:6;9518:2;9506:9;9497:7;9493:23;9489:32;9486:119;;;9524:79;;:::i;:::-;9486:119;9644:1;9669:52;9713:7;9704:6;9693:9;9689:22;9669:52;:::i;:::-;9659:62;;9615:116;9411:327;;;;:::o;9744:118::-;9831:24;9849:5;9831:24;:::i;:::-;9826:3;9819:37;9744:118;;:::o;9868:157::-;9973:45;9993:24;10011:5;9993:24;:::i;:::-;9973:45;:::i;:::-;9968:3;9961:58;9868:157;;:::o;10031:109::-;10112:21;10127:5;10112:21;:::i;:::-;10107:3;10100:34;10031:109;;:::o;10146:360::-;10232:3;10260:38;10292:5;10260:38;:::i;:::-;10314:70;10377:6;10372:3;10314:70;:::i;:::-;10307:77;;10393:52;10438:6;10433:3;10426:4;10419:5;10415:16;10393:52;:::i;:::-;10470:29;10492:6;10470:29;:::i;:::-;10465:3;10461:39;10454:46;;10236:270;10146:360;;;;:::o;10512:364::-;10600:3;10628:39;10661:5;10628:39;:::i;:::-;10683:71;10747:6;10742:3;10683:71;:::i;:::-;10676:78;;10763:52;10808:6;10803:3;10796:4;10789:5;10785:16;10763:52;:::i;:::-;10840:29;10862:6;10840:29;:::i;:::-;10835:3;10831:39;10824:46;;10604:272;10512:364;;;;:::o;10882:377::-;10988:3;11016:39;11049:5;11016:39;:::i;:::-;11071:89;11153:6;11148:3;11071:89;:::i;:::-;11064:96;;11169:52;11214:6;11209:3;11202:4;11195:5;11191:16;11169:52;:::i;:::-;11246:6;11241:3;11237:16;11230:23;;10992:267;10882:377;;;;:::o;11289:845::-;11392:3;11429:5;11423:12;11458:36;11484:9;11458:36;:::i;:::-;11510:89;11592:6;11587:3;11510:89;:::i;:::-;11503:96;;11630:1;11619:9;11615:17;11646:1;11641:137;;;;11792:1;11787:341;;;;11608:520;;11641:137;11725:4;11721:9;11710;11706:25;11701:3;11694:38;11761:6;11756:3;11752:16;11745:23;;11641:137;;11787:341;11854:38;11886:5;11854:38;:::i;:::-;11914:1;11928:154;11942:6;11939:1;11936:13;11928:154;;;12016:7;12010:14;12006:1;12001:3;11997:11;11990:35;12066:1;12057:7;12053:15;12042:26;;11964:4;11961:1;11957:12;11952:17;;11928:154;;;12111:6;12106:3;12102:16;12095:23;;11794:334;;11608:520;;11396:738;;11289:845;;;;:::o;12140:366::-;12282:3;12303:67;12367:2;12362:3;12303:67;:::i;:::-;12296:74;;12379:93;12468:3;12379:93;:::i;:::-;12497:2;12492:3;12488:12;12481:19;;12140:366;;;:::o;12512:::-;12654:3;12675:67;12739:2;12734:3;12675:67;:::i;:::-;12668:74;;12751:93;12840:3;12751:93;:::i;:::-;12869:2;12864:3;12860:12;12853:19;;12512:366;;;:::o;12884:::-;13026:3;13047:67;13111:2;13106:3;13047:67;:::i;:::-;13040:74;;13123:93;13212:3;13123:93;:::i;:::-;13241:2;13236:3;13232:12;13225:19;;12884:366;;;:::o;13256:::-;13398:3;13419:67;13483:2;13478:3;13419:67;:::i;:::-;13412:74;;13495:93;13584:3;13495:93;:::i;:::-;13613:2;13608:3;13604:12;13597:19;;13256:366;;;:::o;13628:::-;13770:3;13791:67;13855:2;13850:3;13791:67;:::i;:::-;13784:74;;13867:93;13956:3;13867:93;:::i;:::-;13985:2;13980:3;13976:12;13969:19;;13628:366;;;:::o;14000:::-;14142:3;14163:67;14227:2;14222:3;14163:67;:::i;:::-;14156:74;;14239:93;14328:3;14239:93;:::i;:::-;14357:2;14352:3;14348:12;14341:19;;14000:366;;;:::o;14372:398::-;14531:3;14552:83;14633:1;14628:3;14552:83;:::i;:::-;14545:90;;14644:93;14733:3;14644:93;:::i;:::-;14762:1;14757:3;14753:11;14746:18;;14372:398;;;:::o;14776:366::-;14918:3;14939:67;15003:2;14998:3;14939:67;:::i;:::-;14932:74;;15015:93;15104:3;15015:93;:::i;:::-;15133:2;15128:3;15124:12;15117:19;;14776:366;;;:::o;15148:::-;15290:3;15311:67;15375:2;15370:3;15311:67;:::i;:::-;15304:74;;15387:93;15476:3;15387:93;:::i;:::-;15505:2;15500:3;15496:12;15489:19;;15148:366;;;:::o;15520:::-;15662:3;15683:67;15747:2;15742:3;15683:67;:::i;:::-;15676:74;;15759:93;15848:3;15759:93;:::i;:::-;15877:2;15872:3;15868:12;15861:19;;15520:366;;;:::o;15892:::-;16034:3;16055:67;16119:2;16114:3;16055:67;:::i;:::-;16048:74;;16131:93;16220:3;16131:93;:::i;:::-;16249:2;16244:3;16240:12;16233:19;;15892:366;;;:::o;16264:118::-;16351:24;16369:5;16351:24;:::i;:::-;16346:3;16339:37;16264:118;;:::o;16388:115::-;16473:23;16490:5;16473:23;:::i;:::-;16468:3;16461:36;16388:115;;:::o;16509:256::-;16621:3;16636:75;16707:3;16698:6;16636:75;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16756:3;16749:10;;16509:256;;;;:::o;16771:589::-;16996:3;17018:95;17109:3;17100:6;17018:95;:::i;:::-;17011:102;;17130:95;17221:3;17212:6;17130:95;:::i;:::-;17123:102;;17242:92;17330:3;17321:6;17242:92;:::i;:::-;17235:99;;17351:3;17344:10;;16771:589;;;;;;:::o;17366:583::-;17588:3;17610:92;17698:3;17689:6;17610:92;:::i;:::-;17603:99;;17719:95;17810:3;17801:6;17719:95;:::i;:::-;17712:102;;17831:92;17919:3;17910:6;17831:92;:::i;:::-;17824:99;;17940:3;17933:10;;17366:583;;;;;;:::o;17955:379::-;18139:3;18161:147;18304:3;18161:147;:::i;:::-;18154:154;;18325:3;18318:10;;17955:379;;;:::o;18340:222::-;18433:4;18471:2;18460:9;18456:18;18448:26;;18484:71;18552:1;18541:9;18537:17;18528:6;18484:71;:::i;:::-;18340:222;;;;:::o;18568:640::-;18763:4;18801:3;18790:9;18786:19;18778:27;;18815:71;18883:1;18872:9;18868:17;18859:6;18815:71;:::i;:::-;18896:72;18964:2;18953:9;18949:18;18940:6;18896:72;:::i;:::-;18978;19046:2;19035:9;19031:18;19022:6;18978:72;:::i;:::-;19097:9;19091:4;19087:20;19082:2;19071:9;19067:18;19060:48;19125:76;19196:4;19187:6;19125:76;:::i;:::-;19117:84;;18568:640;;;;;;;:::o;19214:210::-;19301:4;19339:2;19328:9;19324:18;19316:26;;19352:65;19414:1;19403:9;19399:17;19390:6;19352:65;:::i;:::-;19214:210;;;;:::o;19430:313::-;19543:4;19581:2;19570:9;19566:18;19558:26;;19630:9;19624:4;19620:20;19616:1;19605:9;19601:17;19594:47;19658:78;19731:4;19722:6;19658:78;:::i;:::-;19650:86;;19430:313;;;;:::o;19749:419::-;19915:4;19953:2;19942:9;19938:18;19930:26;;20002:9;19996:4;19992:20;19988:1;19977:9;19973:17;19966:47;20030:131;20156:4;20030:131;:::i;:::-;20022:139;;19749:419;;;:::o;20174:::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20427:9;20421:4;20417:20;20413:1;20402:9;20398:17;20391:47;20455:131;20581:4;20455:131;:::i;:::-;20447:139;;20174:419;;;:::o;20599:::-;20765:4;20803:2;20792:9;20788:18;20780:26;;20852:9;20846:4;20842:20;20838:1;20827:9;20823:17;20816:47;20880:131;21006:4;20880:131;:::i;:::-;20872:139;;20599:419;;;:::o;21024:::-;21190:4;21228:2;21217:9;21213:18;21205:26;;21277:9;21271:4;21267:20;21263:1;21252:9;21248:17;21241:47;21305:131;21431:4;21305:131;:::i;:::-;21297:139;;21024:419;;;:::o;21449:::-;21615:4;21653:2;21642:9;21638:18;21630:26;;21702:9;21696:4;21692:20;21688:1;21677:9;21673:17;21666:47;21730:131;21856:4;21730:131;:::i;:::-;21722:139;;21449:419;;;:::o;21874:::-;22040:4;22078:2;22067:9;22063:18;22055:26;;22127:9;22121:4;22117:20;22113:1;22102:9;22098:17;22091:47;22155:131;22281:4;22155:131;:::i;:::-;22147:139;;21874:419;;;:::o;22299:::-;22465:4;22503:2;22492:9;22488:18;22480:26;;22552:9;22546:4;22542:20;22538:1;22527:9;22523:17;22516:47;22580:131;22706:4;22580:131;:::i;:::-;22572:139;;22299:419;;;:::o;22724:::-;22890:4;22928:2;22917:9;22913:18;22905:26;;22977:9;22971:4;22967:20;22963:1;22952:9;22948:17;22941:47;23005:131;23131:4;23005:131;:::i;:::-;22997:139;;22724:419;;;:::o;23149:::-;23315:4;23353:2;23342:9;23338:18;23330:26;;23402:9;23396:4;23392:20;23388:1;23377:9;23373:17;23366:47;23430:131;23556:4;23430:131;:::i;:::-;23422:139;;23149:419;;;:::o;23574:::-;23740:4;23778:2;23767:9;23763:18;23755:26;;23827:9;23821:4;23817:20;23813:1;23802:9;23798:17;23791:47;23855:131;23981:4;23855:131;:::i;:::-;23847:139;;23574:419;;;:::o;23999:222::-;24092:4;24130:2;24119:9;24115:18;24107:26;;24143:71;24211:1;24200:9;24196:17;24187:6;24143:71;:::i;:::-;23999:222;;;;:::o;24227:218::-;24318:4;24356:2;24345:9;24341:18;24333:26;;24369:69;24435:1;24424:9;24420:17;24411:6;24369:69;:::i;:::-;24227:218;;;;:::o;24451:129::-;24485:6;24512:20;;:::i;:::-;24502:30;;24541:33;24569:4;24561:6;24541:33;:::i;:::-;24451:129;;;:::o;24586:75::-;24619:6;24652:2;24646:9;24636:19;;24586:75;:::o;24667:307::-;24728:4;24818:18;24810:6;24807:30;24804:56;;;24840:18;;:::i;:::-;24804:56;24878:29;24900:6;24878:29;:::i;:::-;24870:37;;24962:4;24956;24952:15;24944:23;;24667:307;;;:::o;24980:308::-;25042:4;25132:18;25124:6;25121:30;25118:56;;;25154:18;;:::i;:::-;25118:56;25192:29;25214:6;25192:29;:::i;:::-;25184:37;;25276:4;25270;25266:15;25258:23;;24980:308;;;:::o;25294:141::-;25343:4;25366:3;25358:11;;25389:3;25386:1;25379:14;25423:4;25420:1;25410:18;25402:26;;25294:141;;;:::o;25441:98::-;25492:6;25526:5;25520:12;25510:22;;25441:98;;;:::o;25545:99::-;25597:6;25631:5;25625:12;25615:22;;25545:99;;;:::o;25650:168::-;25733:11;25767:6;25762:3;25755:19;25807:4;25802:3;25798:14;25783:29;;25650:168;;;;:::o;25824:147::-;25925:11;25962:3;25947:18;;25824:147;;;;:::o;25977:169::-;26061:11;26095:6;26090:3;26083:19;26135:4;26130:3;26126:14;26111:29;;25977:169;;;;:::o;26152:148::-;26254:11;26291:3;26276:18;;26152:148;;;;:::o;26306:305::-;26346:3;26365:20;26383:1;26365:20;:::i;:::-;26360:25;;26399:20;26417:1;26399:20;:::i;:::-;26394:25;;26553:1;26485:66;26481:74;26478:1;26475:81;26472:107;;;26559:18;;:::i;:::-;26472:107;26603:1;26600;26596:9;26589:16;;26306:305;;;;:::o;26617:185::-;26657:1;26674:20;26692:1;26674:20;:::i;:::-;26669:25;;26708:20;26726:1;26708:20;:::i;:::-;26703:25;;26747:1;26737:35;;26752:18;;:::i;:::-;26737:35;26794:1;26791;26787:9;26782:14;;26617:185;;;;:::o;26808:348::-;26848:7;26871:20;26889:1;26871:20;:::i;:::-;26866:25;;26905:20;26923:1;26905:20;:::i;:::-;26900:25;;27093:1;27025:66;27021:74;27018:1;27015:81;27010:1;27003:9;26996:17;26992:105;26989:131;;;27100:18;;:::i;:::-;26989:131;27148:1;27145;27141:9;27130:20;;26808:348;;;;:::o;27162:191::-;27202:4;27222:20;27240:1;27222:20;:::i;:::-;27217:25;;27256:20;27274:1;27256:20;:::i;:::-;27251:25;;27295:1;27292;27289:8;27286:34;;;27300:18;;:::i;:::-;27286:34;27345:1;27342;27338:9;27330:17;;27162:191;;;;:::o;27359:96::-;27396:7;27425:24;27443:5;27425:24;:::i;:::-;27414:35;;27359:96;;;:::o;27461:90::-;27495:7;27538:5;27531:13;27524:21;27513:32;;27461:90;;;:::o;27557:77::-;27594:7;27623:5;27612:16;;27557:77;;;:::o;27640:149::-;27676:7;27716:66;27709:5;27705:78;27694:89;;27640:149;;;:::o;27795:126::-;27832:7;27872:42;27865:5;27861:54;27850:65;;27795:126;;;:::o;27927:77::-;27964:7;27993:5;27982:16;;27927:77;;;:::o;28010:93::-;28046:7;28086:10;28079:5;28075:22;28064:33;;28010:93;;;:::o;28109:154::-;28193:6;28188:3;28183;28170:30;28255:1;28246:6;28241:3;28237:16;28230:27;28109:154;;;:::o;28269:307::-;28337:1;28347:113;28361:6;28358:1;28355:13;28347:113;;;28446:1;28441:3;28437:11;28431:18;28427:1;28422:3;28418:11;28411:39;28383:2;28380:1;28376:10;28371:15;;28347:113;;;28478:6;28475:1;28472:13;28469:101;;;28558:1;28549:6;28544:3;28540:16;28533:27;28469:101;28318:258;28269:307;;;:::o;28582:320::-;28626:6;28663:1;28657:4;28653:12;28643:22;;28710:1;28704:4;28700:12;28731:18;28721:81;;28787:4;28779:6;28775:17;28765:27;;28721:81;28849:2;28841:6;28838:14;28818:18;28815:38;28812:84;;;28868:18;;:::i;:::-;28812:84;28633:269;28582:320;;;:::o;28908:281::-;28991:27;29013:4;28991:27;:::i;:::-;28983:6;28979:40;29121:6;29109:10;29106:22;29085:18;29073:10;29070:34;29067:62;29064:88;;;29132:18;;:::i;:::-;29064:88;29172:10;29168:2;29161:22;28951:238;28908:281;;:::o;29195:233::-;29234:3;29257:24;29275:5;29257:24;:::i;:::-;29248:33;;29303:66;29296:5;29293:77;29290:103;;;29373:18;;:::i;:::-;29290:103;29420:1;29413:5;29409:13;29402:20;;29195:233;;;:::o;29434:100::-;29473:7;29502:26;29522:5;29502:26;:::i;:::-;29491:37;;29434:100;;;:::o;29540:94::-;29579:7;29608:20;29622:5;29608:20;:::i;:::-;29597:31;;29540:94;;;:::o;29640:176::-;29672:1;29689:20;29707:1;29689:20;:::i;:::-;29684:25;;29723:20;29741:1;29723:20;:::i;:::-;29718:25;;29762:1;29752:35;;29767:18;;:::i;:::-;29752:35;29808:1;29805;29801:9;29796:14;;29640:176;;;;:::o;29822:180::-;29870:77;29867:1;29860:88;29967:4;29964:1;29957:15;29991:4;29988:1;29981:15;30008:180;30056:77;30053:1;30046:88;30153:4;30150:1;30143:15;30177:4;30174:1;30167:15;30194:180;30242:77;30239:1;30232:88;30339:4;30336:1;30329:15;30363:4;30360:1;30353:15;30380:180;30428:77;30425:1;30418:88;30525:4;30522:1;30515:15;30549:4;30546:1;30539:15;30566:180;30614:77;30611:1;30604:88;30711:4;30708:1;30701:15;30735:4;30732:1;30725:15;30752:117;30861:1;30858;30851:12;30875:117;30984:1;30981;30974:12;30998:117;31107:1;31104;31097:12;31121:117;31230:1;31227;31220:12;31244:117;31353:1;31350;31343:12;31367:117;31476:1;31473;31466:12;31490:102;31531:6;31582:2;31578:7;31573:2;31566:5;31562:14;31558:28;31548:38;;31490:102;;;:::o;31598:94::-;31631:8;31679:5;31675:2;31671:14;31650:35;;31598:94;;;:::o;31698:179::-;31838:31;31834:1;31826:6;31822:14;31815:55;31698:179;:::o;31883:225::-;32023:34;32019:1;32011:6;32007:14;32000:58;32092:8;32087:2;32079:6;32075:15;32068:33;31883:225;:::o;32114:170::-;32254:22;32250:1;32242:6;32238:14;32231:46;32114:170;:::o;32290:180::-;32430:32;32426:1;32418:6;32414:14;32407:56;32290:180;:::o;32476:182::-;32616:34;32612:1;32604:6;32600:14;32593:58;32476:182;:::o;32664:226::-;32804:34;32800:1;32792:6;32788:14;32781:58;32873:9;32868:2;32860:6;32856:15;32849:34;32664:226;:::o;32896:114::-;;:::o;33016:170::-;33156:22;33152:1;33144:6;33140:14;33133:46;33016:170;:::o;33192:179::-;33332:31;33328:1;33320:6;33316:14;33309:55;33192:179;:::o;33377:172::-;33517:24;33513:1;33505:6;33501:14;33494:48;33377:172;:::o;33555:169::-;33695:21;33691:1;33683:6;33679:14;33672:45;33555:169;:::o;33730:122::-;33803:24;33821:5;33803:24;:::i;:::-;33796:5;33793:35;33783:63;;33842:1;33839;33832:12;33783:63;33730:122;:::o;33858:116::-;33928:21;33943:5;33928:21;:::i;:::-;33921:5;33918:32;33908:60;;33964:1;33961;33954:12;33908:60;33858:116;:::o;33980:122::-;34053:24;34071:5;34053:24;:::i;:::-;34046:5;34043:35;34033:63;;34092:1;34089;34082:12;34033:63;33980:122;:::o;34108:120::-;34180:23;34197:5;34180:23;:::i;:::-;34173:5;34170:34;34160:62;;34218:1;34215;34208:12;34160:62;34108:120;:::o;34234:122::-;34307:24;34325:5;34307:24;:::i;:::-;34300:5;34297:35;34287:63;;34346:1;34343;34336:12;34287:63;34234:122;:::o;34362:120::-;34434:23;34451:5;34434:23;:::i;:::-;34427:5;34424:34;34414:62;;34472:1;34469;34462:12;34414:62;34362:120;:::o

Swarm Source

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