ETH Price: $2,639.06 (-0.29%)

Token

MrVroom (MRVROOM)
 

Overview

Max Total Supply

491 MRVROOM

Holders

138

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 MRVROOM
0x23e2f3c97536363f49a24735f032db65a13d087c
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:
MrVroom

Compiler Version
v0.8.11+commit.d7f03943

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-18
*/

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @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/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/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/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/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 MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
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 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) {
        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) {
        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) {
        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 {
        _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 virtual 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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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: @openzeppelin/contracts/utils/math/SafeMath.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/MrVroom.sol


pragma solidity 0.8.11;








/**
 ___      ___   _______  ___      ___  _______     ______      ______   ___      ___ 
|"  \    /"  | /"      \|"  \    /"  |/"      \   /    " \    /    " \ |"  \    /"  |
 \   \  //   ||:        |\   \  //  /|:        | // ____  \  // ____  \ \   \  //   |
 /\\  \/.    ||_____/   ) \\  \/. ./ |_____/   )/  /    ) :)/  /    ) :)/\\  \/.    |
|: \.        | //      /   \.    //   //      /(: (____/ //(: (____/ //|: \.        |
|.  \    /:  ||:  __   \    \\   /   |:  __   \ \        /  \        / |.  \    /:  |
|___|\__/|___||__|  \___)    \__/    |__|  \___) \"_____/    \"_____/  |___|\__/|___|
 */

contract MrVroom is ERC721A, Ownable, ReentrancyGuard {
    enum SellType {
        SINGLES,
        PACK,
        BOX
    }

    using SafeMath for uint256;
    using Strings for uint256;
    using Counters for Counters.Counter;
    string public tokenBaseURI;
    bool public saleActive = false;
    bool public whitelistActive = false;
    bool public revealed = false;

    Counters.Counter public boxSupply;
    Counters.Counter public packSupply;

    // Total mrVroom Drivers 6,000
    uint256 public publicSupply = 0;
    uint256 public airdropSupply = 0;
    uint256 public constant MAX_PUBLIC_MINT = 5500;
    uint256 public constant AIRDROP_RESERVE = 500;
    uint256 public constant BOX_RESERVE = 10;
    uint256 public constant PACK_RESERVE = 50;
    uint256 public constant PRICE_PER_DRIVER = 0.05 ether;
    uint256 public constant WL_DISCOUNT_FOUR_DRIVERS = 0.18 ether;
    uint256 public constant WL_DISCOUNT_TWENTY_DRIVERS = 0.8 ether;

    string public notRevealedUri;
    bytes32 public MV_WL_MERKLE_ROOT = "";
    bytes32 public MV_AD_MERKLE_ROOT = "";
    string public MV_PROVENANCE = "";
    uint256 public STARTING_INDEX = 0;

    mapping(address => bool) private _claimedAirdrop;

    event Mint(address indexed _receiver, uint256 indexed _tokenId);
    event BoxMint(uint256 indexed _boxesSold);
    event PackMint(uint256 indexed _packsSold);

    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    constructor() 
    ERC721A("MrVroom", "MRVROOM") {
        setNotRevealedURI(
            "https://mrvroom.mypinata.cloud/ipfs/QmRNPcwWaLMEdkqDFWyyjMYFkjM3UbBCzJUhv9q6sBYnfA"
        );
    }

    modifier reserveCompliance(uint256 _numberOfDrivers) {
        require(
            SafeMath.add(publicSupply, _numberOfDrivers) <= MAX_PUBLIC_MINT,
            "Max public supply exceeded!"
        );
        _;
    }

    modifier airdropReserveCompliance(uint256 _numberOfDrivers) {
        require(
            SafeMath.add(airdropSupply, _numberOfDrivers) <= AIRDROP_RESERVE,
            "Max airdrop reserve exceeded!"
        );
        _;
    }

    modifier amountCompliance(
        uint256 _numberOfDrivers,
        bool _isWhiteList,
        SellType _sellType
    ) {
        require(
            getPrice(
                _numberOfDrivers,
                _sellType == SellType.SINGLES ? false : _isWhiteList
            ) <= msg.value,
            "Amount of Ether sent is not correct."
        );
        _;
    }

    modifier mintNumberCompliance(uint256 _numberOfDrivers) {
        require(_numberOfDrivers > 0, "You can not mint 0 Tokens!");
        _;
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Invalid proof"
        );
        _;
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function whitelistMint(
        uint128 _numberOfDrivers,
        SellType sellType,
        bytes32[] calldata _merkleProof
    )
        external
        payable
        nonReentrant
        reserveCompliance(_numberOfDrivers)
        amountCompliance(_numberOfDrivers, true, sellType)
        mintNumberCompliance(_numberOfDrivers)
        isValidMerkleProof(_merkleProof, MV_WL_MERKLE_ROOT)
    {
        require(whitelistActive, "Whitelist mint has not started!");

        if (_numberOfDrivers == 20 && sellType == SellType.BOX) {
            require(
                SafeMath.add(boxSupply.current(), 1) <= BOX_RESERVE,
                "All boxes are sold out!"
            );
            boxSupply.increment();
        }

        if (_numberOfDrivers == 4 && sellType == SellType.PACK) {
            require(
                SafeMath.add(packSupply.current(), 1) <= PACK_RESERVE,
                "All packs are sold out!"
            );
            packSupply.increment();
        }

        _safeMint(msg.sender, _numberOfDrivers);
        publicSupply += _numberOfDrivers;
        if (_numberOfDrivers == 20 && sellType == SellType.BOX) {
            emit BoxMint(boxSupply.current());
        } else if (_numberOfDrivers == 4 && sellType == SellType.PACK) {
            emit PackMint(packSupply.current());
        }
        emit Mint(msg.sender, _totalMinted());
    }

    function mint(uint128 _numberOfDrivers)
        external
        payable
        nonReentrant
        reserveCompliance(_numberOfDrivers)
        amountCompliance(_numberOfDrivers, false, SellType.SINGLES)
        mintNumberCompliance(_numberOfDrivers)
    {
        require(saleActive, "Sale has not started yet. Stay tuned!");
        _safeMint(msg.sender, _numberOfDrivers);
        publicSupply += _numberOfDrivers;
        emit Mint(msg.sender, _totalMinted());
    }

    function airdrop(bytes32[] calldata _merkleProof)
        external
        isValidMerkleProof(_merkleProof, MV_AD_MERKLE_ROOT)
        airdropReserveCompliance(1)
        nonReentrant
    {
        require(
            !_claimedAirdrop[msg.sender],
            "You already claimed your airdrop!"
        );

        _safeMint(msg.sender, 1);
        _claimedAirdrop[msg.sender] = true;
        airdropSupply += 1;
        emit Mint(msg.sender, _totalMinted());
    }

    // ============ SUPPORTING FUNCTIONS ============
    function getPrice(uint256 _numberOfDrivers, bool _whitelistActive)
        internal
        pure
        returns (uint256)
    {
        if (_whitelistActive) {
            if (_numberOfDrivers == 1) {
                return PRICE_PER_DRIVER;
            } else if (_numberOfDrivers == 4) {
                return WL_DISCOUNT_FOUR_DRIVERS;
            } else {
                return WL_DISCOUNT_TWENTY_DRIVERS;
            }
        } else {
            return _numberOfDrivers * PRICE_PER_DRIVER;
        }
    }

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function tokenURI(uint256 _tokenId)
        public
        view
        override(ERC721A)
        returns (string memory)
    {
        require(_exists(_tokenId), "Token does not exist");

        if (revealed == false) {
            return notRevealedUri;
        }

        uint256 mappedIndex = (_tokenId + STARTING_INDEX) %
            (MAX_PUBLIC_MINT + AIRDROP_RESERVE);

        return
            bytes(tokenBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        tokenBaseURI,
                        mappedIndex.toString(),
                        ".json"
                    )
                )
                : "";
    }

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

    function ownerMint(address _receiver, uint256 _numberOfDrivers)
        external
        onlyOwner
        nonReentrant
        airdropReserveCompliance(_numberOfDrivers)
    {
        _safeMint(_receiver, _numberOfDrivers);
        airdropSupply += _numberOfDrivers;
    }

    function withdraw() public payable onlyOwner nonReentrant {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success);
  }

    function batchRelease() public payable onlyOwner nonReentrant {
     (bool success, ) = payable(0x64319A550faB4a0c48E05EFC0c64B865557670e8).call{value: address(this).balance * 40 / 100}("");
    require(success);

        uint256 balance = address(this).balance / 2;
        require(payable(0x5C49f58EAd11c720CB36b2ABb35a993adD8B2da4).send(balance));
        require(payable(0x221581A885578D72cfBb5b54DA76A28ded608728).send(balance));
    }

    function setWhiteListMerkleRoot(bytes32 merkleRoot) public onlyOwner {
        MV_WL_MERKLE_ROOT = merkleRoot;
    }

    function setAirdropMerkleRoot(bytes32 merkleRoot) public onlyOwner {
        MV_AD_MERKLE_ROOT = merkleRoot;
    }

    function setProvenanceHash(string memory _provenanceHash) public onlyOwner {
        MV_PROVENANCE = _provenanceHash;
    }

    function toggleRevealed() public onlyOwner {
        require(STARTING_INDEX != 0, "Set starting index first!");
        revealed = !revealed;
    }

    function toggleWhitelistSale() public onlyOwner {
        whitelistActive = !whitelistActive;
    }

    function togglePublicSale() public onlyOwner {
        saleActive = !saleActive;
    }

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

    function setStartingIndex(uint256 _startingIndex) public onlyOwner {
        require(STARTING_INDEX == 0, "Starting index has already been set");
        STARTING_INDEX = _startingIndex;
    }

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

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":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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":"uint256","name":"_boxesSold","type":"uint256"}],"name":"BoxMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Mint","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":"uint256","name":"_packsSold","type":"uint256"}],"name":"PackMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AIRDROP_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOX_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MV_AD_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MV_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MV_WL_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_DRIVER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTING_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_DISCOUNT_FOUR_DRIVERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_DISCOUNT_TWENTY_DRIVERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchRelease","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"boxSupply","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_numberOfDrivers","type":"uint128"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_numberOfDrivers","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"packSupply","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setAirdropMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startingIndex","type":"uint256"}],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhiteListMerkleRoot","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":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_numberOfDrivers","type":"uint128"},{"internalType":"enum MrVroom.SellType","name":"sellType","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600b60026101000a81548160ff0219169083151502179055506000600e556000600f55600060115560006012556040518060200160405280600081525060139080519060200190620000909291906200035a565b506000601455348015620000a357600080fd5b506040518060400160405280600781526020017f4d7256726f6f6d000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d5256524f4f4d000000000000000000000000000000000000000000000000008152508160029080519060200190620001289291906200035a565b508060039080519060200190620001419291906200035a565b5062000152620001b260201b60201c565b60008190555050506200017a6200016e620001b760201b60201c565b620001bf60201b60201c565b6001600981905550620001ac60405180608001604052806052815260200162005b7a605291396200028560201b60201c565b620004f2565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000295620001b760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002bb6200033060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030b906200046b565b60405180910390fd5b80601090805190602001906200032c9291906200035a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200036890620004bc565b90600052602060002090601f0160209004810192826200038c5760008555620003d8565b82601f10620003a757805160ff1916838001178555620003d8565b82800160010185558215620003d8579182015b82811115620003d7578251825591602001919060010190620003ba565b5b509050620003e79190620003eb565b5090565b5b8082111562000406576000816000905550600101620003ec565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004536020836200040a565b915062000460826200041b565b602082019050919050565b60006020820190508181036000830152620004868162000444565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004d557607f821691505b60208210811415620004ec57620004eb6200048d565b5b50919050565b61567880620005026000396000f3fe6080604052600436106102ff5760003560e01c806368428a1b11610190578063c7fa2ae1116100dc578063e9c0a91811610095578063f7de95e41161006f578063f7de95e414610ad7578063fb3ed5c714610b02578063fb4bcd4f14610b2d578063fb86d0bf14610b56576102ff565b8063e9c0a91814610a5c578063f2c4ce1e14610a85578063f2fde38b14610aae576102ff565b8063c7fa2ae11461094c578063c87b56dd14610977578063d6054fc1146109b4578063e08e65ea146109df578063e222c7f914610a08578063e985e9c514610a1f576102ff565b80637e162fe51161014957806395d89b411161012357806395d89b41146108a45780639cd59aea146108cf578063a22cb465146108fa578063b88d4fde14610923576102ff565b80637e162fe51461082557806388f2ebcb146108505780638da5cb5b14610879576102ff565b806368428a1b1461073457806369d3e20e1461075f57806370a082311461077b578063715018a6146107b857806374ee5551146107cf5780637b0feaf8146107fa576102ff565b80633ccfd60b1161024f57806355f804b3116102085780635bc020bc116101e25780635bc020bc1461068a5780635e84d723146106a15780636352211e146106cc57806365f1309714610709576102ff565b806355f804b31461061f57806357094d361461064857806359eda1b514610673576102ff565b80633ccfd60b1461055157806342842e0e1461055b578063484b973c1461058457806348f180d5146105ad5780634e99b800146105c957806351830227146105f4576102ff565b806310969523116102bc5780631c041de1116102965780631c041de1146104a757806323b872dd146104d257806329a66b8f146104fb578063380c041e14610526576102ff565b8063109695231461042857806318160ddd146104515780631a46b2d41461047c576102ff565b806301ffc9a71461030457806302ce58131461034157806306fdde031461036c578063081812fc14610397578063081c8c44146103d4578063095ea7b3146103ff575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906140b8565b610b60565b6040516103389190614100565b60405180910390f35b34801561034d57600080fd5b50610356610c42565b6040516103639190614100565b60405180910390f35b34801561037857600080fd5b50610381610c55565b60405161038e91906141b4565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061420c565b610ce7565b6040516103cb919061427a565b60405180910390f35b3480156103e057600080fd5b506103e9610d63565b6040516103f691906141b4565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906142c1565b610df1565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614436565b610efc565b005b34801561045d57600080fd5b50610466610f92565b604051610473919061448e565b60405180910390f35b34801561048857600080fd5b50610491610fa9565b60405161049e91906141b4565b60405180910390f35b3480156104b357600080fd5b506104bc611037565b6040516104c9919061448e565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906144a9565b611043565b005b34801561050757600080fd5b50610510611053565b60405161051d919061448e565b60405180910390f35b34801561053257600080fd5b5061053b61105e565b604051610548919061448e565b60405180910390f35b61055961106a565b005b34801561056757600080fd5b50610582600480360381019061057d91906144a9565b6111b5565b005b34801561059057600080fd5b506105ab60048036038101906105a691906142c1565b6111d5565b005b6105c760048036038101906105c291906145c9565b611320565b005b3480156105d557600080fd5b506105de6118cb565b6040516105eb91906141b4565b60405180910390f35b34801561060057600080fd5b50610609611959565b6040516106169190614100565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190614436565b61196c565b005b34801561065457600080fd5b5061065d611a02565b60405161066a919061448e565b60405180910390f35b34801561067f57600080fd5b50610688611a07565b005b34801561069657600080fd5b5061069f611aaf565b005b3480156106ad57600080fd5b506106b6611b9d565b6040516106c3919061448e565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee919061420c565b611ba3565b604051610700919061427a565b60405180910390f35b34801561071557600080fd5b5061071e611bb9565b60405161072b919061448e565b60405180910390f35b34801561074057600080fd5b50610749611bbf565b6040516107569190614100565b60405180910390f35b6107796004803603810190610774919061463d565b611bd2565b005b34801561078757600080fd5b506107a2600480360381019061079d919061466a565b611e60565b6040516107af919061448e565b60405180910390f35b3480156107c457600080fd5b506107cd611f30565b005b3480156107db57600080fd5b506107e4611fb8565b6040516107f1919061448e565b60405180910390f35b34801561080657600080fd5b5061080f611fbe565b60405161081c919061448e565b60405180910390f35b34801561083157600080fd5b5061083a611fc3565b60405161084791906146b0565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061420c565b611fc9565b005b34801561088557600080fd5b5061088e612094565b60405161089b919061427a565b60405180910390f35b3480156108b057600080fd5b506108b96120be565b6040516108c691906141b4565b60405180910390f35b3480156108db57600080fd5b506108e4612150565b6040516108f1919061448e565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c91906146f7565b61215c565b005b34801561092f57600080fd5b5061094a600480360381019061094591906147d8565b6122d4565b005b34801561095857600080fd5b50610961612350565b60405161096e91906146b0565b60405180910390f35b34801561098357600080fd5b5061099e6004803603810190610999919061420c565b612356565b6040516109ab91906141b4565b60405180910390f35b3480156109c057600080fd5b506109c96124da565b6040516109d6919061448e565b60405180910390f35b3480156109eb57600080fd5b50610a066004803603810190610a019190614887565b6124e6565b005b348015610a1457600080fd5b50610a1d61256c565b005b348015610a2b57600080fd5b50610a466004803603810190610a4191906148b4565b612614565b604051610a539190614100565b60405180910390f35b348015610a6857600080fd5b50610a836004803603810190610a7e91906148f4565b6126a8565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190614436565b612963565b005b348015610aba57600080fd5b50610ad56004803603810190610ad0919061466a565b6129f9565b005b348015610ae357600080fd5b50610aec612af1565b604051610af9919061448e565b60405180910390f35b348015610b0e57600080fd5b50610b17612af7565b604051610b24919061448e565b60405180910390f35b348015610b3957600080fd5b50610b546004803603810190610b4f9190614887565b612afd565b005b610b5e612b83565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3b5750610c3a82612db0565b5b9050919050565b600b60019054906101000a900460ff1681565b606060028054610c6490614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9090614970565b8015610cdd5780601f10610cb257610100808354040283529160200191610cdd565b820191906000526020600020905b815481529060010190602001808311610cc057829003601f168201915b5050505050905090565b6000610cf282612e1a565b610d28576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60108054610d7090614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90614970565b8015610de95780601f10610dbe57610100808354040283529160200191610de9565b820191906000526020600020905b815481529060010190602001808311610dcc57829003601f168201915b505050505081565b6000610dfc82611ba3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e64576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e83612e68565b73ffffffffffffffffffffffffffffffffffffffff1614158015610eb55750610eb381610eae612e68565b612614565b155b15610eec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef7838383612e70565b505050565b610f04612e68565b73ffffffffffffffffffffffffffffffffffffffff16610f22612094565b73ffffffffffffffffffffffffffffffffffffffff1614610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906149ee565b60405180910390fd5b8060139080519060200190610f8e929190613f66565b5050565b6000610f9c612f22565b6001546000540303905090565b60138054610fb690614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe290614970565b801561102f5780601f106110045761010080835404028352916020019161102f565b820191906000526020600020905b81548152906001019060200180831161101257829003601f168201915b505050505081565b67027f7d0bdb92000081565b61104e838383612f27565b505050565b66b1a2bc2ec5000081565b670b1a2bc2ec50000081565b611072612e68565b73ffffffffffffffffffffffffffffffffffffffff16611090612094565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd906149ee565b60405180910390fd5b6002600954141561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390614a5a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161115a90614aab565b60006040518083038185875af1925050503d8060008114611197576040519150601f19603f3d011682016040523d82523d6000602084013e61119c565b606091505b50509050806111aa57600080fd5b506001600981905550565b6111d0838383604051806020016040528060008152506122d4565b505050565b6111dd612e68565b73ffffffffffffffffffffffffffffffffffffffff166111fb612094565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906149ee565b60405180910390fd5b60026009541415611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614a5a565b60405180910390fd5b6002600981905550806101f46112af600f54836133dd565b11156112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790614b0c565b60405180910390fd5b6112fa83836133f3565b81600f600082825461130c9190614b5b565b925050819055505060016009819055505050565b60026009541415611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d90614a5a565b60405180910390fd5b6002600981905550836fffffffffffffffffffffffffffffffff1661157c611390600e54836133dd565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890614bfd565b60405180910390fd5b846fffffffffffffffffffffffffffffffff16600185346114268460006002811115611400576113ff614c1d565b5b84600281111561141357611412614c1d565b5b1461141e5784611421565b60005b613411565b1115611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90614cbe565b60405180910390fd5b876fffffffffffffffffffffffffffffffff16600081116114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490614d2a565b60405180910390fd5b8686601154611534838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016115199190614d92565b60405160208183030381529060405280519060200120613476565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614df9565b60405180910390fd5b600b60019054906101000a900460ff166115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614e65565b60405180910390fd5b60148c6fffffffffffffffffffffffffffffffff1614801561160757506002808111156115f2576115f1614c1d565b5b8b600281111561160557611604614c1d565b5b145b1561166e57600a61162261161b600c61348d565b60016133dd565b1115611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614ed1565b60405180910390fd5b61166d600c61349b565b5b60048c6fffffffffffffffffffffffffffffffff161480156116b457506001600281111561169f5761169e614c1d565b5b8b60028111156116b2576116b1614c1d565b5b145b1561171b5760326116cf6116c8600d61348d565b60016133dd565b1115611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614f3d565b60405180910390fd5b61171a600d61349b565b5b611737338d6fffffffffffffffffffffffffffffffff166133f3565b8b6fffffffffffffffffffffffffffffffff16600e600082825461175b9190614b5b565b9250508190555060148c6fffffffffffffffffffffffffffffffff161480156117a7575060028081111561179257611791614c1d565b5b8b60028111156117a5576117a4614c1d565b5b145b156117e7576117b6600c61348d565b7f7f3ba266236f66d747796d78a49a64cc0086bd7dd659e5c897ed5709f90c17ed60405160405180910390a261186a565b60048c6fffffffffffffffffffffffffffffffff1614801561182d57506001600281111561181857611817614c1d565b5b8b600281111561182b5761182a614c1d565b5b145b156118695761183c600d61348d565b7fa6724c6116c2d2b91535c5a359a4da23d8bd3a474e3e47030cab042d4749a60760405160405180910390a25b5b6118726134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a35050505050505050600160098190555050505050565b600a80546118d890614970565b80601f016020809104026020016040519081016040528092919081815260200182805461190490614970565b80156119515780601f1061192657610100808354040283529160200191611951565b820191906000526020600020905b81548152906001019060200180831161193457829003601f168201915b505050505081565b600b60029054906101000a900460ff1681565b611974612e68565b73ffffffffffffffffffffffffffffffffffffffff16611992612094565b73ffffffffffffffffffffffffffffffffffffffff16146119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df906149ee565b60405180910390fd5b80600a90805190602001906119fe929190613f66565b5050565b603281565b611a0f612e68565b73ffffffffffffffffffffffffffffffffffffffff16611a2d612094565b73ffffffffffffffffffffffffffffffffffffffff1614611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906149ee565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b611ab7612e68565b73ffffffffffffffffffffffffffffffffffffffff16611ad5612094565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906149ee565b60405180910390fd5b60006014541415611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890614fa9565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b600e5481565b6000611bae826134c4565b600001519050919050565b61157c81565b600b60009054906101000a900460ff1681565b60026009541415611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90614a5a565b60405180910390fd5b6002600981905550806fffffffffffffffffffffffffffffffff1661157c611c42600e54836133dd565b1115611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614bfd565b60405180910390fd5b816fffffffffffffffffffffffffffffffff1660008034611cd88460006002811115611cb257611cb1614c1d565b5b846002811115611cc557611cc4614c1d565b5b14611cd05784611cd3565b60005b613411565b1115611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1090614cbe565b60405180910390fd5b846fffffffffffffffffffffffffffffffff1660008111611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690614d2a565b60405180910390fd5b600b60009054906101000a900460ff16611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db59061503b565b60405180910390fd5b611dda33876fffffffffffffffffffffffffffffffff166133f3565b856fffffffffffffffffffffffffffffffff16600e6000828254611dfe9190614b5b565b92505081905550611e0d6134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a35050505050600160098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f38612e68565b73ffffffffffffffffffffffffffffffffffffffff16611f56612094565b73ffffffffffffffffffffffffffffffffffffffff1614611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906149ee565b60405180910390fd5b611fb66000613753565b565b6101f481565b600a81565b60115481565b611fd1612e68565b73ffffffffffffffffffffffffffffffffffffffff16611fef612094565b73ffffffffffffffffffffffffffffffffffffffff1614612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906149ee565b60405180910390fd5b60006014541461208a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612081906150cd565b60405180910390fd5b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546120cd90614970565b80601f01602080910402602001604051908101604052809291908181526020018280546120f990614970565b80156121465780601f1061211b57610100808354040283529160200191612146565b820191906000526020600020905b81548152906001019060200180831161212957829003601f168201915b5050505050905090565b600c8060000154905081565b612164612e68565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006121d6612e68565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612283612e68565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122c89190614100565b60405180910390a35050565b6122df848484612f27565b6122fe8373ffffffffffffffffffffffffffffffffffffffff16613819565b801561231357506123118484848461383c565b155b1561234a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60125481565b606061236182612e1a565b6123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790615139565b60405180910390fd5b60001515600b60029054906101000a900460ff161515141561244e57601080546123c990614970565b80601f01602080910402602001604051908101604052809291908181526020018280546123f590614970565b80156124425780601f1061241757610100808354040283529160200191612442565b820191906000526020600020905b81548152906001019060200180831161242557829003601f168201915b505050505090506124d5565b60006101f461157c6124609190614b5b565b6014548461246e9190614b5b565b6124789190615188565b90506000600a805461248990614970565b9050116124a557604051806020016040528060008152506124d1565b600a6124b08261398d565b6040516020016124c19291906152d5565b6040516020818303038152906040525b9150505b919050565b600d8060000154905081565b6124ee612e68565b73ffffffffffffffffffffffffffffffffffffffff1661250c612094565b73ffffffffffffffffffffffffffffffffffffffff1614612562576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612559906149ee565b60405180910390fd5b8060118190555050565b612574612e68565b73ffffffffffffffffffffffffffffffffffffffff16612592612094565b73ffffffffffffffffffffffffffffffffffffffff16146125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df906149ee565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b818160125461271f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016127049190614d92565b60405160208183030381529060405280519060200120613476565b61275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614df9565b60405180910390fd5b60016101f461276f600f54836133dd565b11156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614b0c565b60405180910390fd5b600260095414156127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed90614a5a565b60405180910390fd5b6002600981905550601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561288b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288290615376565b60405180910390fd5b6128963360016133f3565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008282546129019190614b5b565b925050819055506129106134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001600981905550505050505050565b61296b612e68565b73ffffffffffffffffffffffffffffffffffffffff16612989612094565b73ffffffffffffffffffffffffffffffffffffffff16146129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906149ee565b60405180910390fd5b80601090805190602001906129f5929190613f66565b5050565b612a01612e68565b73ffffffffffffffffffffffffffffffffffffffff16612a1f612094565b73ffffffffffffffffffffffffffffffffffffffff1614612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c906149ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc90615408565b60405180910390fd5b612aee81613753565b50565b60145481565b600f5481565b612b05612e68565b73ffffffffffffffffffffffffffffffffffffffff16612b23612094565b73ffffffffffffffffffffffffffffffffffffffff1614612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b70906149ee565b60405180910390fd5b8060128190555050565b612b8b612e68565b73ffffffffffffffffffffffffffffffffffffffff16612ba9612094565b73ffffffffffffffffffffffffffffffffffffffff1614612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906149ee565b60405180910390fd5b60026009541415612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614a5a565b60405180910390fd5b600260098190555060007364319a550fab4a0c48e05efc0c64b865557670e873ffffffffffffffffffffffffffffffffffffffff166064602847612c899190615428565b612c939190615482565b604051612c9f90614aab565b60006040518083038185875af1925050503d8060008114612cdc576040519150601f19603f3d011682016040523d82523d6000602084013e612ce1565b606091505b5050905080612cef57600080fd5b6000600247612cfe9190615482565b9050735c49f58ead11c720cb36b2abb35a993add8b2da473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050612d5257600080fd5b73221581a885578d72cfbb5b54da76a28ded60872873ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050612da457600080fd5b50506001600981905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612e25612f22565b11158015612e34575060005482105b8015612e61575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612f32826134c4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f9d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612fbe612e68565b73ffffffffffffffffffffffffffffffffffffffff161480612fed5750612fec85612fe7612e68565b612614565b5b806130325750612ffb612e68565b73ffffffffffffffffffffffffffffffffffffffff1661301a84610ce7565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061306b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130df8585856001613aee565b6130eb60008487612e70565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561336b57600054821461336a57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133d68585856001613af4565b5050505050565b600081836133eb9190614b5b565b905092915050565b61340d828260405180602001604052806000815250613afa565b5050565b6000811561345a5760018314156134315766b1a2bc2ec500009050613470565b600483141561344a5767027f7d0bdb9200009050613470565b670b1a2bc2ec5000009050613470565b66b1a2bc2ec500008361346d9190615428565b90505b92915050565b6000826134838584613b0c565b1490509392505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60006134bb612f22565b60005403905090565b6134cc613fec565b6000829050806134da612f22565b111580156134e9575060005481105b1561371c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161371a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146135fe57809250505061374e565b5b60011561371957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461371457809250505061374e565b6135ff565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613862612e68565b8786866040518563ffffffff1660e01b81526004016138849493929190615508565b6020604051808303816000875af19250505080156138c057506040513d601f19601f820116820180604052508101906138bd9190615569565b60015b61393a573d80600081146138f0576040519150601f19603f3d011682016040523d82523d6000602084013e6138f5565b606091505b50600081511415613932576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156139d5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ae9565b600082905060005b60008214613a075780806139f090615596565b915050600a82613a009190615482565b91506139dd565b60008167ffffffffffffffff811115613a2357613a2261430b565b5b6040519080825280601f01601f191660200182016040528015613a555781602001600182028036833780820191505090505b5090505b60008514613ae257600182613a6e91906155df565b9150600a85613a7d9190615188565b6030613a899190614b5b565b60f81b818381518110613a9f57613a9e615613565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613adb9190615482565b9450613a59565b8093505050505b919050565b50505050565b50505050565b613b078383836001613b81565b505050565b60008082905060005b8451811015613b76576000858281518110613b3357613b32615613565b5b60200260200101519050808311613b5557613b4e8382613f4f565b9250613b62565b613b5f8184613f4f565b92505b508080613b6e90615596565b915050613b15565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613bee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613c29576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c366000868387613aee565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613e005750613dff8773ffffffffffffffffffffffffffffffffffffffff16613819565b5b15613ec6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e75600088848060010195508861383c565b613eab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613e06578260005414613ec157600080fd5b613f32565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613ec7575b816000819055505050613f486000868387613af4565b5050505050565b600082600052816020526040600020905092915050565b828054613f7290614970565b90600052602060002090601f016020900481019282613f945760008555613fdb565b82601f10613fad57805160ff1916838001178555613fdb565b82800160010185558215613fdb579182015b82811115613fda578251825591602001919060010190613fbf565b5b509050613fe8919061402f565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115614048576000816000905550600101614030565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61409581614060565b81146140a057600080fd5b50565b6000813590506140b28161408c565b92915050565b6000602082840312156140ce576140cd614056565b5b60006140dc848285016140a3565b91505092915050565b60008115159050919050565b6140fa816140e5565b82525050565b600060208201905061411560008301846140f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561415557808201518184015260208101905061413a565b83811115614164576000848401525b50505050565b6000601f19601f8301169050919050565b60006141868261411b565b6141908185614126565b93506141a0818560208601614137565b6141a98161416a565b840191505092915050565b600060208201905081810360008301526141ce818461417b565b905092915050565b6000819050919050565b6141e9816141d6565b81146141f457600080fd5b50565b600081359050614206816141e0565b92915050565b60006020828403121561422257614221614056565b5b6000614230848285016141f7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061426482614239565b9050919050565b61427481614259565b82525050565b600060208201905061428f600083018461426b565b92915050565b61429e81614259565b81146142a957600080fd5b50565b6000813590506142bb81614295565b92915050565b600080604083850312156142d8576142d7614056565b5b60006142e6858286016142ac565b92505060206142f7858286016141f7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143438261416a565b810181811067ffffffffffffffff821117156143625761436161430b565b5b80604052505050565b600061437561404c565b9050614381828261433a565b919050565b600067ffffffffffffffff8211156143a1576143a061430b565b5b6143aa8261416a565b9050602081019050919050565b82818337600083830152505050565b60006143d96143d484614386565b61436b565b9050828152602081018484840111156143f5576143f4614306565b5b6144008482856143b7565b509392505050565b600082601f83011261441d5761441c614301565b5b813561442d8482602086016143c6565b91505092915050565b60006020828403121561444c5761444b614056565b5b600082013567ffffffffffffffff81111561446a5761446961405b565b5b61447684828501614408565b91505092915050565b614488816141d6565b82525050565b60006020820190506144a3600083018461447f565b92915050565b6000806000606084860312156144c2576144c1614056565b5b60006144d0868287016142ac565b93505060206144e1868287016142ac565b92505060406144f2868287016141f7565b9150509250925092565b60006fffffffffffffffffffffffffffffffff82169050919050565b614521816144fc565b811461452c57600080fd5b50565b60008135905061453e81614518565b92915050565b6003811061455157600080fd5b50565b60008135905061456381614544565b92915050565b600080fd5b600080fd5b60008083601f84011261458957614588614301565b5b8235905067ffffffffffffffff8111156145a6576145a5614569565b5b6020830191508360208202830111156145c2576145c161456e565b5b9250929050565b600080600080606085870312156145e3576145e2614056565b5b60006145f18782880161452f565b945050602061460287828801614554565b935050604085013567ffffffffffffffff8111156146235761462261405b565b5b61462f87828801614573565b925092505092959194509250565b60006020828403121561465357614652614056565b5b60006146618482850161452f565b91505092915050565b6000602082840312156146805761467f614056565b5b600061468e848285016142ac565b91505092915050565b6000819050919050565b6146aa81614697565b82525050565b60006020820190506146c560008301846146a1565b92915050565b6146d4816140e5565b81146146df57600080fd5b50565b6000813590506146f1816146cb565b92915050565b6000806040838503121561470e5761470d614056565b5b600061471c858286016142ac565b925050602061472d858286016146e2565b9150509250929050565b600067ffffffffffffffff8211156147525761475161430b565b5b61475b8261416a565b9050602081019050919050565b600061477b61477684614737565b61436b565b90508281526020810184848401111561479757614796614306565b5b6147a28482856143b7565b509392505050565b600082601f8301126147bf576147be614301565b5b81356147cf848260208601614768565b91505092915050565b600080600080608085870312156147f2576147f1614056565b5b6000614800878288016142ac565b9450506020614811878288016142ac565b9350506040614822878288016141f7565b925050606085013567ffffffffffffffff8111156148435761484261405b565b5b61484f878288016147aa565b91505092959194509250565b61486481614697565b811461486f57600080fd5b50565b6000813590506148818161485b565b92915050565b60006020828403121561489d5761489c614056565b5b60006148ab84828501614872565b91505092915050565b600080604083850312156148cb576148ca614056565b5b60006148d9858286016142ac565b92505060206148ea858286016142ac565b9150509250929050565b6000806020838503121561490b5761490a614056565b5b600083013567ffffffffffffffff8111156149295761492861405b565b5b61493585828601614573565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061498857607f821691505b6020821081141561499c5761499b614941565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149d8602083614126565b91506149e3826149a2565b602082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a44601f83614126565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b600081905092915050565b50565b6000614a95600083614a7a565b9150614aa082614a85565b600082019050919050565b6000614ab682614a88565b9150819050919050565b7f4d61782061697264726f70207265736572766520657863656564656421000000600082015250565b6000614af6601d83614126565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b66826141d6565b9150614b71836141d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ba657614ba5614b2c565b5b828201905092915050565b7f4d6178207075626c696320737570706c79206578636565646564210000000000600082015250565b6000614be7601b83614126565b9150614bf282614bb1565b602082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f416d6f756e74206f662045746865722073656e74206973206e6f7420636f727260008201527f6563742e00000000000000000000000000000000000000000000000000000000602082015250565b6000614ca8602483614126565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f596f752063616e206e6f74206d696e74203020546f6b656e7321000000000000600082015250565b6000614d14601a83614126565b9150614d1f82614cde565b602082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b60008160601b9050919050565b6000614d6282614d4a565b9050919050565b6000614d7482614d57565b9050919050565b614d8c614d8782614259565b614d69565b82525050565b6000614d9e8284614d7b565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614de3600d83614126565b9150614dee82614dad565b602082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f57686974656c697374206d696e7420686173206e6f7420737461727465642100600082015250565b6000614e4f601f83614126565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f416c6c20626f7865732061726520736f6c64206f757421000000000000000000600082015250565b6000614ebb601783614126565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f416c6c207061636b732061726520736f6c64206f757421000000000000000000600082015250565b6000614f27601783614126565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f536574207374617274696e6720696e6465782066697273742100000000000000600082015250565b6000614f93601983614126565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f53616c6520686173206e6f742073746172746564207965742e2053746179207460008201527f756e656421000000000000000000000000000000000000000000000000000000602082015250565b6000615025602583614126565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b60006150b7602383614126565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000615123601483614126565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615193826141d6565b915061519e836141d6565b9250826151ae576151ad615159565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151e681614970565b6151f081866151b9565b9450600182166000811461520b576001811461521c5761524f565b60ff1983168652818601935061524f565b615225856151c4565b60005b8381101561524757815481890152600182019150602081019050615228565b838801955050505b50505092915050565b60006152638261411b565b61526d81856151b9565b935061527d818560208601614137565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006152bf6005836151b9565b91506152ca82615289565b600582019050919050565b60006152e182856151d9565b91506152ed8284615258565b91506152f8826152b2565b91508190509392505050565b7f596f7520616c726561647920636c61696d656420796f75722061697264726f7060008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000615360602183614126565b915061536b82615304565b604082019050919050565b6000602082019050818103600083015261538f81615353565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153f2602683614126565b91506153fd82615396565b604082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b6000615433826141d6565b915061543e836141d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561547757615476614b2c565b5b828202905092915050565b600061548d826141d6565b9150615498836141d6565b9250826154a8576154a7615159565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006154da826154b3565b6154e481856154be565b93506154f4818560208601614137565b6154fd8161416a565b840191505092915050565b600060808201905061551d600083018761426b565b61552a602083018661426b565b615537604083018561447f565b818103606083015261554981846154cf565b905095945050505050565b6000815190506155638161408c565b92915050565b60006020828403121561557f5761557e614056565b5b600061558d84828501615554565b91505092915050565b60006155a1826141d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155d4576155d3614b2c565b5b600182019050919050565b60006155ea826141d6565b91506155f5836141d6565b92508282101561560857615607614b2c565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220df1a38b6c933822f8cd7a967bd1d880eba8e63a6aeea632123ef25141efbadcf64736f6c634300080b003368747470733a2f2f6d7276726f6f6d2e6d7970696e6174612e636c6f75642f697066732f516d524e50637757614c4d45646b7144465779796a4d59466b6a4d33556242437a4a5568763971367342596e6641

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806368428a1b11610190578063c7fa2ae1116100dc578063e9c0a91811610095578063f7de95e41161006f578063f7de95e414610ad7578063fb3ed5c714610b02578063fb4bcd4f14610b2d578063fb86d0bf14610b56576102ff565b8063e9c0a91814610a5c578063f2c4ce1e14610a85578063f2fde38b14610aae576102ff565b8063c7fa2ae11461094c578063c87b56dd14610977578063d6054fc1146109b4578063e08e65ea146109df578063e222c7f914610a08578063e985e9c514610a1f576102ff565b80637e162fe51161014957806395d89b411161012357806395d89b41146108a45780639cd59aea146108cf578063a22cb465146108fa578063b88d4fde14610923576102ff565b80637e162fe51461082557806388f2ebcb146108505780638da5cb5b14610879576102ff565b806368428a1b1461073457806369d3e20e1461075f57806370a082311461077b578063715018a6146107b857806374ee5551146107cf5780637b0feaf8146107fa576102ff565b80633ccfd60b1161024f57806355f804b3116102085780635bc020bc116101e25780635bc020bc1461068a5780635e84d723146106a15780636352211e146106cc57806365f1309714610709576102ff565b806355f804b31461061f57806357094d361461064857806359eda1b514610673576102ff565b80633ccfd60b1461055157806342842e0e1461055b578063484b973c1461058457806348f180d5146105ad5780634e99b800146105c957806351830227146105f4576102ff565b806310969523116102bc5780631c041de1116102965780631c041de1146104a757806323b872dd146104d257806329a66b8f146104fb578063380c041e14610526576102ff565b8063109695231461042857806318160ddd146104515780631a46b2d41461047c576102ff565b806301ffc9a71461030457806302ce58131461034157806306fdde031461036c578063081812fc14610397578063081c8c44146103d4578063095ea7b3146103ff575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906140b8565b610b60565b6040516103389190614100565b60405180910390f35b34801561034d57600080fd5b50610356610c42565b6040516103639190614100565b60405180910390f35b34801561037857600080fd5b50610381610c55565b60405161038e91906141b4565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061420c565b610ce7565b6040516103cb919061427a565b60405180910390f35b3480156103e057600080fd5b506103e9610d63565b6040516103f691906141b4565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906142c1565b610df1565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614436565b610efc565b005b34801561045d57600080fd5b50610466610f92565b604051610473919061448e565b60405180910390f35b34801561048857600080fd5b50610491610fa9565b60405161049e91906141b4565b60405180910390f35b3480156104b357600080fd5b506104bc611037565b6040516104c9919061448e565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906144a9565b611043565b005b34801561050757600080fd5b50610510611053565b60405161051d919061448e565b60405180910390f35b34801561053257600080fd5b5061053b61105e565b604051610548919061448e565b60405180910390f35b61055961106a565b005b34801561056757600080fd5b50610582600480360381019061057d91906144a9565b6111b5565b005b34801561059057600080fd5b506105ab60048036038101906105a691906142c1565b6111d5565b005b6105c760048036038101906105c291906145c9565b611320565b005b3480156105d557600080fd5b506105de6118cb565b6040516105eb91906141b4565b60405180910390f35b34801561060057600080fd5b50610609611959565b6040516106169190614100565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190614436565b61196c565b005b34801561065457600080fd5b5061065d611a02565b60405161066a919061448e565b60405180910390f35b34801561067f57600080fd5b50610688611a07565b005b34801561069657600080fd5b5061069f611aaf565b005b3480156106ad57600080fd5b506106b6611b9d565b6040516106c3919061448e565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee919061420c565b611ba3565b604051610700919061427a565b60405180910390f35b34801561071557600080fd5b5061071e611bb9565b60405161072b919061448e565b60405180910390f35b34801561074057600080fd5b50610749611bbf565b6040516107569190614100565b60405180910390f35b6107796004803603810190610774919061463d565b611bd2565b005b34801561078757600080fd5b506107a2600480360381019061079d919061466a565b611e60565b6040516107af919061448e565b60405180910390f35b3480156107c457600080fd5b506107cd611f30565b005b3480156107db57600080fd5b506107e4611fb8565b6040516107f1919061448e565b60405180910390f35b34801561080657600080fd5b5061080f611fbe565b60405161081c919061448e565b60405180910390f35b34801561083157600080fd5b5061083a611fc3565b60405161084791906146b0565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061420c565b611fc9565b005b34801561088557600080fd5b5061088e612094565b60405161089b919061427a565b60405180910390f35b3480156108b057600080fd5b506108b96120be565b6040516108c691906141b4565b60405180910390f35b3480156108db57600080fd5b506108e4612150565b6040516108f1919061448e565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c91906146f7565b61215c565b005b34801561092f57600080fd5b5061094a600480360381019061094591906147d8565b6122d4565b005b34801561095857600080fd5b50610961612350565b60405161096e91906146b0565b60405180910390f35b34801561098357600080fd5b5061099e6004803603810190610999919061420c565b612356565b6040516109ab91906141b4565b60405180910390f35b3480156109c057600080fd5b506109c96124da565b6040516109d6919061448e565b60405180910390f35b3480156109eb57600080fd5b50610a066004803603810190610a019190614887565b6124e6565b005b348015610a1457600080fd5b50610a1d61256c565b005b348015610a2b57600080fd5b50610a466004803603810190610a4191906148b4565b612614565b604051610a539190614100565b60405180910390f35b348015610a6857600080fd5b50610a836004803603810190610a7e91906148f4565b6126a8565b005b348015610a9157600080fd5b50610aac6004803603810190610aa79190614436565b612963565b005b348015610aba57600080fd5b50610ad56004803603810190610ad0919061466a565b6129f9565b005b348015610ae357600080fd5b50610aec612af1565b604051610af9919061448e565b60405180910390f35b348015610b0e57600080fd5b50610b17612af7565b604051610b24919061448e565b60405180910390f35b348015610b3957600080fd5b50610b546004803603810190610b4f9190614887565b612afd565b005b610b5e612b83565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3b5750610c3a82612db0565b5b9050919050565b600b60019054906101000a900460ff1681565b606060028054610c6490614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9090614970565b8015610cdd5780601f10610cb257610100808354040283529160200191610cdd565b820191906000526020600020905b815481529060010190602001808311610cc057829003601f168201915b5050505050905090565b6000610cf282612e1a565b610d28576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60108054610d7090614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9c90614970565b8015610de95780601f10610dbe57610100808354040283529160200191610de9565b820191906000526020600020905b815481529060010190602001808311610dcc57829003601f168201915b505050505081565b6000610dfc82611ba3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e64576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e83612e68565b73ffffffffffffffffffffffffffffffffffffffff1614158015610eb55750610eb381610eae612e68565b612614565b155b15610eec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef7838383612e70565b505050565b610f04612e68565b73ffffffffffffffffffffffffffffffffffffffff16610f22612094565b73ffffffffffffffffffffffffffffffffffffffff1614610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906149ee565b60405180910390fd5b8060139080519060200190610f8e929190613f66565b5050565b6000610f9c612f22565b6001546000540303905090565b60138054610fb690614970565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe290614970565b801561102f5780601f106110045761010080835404028352916020019161102f565b820191906000526020600020905b81548152906001019060200180831161101257829003601f168201915b505050505081565b67027f7d0bdb92000081565b61104e838383612f27565b505050565b66b1a2bc2ec5000081565b670b1a2bc2ec50000081565b611072612e68565b73ffffffffffffffffffffffffffffffffffffffff16611090612094565b73ffffffffffffffffffffffffffffffffffffffff16146110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd906149ee565b60405180910390fd5b6002600954141561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390614a5a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161115a90614aab565b60006040518083038185875af1925050503d8060008114611197576040519150601f19603f3d011682016040523d82523d6000602084013e61119c565b606091505b50509050806111aa57600080fd5b506001600981905550565b6111d0838383604051806020016040528060008152506122d4565b505050565b6111dd612e68565b73ffffffffffffffffffffffffffffffffffffffff166111fb612094565b73ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611248906149ee565b60405180910390fd5b60026009541415611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614a5a565b60405180910390fd5b6002600981905550806101f46112af600f54836133dd565b11156112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790614b0c565b60405180910390fd5b6112fa83836133f3565b81600f600082825461130c9190614b5b565b925050819055505060016009819055505050565b60026009541415611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d90614a5a565b60405180910390fd5b6002600981905550836fffffffffffffffffffffffffffffffff1661157c611390600e54836133dd565b11156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890614bfd565b60405180910390fd5b846fffffffffffffffffffffffffffffffff16600185346114268460006002811115611400576113ff614c1d565b5b84600281111561141357611412614c1d565b5b1461141e5784611421565b60005b613411565b1115611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90614cbe565b60405180910390fd5b876fffffffffffffffffffffffffffffffff16600081116114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490614d2a565b60405180910390fd5b8686601154611534838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016115199190614d92565b60405160208183030381529060405280519060200120613476565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614df9565b60405180910390fd5b600b60019054906101000a900460ff166115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614e65565b60405180910390fd5b60148c6fffffffffffffffffffffffffffffffff1614801561160757506002808111156115f2576115f1614c1d565b5b8b600281111561160557611604614c1d565b5b145b1561166e57600a61162261161b600c61348d565b60016133dd565b1115611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614ed1565b60405180910390fd5b61166d600c61349b565b5b60048c6fffffffffffffffffffffffffffffffff161480156116b457506001600281111561169f5761169e614c1d565b5b8b60028111156116b2576116b1614c1d565b5b145b1561171b5760326116cf6116c8600d61348d565b60016133dd565b1115611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614f3d565b60405180910390fd5b61171a600d61349b565b5b611737338d6fffffffffffffffffffffffffffffffff166133f3565b8b6fffffffffffffffffffffffffffffffff16600e600082825461175b9190614b5b565b9250508190555060148c6fffffffffffffffffffffffffffffffff161480156117a7575060028081111561179257611791614c1d565b5b8b60028111156117a5576117a4614c1d565b5b145b156117e7576117b6600c61348d565b7f7f3ba266236f66d747796d78a49a64cc0086bd7dd659e5c897ed5709f90c17ed60405160405180910390a261186a565b60048c6fffffffffffffffffffffffffffffffff1614801561182d57506001600281111561181857611817614c1d565b5b8b600281111561182b5761182a614c1d565b5b145b156118695761183c600d61348d565b7fa6724c6116c2d2b91535c5a359a4da23d8bd3a474e3e47030cab042d4749a60760405160405180910390a25b5b6118726134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a35050505050505050600160098190555050505050565b600a80546118d890614970565b80601f016020809104026020016040519081016040528092919081815260200182805461190490614970565b80156119515780601f1061192657610100808354040283529160200191611951565b820191906000526020600020905b81548152906001019060200180831161193457829003601f168201915b505050505081565b600b60029054906101000a900460ff1681565b611974612e68565b73ffffffffffffffffffffffffffffffffffffffff16611992612094565b73ffffffffffffffffffffffffffffffffffffffff16146119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df906149ee565b60405180910390fd5b80600a90805190602001906119fe929190613f66565b5050565b603281565b611a0f612e68565b73ffffffffffffffffffffffffffffffffffffffff16611a2d612094565b73ffffffffffffffffffffffffffffffffffffffff1614611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906149ee565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b611ab7612e68565b73ffffffffffffffffffffffffffffffffffffffff16611ad5612094565b73ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906149ee565b60405180910390fd5b60006014541415611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890614fa9565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b600e5481565b6000611bae826134c4565b600001519050919050565b61157c81565b600b60009054906101000a900460ff1681565b60026009541415611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90614a5a565b60405180910390fd5b6002600981905550806fffffffffffffffffffffffffffffffff1661157c611c42600e54836133dd565b1115611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614bfd565b60405180910390fd5b816fffffffffffffffffffffffffffffffff1660008034611cd88460006002811115611cb257611cb1614c1d565b5b846002811115611cc557611cc4614c1d565b5b14611cd05784611cd3565b60005b613411565b1115611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1090614cbe565b60405180910390fd5b846fffffffffffffffffffffffffffffffff1660008111611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690614d2a565b60405180910390fd5b600b60009054906101000a900460ff16611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db59061503b565b60405180910390fd5b611dda33876fffffffffffffffffffffffffffffffff166133f3565b856fffffffffffffffffffffffffffffffff16600e6000828254611dfe9190614b5b565b92505081905550611e0d6134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a35050505050600160098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f38612e68565b73ffffffffffffffffffffffffffffffffffffffff16611f56612094565b73ffffffffffffffffffffffffffffffffffffffff1614611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906149ee565b60405180910390fd5b611fb66000613753565b565b6101f481565b600a81565b60115481565b611fd1612e68565b73ffffffffffffffffffffffffffffffffffffffff16611fef612094565b73ffffffffffffffffffffffffffffffffffffffff1614612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906149ee565b60405180910390fd5b60006014541461208a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612081906150cd565b60405180910390fd5b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546120cd90614970565b80601f01602080910402602001604051908101604052809291908181526020018280546120f990614970565b80156121465780601f1061211b57610100808354040283529160200191612146565b820191906000526020600020905b81548152906001019060200180831161212957829003601f168201915b5050505050905090565b600c8060000154905081565b612164612e68565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006121d6612e68565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612283612e68565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122c89190614100565b60405180910390a35050565b6122df848484612f27565b6122fe8373ffffffffffffffffffffffffffffffffffffffff16613819565b801561231357506123118484848461383c565b155b1561234a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60125481565b606061236182612e1a565b6123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790615139565b60405180910390fd5b60001515600b60029054906101000a900460ff161515141561244e57601080546123c990614970565b80601f01602080910402602001604051908101604052809291908181526020018280546123f590614970565b80156124425780601f1061241757610100808354040283529160200191612442565b820191906000526020600020905b81548152906001019060200180831161242557829003601f168201915b505050505090506124d5565b60006101f461157c6124609190614b5b565b6014548461246e9190614b5b565b6124789190615188565b90506000600a805461248990614970565b9050116124a557604051806020016040528060008152506124d1565b600a6124b08261398d565b6040516020016124c19291906152d5565b6040516020818303038152906040525b9150505b919050565b600d8060000154905081565b6124ee612e68565b73ffffffffffffffffffffffffffffffffffffffff1661250c612094565b73ffffffffffffffffffffffffffffffffffffffff1614612562576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612559906149ee565b60405180910390fd5b8060118190555050565b612574612e68565b73ffffffffffffffffffffffffffffffffffffffff16612592612094565b73ffffffffffffffffffffffffffffffffffffffff16146125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df906149ee565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b818160125461271f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016127049190614d92565b60405160208183030381529060405280519060200120613476565b61275e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275590614df9565b60405180910390fd5b60016101f461276f600f54836133dd565b11156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614b0c565b60405180910390fd5b600260095414156127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed90614a5a565b60405180910390fd5b6002600981905550601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561288b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288290615376565b60405180910390fd5b6128963360016133f3565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008282546129019190614b5b565b925050819055506129106134b1565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001600981905550505050505050565b61296b612e68565b73ffffffffffffffffffffffffffffffffffffffff16612989612094565b73ffffffffffffffffffffffffffffffffffffffff16146129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906149ee565b60405180910390fd5b80601090805190602001906129f5929190613f66565b5050565b612a01612e68565b73ffffffffffffffffffffffffffffffffffffffff16612a1f612094565b73ffffffffffffffffffffffffffffffffffffffff1614612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c906149ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adc90615408565b60405180910390fd5b612aee81613753565b50565b60145481565b600f5481565b612b05612e68565b73ffffffffffffffffffffffffffffffffffffffff16612b23612094565b73ffffffffffffffffffffffffffffffffffffffff1614612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b70906149ee565b60405180910390fd5b8060128190555050565b612b8b612e68565b73ffffffffffffffffffffffffffffffffffffffff16612ba9612094565b73ffffffffffffffffffffffffffffffffffffffff1614612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906149ee565b60405180910390fd5b60026009541415612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614a5a565b60405180910390fd5b600260098190555060007364319a550fab4a0c48e05efc0c64b865557670e873ffffffffffffffffffffffffffffffffffffffff166064602847612c899190615428565b612c939190615482565b604051612c9f90614aab565b60006040518083038185875af1925050503d8060008114612cdc576040519150601f19603f3d011682016040523d82523d6000602084013e612ce1565b606091505b5050905080612cef57600080fd5b6000600247612cfe9190615482565b9050735c49f58ead11c720cb36b2abb35a993add8b2da473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050612d5257600080fd5b73221581a885578d72cfbb5b54da76a28ded60872873ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050612da457600080fd5b50506001600981905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612e25612f22565b11158015612e34575060005482105b8015612e61575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612f32826134c4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f9d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612fbe612e68565b73ffffffffffffffffffffffffffffffffffffffff161480612fed5750612fec85612fe7612e68565b612614565b5b806130325750612ffb612e68565b73ffffffffffffffffffffffffffffffffffffffff1661301a84610ce7565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061306b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130df8585856001613aee565b6130eb60008487612e70565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561336b57600054821461336a57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133d68585856001613af4565b5050505050565b600081836133eb9190614b5b565b905092915050565b61340d828260405180602001604052806000815250613afa565b5050565b6000811561345a5760018314156134315766b1a2bc2ec500009050613470565b600483141561344a5767027f7d0bdb9200009050613470565b670b1a2bc2ec5000009050613470565b66b1a2bc2ec500008361346d9190615428565b90505b92915050565b6000826134838584613b0c565b1490509392505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60006134bb612f22565b60005403905090565b6134cc613fec565b6000829050806134da612f22565b111580156134e9575060005481105b1561371c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161371a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146135fe57809250505061374e565b5b60011561371957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461371457809250505061374e565b6135ff565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613862612e68565b8786866040518563ffffffff1660e01b81526004016138849493929190615508565b6020604051808303816000875af19250505080156138c057506040513d601f19601f820116820180604052508101906138bd9190615569565b60015b61393a573d80600081146138f0576040519150601f19603f3d011682016040523d82523d6000602084013e6138f5565b606091505b50600081511415613932576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156139d5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ae9565b600082905060005b60008214613a075780806139f090615596565b915050600a82613a009190615482565b91506139dd565b60008167ffffffffffffffff811115613a2357613a2261430b565b5b6040519080825280601f01601f191660200182016040528015613a555781602001600182028036833780820191505090505b5090505b60008514613ae257600182613a6e91906155df565b9150600a85613a7d9190615188565b6030613a899190614b5b565b60f81b818381518110613a9f57613a9e615613565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613adb9190615482565b9450613a59565b8093505050505b919050565b50505050565b50505050565b613b078383836001613b81565b505050565b60008082905060005b8451811015613b76576000858281518110613b3357613b32615613565b5b60200260200101519050808311613b5557613b4e8382613f4f565b9250613b62565b613b5f8184613f4f565b92505b508080613b6e90615596565b915050613b15565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613bee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613c29576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c366000868387613aee565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613e005750613dff8773ffffffffffffffffffffffffffffffffffffffff16613819565b5b15613ec6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e75600088848060010195508861383c565b613eab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613e06578260005414613ec157600080fd5b613f32565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613ec7575b816000819055505050613f486000868387613af4565b5050505050565b600082600052816020526040600020905092915050565b828054613f7290614970565b90600052602060002090601f016020900481019282613f945760008555613fdb565b82601f10613fad57805160ff1916838001178555613fdb565b82800160010185558215613fdb579182015b82811115613fda578251825591602001919060010190613fbf565b5b509050613fe8919061402f565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115614048576000816000905550600101614030565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61409581614060565b81146140a057600080fd5b50565b6000813590506140b28161408c565b92915050565b6000602082840312156140ce576140cd614056565b5b60006140dc848285016140a3565b91505092915050565b60008115159050919050565b6140fa816140e5565b82525050565b600060208201905061411560008301846140f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561415557808201518184015260208101905061413a565b83811115614164576000848401525b50505050565b6000601f19601f8301169050919050565b60006141868261411b565b6141908185614126565b93506141a0818560208601614137565b6141a98161416a565b840191505092915050565b600060208201905081810360008301526141ce818461417b565b905092915050565b6000819050919050565b6141e9816141d6565b81146141f457600080fd5b50565b600081359050614206816141e0565b92915050565b60006020828403121561422257614221614056565b5b6000614230848285016141f7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061426482614239565b9050919050565b61427481614259565b82525050565b600060208201905061428f600083018461426b565b92915050565b61429e81614259565b81146142a957600080fd5b50565b6000813590506142bb81614295565b92915050565b600080604083850312156142d8576142d7614056565b5b60006142e6858286016142ac565b92505060206142f7858286016141f7565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143438261416a565b810181811067ffffffffffffffff821117156143625761436161430b565b5b80604052505050565b600061437561404c565b9050614381828261433a565b919050565b600067ffffffffffffffff8211156143a1576143a061430b565b5b6143aa8261416a565b9050602081019050919050565b82818337600083830152505050565b60006143d96143d484614386565b61436b565b9050828152602081018484840111156143f5576143f4614306565b5b6144008482856143b7565b509392505050565b600082601f83011261441d5761441c614301565b5b813561442d8482602086016143c6565b91505092915050565b60006020828403121561444c5761444b614056565b5b600082013567ffffffffffffffff81111561446a5761446961405b565b5b61447684828501614408565b91505092915050565b614488816141d6565b82525050565b60006020820190506144a3600083018461447f565b92915050565b6000806000606084860312156144c2576144c1614056565b5b60006144d0868287016142ac565b93505060206144e1868287016142ac565b92505060406144f2868287016141f7565b9150509250925092565b60006fffffffffffffffffffffffffffffffff82169050919050565b614521816144fc565b811461452c57600080fd5b50565b60008135905061453e81614518565b92915050565b6003811061455157600080fd5b50565b60008135905061456381614544565b92915050565b600080fd5b600080fd5b60008083601f84011261458957614588614301565b5b8235905067ffffffffffffffff8111156145a6576145a5614569565b5b6020830191508360208202830111156145c2576145c161456e565b5b9250929050565b600080600080606085870312156145e3576145e2614056565b5b60006145f18782880161452f565b945050602061460287828801614554565b935050604085013567ffffffffffffffff8111156146235761462261405b565b5b61462f87828801614573565b925092505092959194509250565b60006020828403121561465357614652614056565b5b60006146618482850161452f565b91505092915050565b6000602082840312156146805761467f614056565b5b600061468e848285016142ac565b91505092915050565b6000819050919050565b6146aa81614697565b82525050565b60006020820190506146c560008301846146a1565b92915050565b6146d4816140e5565b81146146df57600080fd5b50565b6000813590506146f1816146cb565b92915050565b6000806040838503121561470e5761470d614056565b5b600061471c858286016142ac565b925050602061472d858286016146e2565b9150509250929050565b600067ffffffffffffffff8211156147525761475161430b565b5b61475b8261416a565b9050602081019050919050565b600061477b61477684614737565b61436b565b90508281526020810184848401111561479757614796614306565b5b6147a28482856143b7565b509392505050565b600082601f8301126147bf576147be614301565b5b81356147cf848260208601614768565b91505092915050565b600080600080608085870312156147f2576147f1614056565b5b6000614800878288016142ac565b9450506020614811878288016142ac565b9350506040614822878288016141f7565b925050606085013567ffffffffffffffff8111156148435761484261405b565b5b61484f878288016147aa565b91505092959194509250565b61486481614697565b811461486f57600080fd5b50565b6000813590506148818161485b565b92915050565b60006020828403121561489d5761489c614056565b5b60006148ab84828501614872565b91505092915050565b600080604083850312156148cb576148ca614056565b5b60006148d9858286016142ac565b92505060206148ea858286016142ac565b9150509250929050565b6000806020838503121561490b5761490a614056565b5b600083013567ffffffffffffffff8111156149295761492861405b565b5b61493585828601614573565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061498857607f821691505b6020821081141561499c5761499b614941565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149d8602083614126565b91506149e3826149a2565b602082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a44601f83614126565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b600081905092915050565b50565b6000614a95600083614a7a565b9150614aa082614a85565b600082019050919050565b6000614ab682614a88565b9150819050919050565b7f4d61782061697264726f70207265736572766520657863656564656421000000600082015250565b6000614af6601d83614126565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b66826141d6565b9150614b71836141d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ba657614ba5614b2c565b5b828201905092915050565b7f4d6178207075626c696320737570706c79206578636565646564210000000000600082015250565b6000614be7601b83614126565b9150614bf282614bb1565b602082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f416d6f756e74206f662045746865722073656e74206973206e6f7420636f727260008201527f6563742e00000000000000000000000000000000000000000000000000000000602082015250565b6000614ca8602483614126565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f596f752063616e206e6f74206d696e74203020546f6b656e7321000000000000600082015250565b6000614d14601a83614126565b9150614d1f82614cde565b602082019050919050565b60006020820190508181036000830152614d4381614d07565b9050919050565b60008160601b9050919050565b6000614d6282614d4a565b9050919050565b6000614d7482614d57565b9050919050565b614d8c614d8782614259565b614d69565b82525050565b6000614d9e8284614d7b565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614de3600d83614126565b9150614dee82614dad565b602082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f57686974656c697374206d696e7420686173206e6f7420737461727465642100600082015250565b6000614e4f601f83614126565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f416c6c20626f7865732061726520736f6c64206f757421000000000000000000600082015250565b6000614ebb601783614126565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f416c6c207061636b732061726520736f6c64206f757421000000000000000000600082015250565b6000614f27601783614126565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f536574207374617274696e6720696e6465782066697273742100000000000000600082015250565b6000614f93601983614126565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f53616c6520686173206e6f742073746172746564207965742e2053746179207460008201527f756e656421000000000000000000000000000000000000000000000000000000602082015250565b6000615025602583614126565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b60006150b7602383614126565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000615123601483614126565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615193826141d6565b915061519e836141d6565b9250826151ae576151ad615159565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151e681614970565b6151f081866151b9565b9450600182166000811461520b576001811461521c5761524f565b60ff1983168652818601935061524f565b615225856151c4565b60005b8381101561524757815481890152600182019150602081019050615228565b838801955050505b50505092915050565b60006152638261411b565b61526d81856151b9565b935061527d818560208601614137565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006152bf6005836151b9565b91506152ca82615289565b600582019050919050565b60006152e182856151d9565b91506152ed8284615258565b91506152f8826152b2565b91508190509392505050565b7f596f7520616c726561647920636c61696d656420796f75722061697264726f7060008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000615360602183614126565b915061536b82615304565b604082019050919050565b6000602082019050818103600083015261538f81615353565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153f2602683614126565b91506153fd82615396565b604082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b6000615433826141d6565b915061543e836141d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561547757615476614b2c565b5b828202905092915050565b600061548d826141d6565b9150615498836141d6565b9250826154a8576154a7615159565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006154da826154b3565b6154e481856154be565b93506154f4818560208601614137565b6154fd8161416a565b840191505092915050565b600060808201905061551d600083018761426b565b61552a602083018661426b565b615537604083018561447f565b818103606083015261554981846154cf565b905095945050505050565b6000815190506155638161408c565b92915050565b60006020828403121561557f5761557e614056565b5b600061558d84828501615554565b91505092915050565b60006155a1826141d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155d4576155d3614b2c565b5b600182019050919050565b60006155ea826141d6565b91506155f5836141d6565b92508282101561560857615607614b2c565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220df1a38b6c933822f8cd7a967bd1d880eba8e63a6aeea632123ef25141efbadcf64736f6c634300080b0033

Deployed Bytecode Sourcemap

59103:9063:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31090:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59417:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34203:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35706:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60091:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35269:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67217:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30339:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60214:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59952:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36571:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59892:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60020:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66333:171;;;:::i;:::-;;36812:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66044:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62198:1419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59347:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59459:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68050:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59844:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67508:101;;;;;;;;;;;;;:::i;:::-;;67350:150;;;;;;;;;;;;;:::i;:::-;;59615:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34011:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59692:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59380:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63625:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31459:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50561:103;;;;;;;;;;;;;:::i;:::-;;59745:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59797:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60126:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67847:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49910:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34372:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59496:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35982:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37068:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60170:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65263:710;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59536:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66967:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67617:88;;;;;;;;;;;;;:::i;:::-;;36340:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64117:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67713:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50819:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60253:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59653:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67093:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66512:447;;;:::i;:::-;;31090:305;31192:4;31244:25;31229:40;;;:11;:40;;;;:105;;;;31301:33;31286:48;;;:11;:48;;;;31229:105;:158;;;;31351:36;31375:11;31351:23;:36::i;:::-;31229:158;31209:178;;31090:305;;;:::o;59417:35::-;;;;;;;;;;;;;:::o;34203:100::-;34257:13;34290:5;34283:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34203:100;:::o;35706:204::-;35774:7;35799:16;35807:7;35799;:16::i;:::-;35794:64;;35824:34;;;;;;;;;;;;;;35794:64;35878:15;:24;35894:7;35878:24;;;;;;;;;;;;;;;;;;;;;35871:31;;35706:204;;;:::o;60091:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35269:371::-;35342:13;35358:24;35374:7;35358:15;:24::i;:::-;35342:40;;35403:5;35397:11;;:2;:11;;;35393:48;;;35417:24;;;;;;;;;;;;;;35393:48;35474:5;35458:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35484:37;35501:5;35508:12;:10;:12::i;:::-;35484:16;:37::i;:::-;35483:38;35458:63;35454:138;;;35545:35;;;;;;;;;;;;;;35454:138;35604:28;35613:2;35617:7;35626:5;35604:8;:28::i;:::-;35331:309;35269:371;;:::o;67217:125::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67319:15:::1;67303:13;:31;;;;;;;;;;;;:::i;:::-;;67217:125:::0;:::o;30339:303::-;30383:7;30608:15;:13;:15::i;:::-;30593:12;;30577:13;;:28;:46;30570:53;;30339:303;:::o;60214:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59952:61::-;60003:10;59952:61;:::o;36571:170::-;36705:28;36715:4;36721:2;36725:7;36705:9;:28::i;:::-;36571:170;;;:::o;59892:53::-;59935:10;59892:53;:::o;60020:62::-;60073:9;60020:62;:::o;66333:171::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1:::1;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;66399:12:::2;66425:10;66417:24;;66449:21;66417:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66398:77;;;66490:7;66482:16;;;::::0;::::2;;66391:113;24936:1:::1;25890:7;:22;;;;66333:171::o:0;36812:185::-;36950:39;36967:4;36973:2;36977:7;36950:39;;;;;;;;;;;;:16;:39::i;:::-;36812:185;;;:::o;66044:281::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1:::1;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;66201:16:::2;59787:3;61118:45;61131:13;;61146:16;61118:12;:45::i;:::-;:64;;61096:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;66235:38:::3;66245:9;66256:16;66235:9;:38::i;:::-;66301:16;66284:13;;:33;;;;;;;:::i;:::-;;;;;;;;25742:1:::2;24936::::1;25890:7;:22;;;;66044:281:::0;;:::o;62198:1419::-;24980:1;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;62417:16:::1;60793:224;;59734:4;60879:44;60892:12;;60906:16;60879:12;:44::i;:::-;:63;;60857:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;62461:16:::2;61267:384;;62479:4;62485:8;61558:9;61425:129;61452:16;61500;61487:29;;;;;;;;:::i;:::-;;:9;:29;;;;;;;;:::i;:::-;;;:52;;61527:12;61487:52;;;61519:5;61487:52;61425:8;:129::i;:::-;:142;;61403:228;;;;;;;;;;;;:::i;:::-;;;;;;;;;62525:16:::3;61659:146;;61753:1;61734:16;:20;61726:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62571:12:::4;;62585:17;;61920:144;61957:11;;61920:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61987:4;62037:10;62020:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62010:39;;;;;;61920:18;:144::i;:::-;61898:207;;;;;;;;;;;;:::i;:::-;;;;;;;;;62628:15:::5;;;;;;;;;;;62620:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62716:2;62696:16;:22;;;:50;;;;;62734:12;62722:24:::0;::::5;;;;;;;:::i;:::-;;:8;:24;;;;;;;;:::i;:::-;;;62696:50;62692:255;;;59835:2;62789:36;62802:19;:9;:17;:19::i;:::-;62823:1;62789:12;:36::i;:::-;:51;;62763:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;62914:21;:9;:19;:21::i;:::-;62692:255;62983:1;62963:16;:21;;;:50;;;;;63000:13;62988:25;;;;;;;;:::i;:::-;;:8;:25;;;;;;;;:::i;:::-;;;62963:50;62959:258;;;59883:2;63056:37;63069:20;:10;:18;:20::i;:::-;63091:1;63056:12;:37::i;:::-;:53;;63030:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;63183:22;:10;:20;:22::i;:::-;62959:258;63229:39;63239:10;63251:16;63229:39;;:9;:39::i;:::-;63295:16;63279:32;;:12;;:32;;;;;;;:::i;:::-;;;;;;;;63346:2;63326:16;:22;;;:50;;;;;63364:12;63352:24:::0;::::5;;;;;;;:::i;:::-;;:8;:24;;;;;;;;:::i;:::-;;;63326:50;63322:240;;;63406:19;:9;:17;:19::i;:::-;63398:28;;;;;;;;;;63322:240;;;63468:1;63448:16;:21;;;:50;;;;;63485:13;63473:25;;;;;;;;:::i;:::-;;:8;:25;;;;;;;;:::i;:::-;;;63448:50;63444:118;;;63529:20;:10;:18;:20::i;:::-;63520:30;;;;;;;;;;63444:118;63322:240;63594:14;:12;:14::i;:::-;63582:10;63577:32;;;;;;;;;;;;61796:1:::4;;;61642::::3;61008::::2;;;25742::::1;24936::::0;25890:7;:22;;;;62198:1419;;;;:::o;59347:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59459:28::-;;;;;;;;;;;;;:::o;68050:109::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68140:11:::1;68125:12;:26;;;;;;;;;;;;:::i;:::-;;68050:109:::0;:::o;59844:41::-;59883:2;59844:41;:::o;67508:101::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67586:15:::1;;;;;;;;;;;67585:16;67567:15;;:34;;;;;;;;;;;;;;;;;;67508:101::o:0;67350:150::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67430:1:::1;67412:14;;:19;;67404:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;67484:8;;;;;;;;;;;67483:9;67472:8;;:20;;;;;;;;;;;;;;;;;;67350:150::o:0;59615:31::-;;;;:::o;34011:125::-;34075:7;34102:21;34115:7;34102:12;:21::i;:::-;:26;;;34095:33;;34011:125;;;:::o;59692:46::-;59734:4;59692:46;:::o;59380:30::-;;;;;;;;;;;;;:::o;63625:484::-;24980:1;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;63749:16:::1;60793:224;;59734:4;60879:44;60892:12;;60906:16;60879:12;:44::i;:::-;:63;;60857:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;63793:16:::2;61267:384;;63811:5;63818:16:::0;61558:9:::2;61425:129;61452:16;61500;61487:29;;;;;;;;:::i;:::-;;:9;:29;;;;;;;;:::i;:::-;;;:52;;61527:12;61487:52;;;61519:5;61487:52;61425:8;:129::i;:::-;:142;;61403:228;;;;;;;;;;;;:::i;:::-;;;;;;;;;63866:16:::3;61659:146;;61753:1;61734:16;:20;61726:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63908:10:::4;;;;;;;;;;;63900:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;63971:39;63981:10;63993:16;63971:39;;:9;:39::i;:::-;64037:16;64021:32;;:12;;:32;;;;;;;:::i;:::-;;;;;;;;64086:14;:12;:14::i;:::-;64074:10;64069:32;;;;;;;;;;;;61642:1:::3;61008::::2;;;25742::::1;24936::::0;25890:7;:22;;;;63625:484;:::o;31459:206::-;31523:7;31564:1;31547:19;;:5;:19;;;31543:60;;;31575:28;;;;;;;;;;;;;;31543:60;31629:12;:19;31642:5;31629:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31621:36;;31614:43;;31459:206;;;:::o;50561:103::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50626:30:::1;50653:1;50626:18;:30::i;:::-;50561:103::o:0;59745:45::-;59787:3;59745:45;:::o;59797:40::-;59835:2;59797:40;:::o;60126:37::-;;;;:::o;67847:195::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67951:1:::1;67933:14;;:19;67925:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;68020:14;68003;:31;;;;67847:195:::0;:::o;49910:87::-;49956:7;49983:6;;;;;;;;;;;49976:13;;49910:87;:::o;34372:104::-;34428:13;34461:7;34454:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34372:104;:::o;59496:33::-;;;;;;;;;:::o;35982:287::-;36093:12;:10;:12::i;:::-;36081:24;;:8;:24;;;36077:54;;;36114:17;;;;;;;;;;;;;;36077:54;36189:8;36144:18;:32;36163:12;:10;:12::i;:::-;36144:32;;;;;;;;;;;;;;;:42;36177:8;36144:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36242:8;36213:48;;36228:12;:10;:12::i;:::-;36213:48;;;36252:8;36213:48;;;;;;:::i;:::-;;;;;;;;35982:287;;:::o;37068:369::-;37235:28;37245:4;37251:2;37255:7;37235:9;:28::i;:::-;37278:15;:2;:13;;;:15::i;:::-;:76;;;;;37298:56;37329:4;37335:2;37339:7;37348:5;37298:30;:56::i;:::-;37297:57;37278:76;37274:156;;;37378:40;;;;;;;;;;;;;;37274:156;37068:369;;;;:::o;60170:37::-;;;;:::o;65263:710::-;65374:13;65413:17;65421:8;65413:7;:17::i;:::-;65405:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;65484:5;65472:17;;:8;;;;;;;;;;;:17;;;65468:71;;;65513:14;65506:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65468:71;65551:19;59787:3;59734:4;65617:33;;;;:::i;:::-;65585:14;;65574:8;:25;;;;:::i;:::-;65573:78;;;;:::i;:::-;65551:100;;65713:1;65690:12;65684:26;;;;;:::i;:::-;;;:30;:281;;;;;;;;;;;;;;;;;65806:12;65845:22;:11;:20;:22::i;:::-;65763:161;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65684:281;65664:301;;;65263:710;;;;:::o;59536:34::-;;;;;;;;;:::o;66967:118::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67067:10:::1;67047:17;:30;;;;66967:118:::0;:::o;67617:88::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67687:10:::1;;;;;;;;;;;67686:11;67673:10;;:24;;;;;;;;;;;;;;;;;;67617:88::o:0;36340:164::-;36437:4;36461:18;:25;36480:5;36461:25;;;;;;;;;;;;;;;:35;36487:8;36461:35;;;;;;;;;;;;;;;;;;;;;;;;;36454:42;;36340:164;;;;:::o;64117:482::-;64213:12;;64227:17;;61920:144;61957:11;;61920:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61987:4;62037:10;62020:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62010:39;;;;;;61920:18;:144::i;:::-;61898:207;;;;;;;;;;;;:::i;:::-;;;;;;;;;64280:1:::1;59787:3;61118:45;61131:13;;61146:16;61118:12;:45::i;:::-;:64;;61096:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1:::2;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;64344:15:::3;:27;64360:10;64344:27;;;;;;;;;;;;;;;;;;;;;;;;;64343:28;64321:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;64445:24;64455:10;64467:1;64445:9;:24::i;:::-;64510:4;64480:15;:27;64496:10;64480:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;64542:1;64525:13;;:18;;;;;;;:::i;:::-;;;;;;;;64576:14;:12;:14::i;:::-;64564:10;64559:32;;;;;;;;;;;;24936:1:::2;25890:7;:22;;;;62116:1:::1;64117:482:::0;;;;;:::o;67713:126::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67816:15:::1;67799:14;:32;;;;;;;;;;;;:::i;:::-;;67713:126:::0;:::o;50819:201::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50928:1:::1;50908:22;;:8;:22;;;;50900:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50984:28;51003:8;50984:18;:28::i;:::-;50819:201:::0;:::o;60253:33::-;;;;:::o;59653:32::-;;;;:::o;67093:116::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67191:10:::1;67171:17;:30;;;;67093:116:::0;:::o;66512:447::-;50141:12;:10;:12::i;:::-;50130:23;;:7;:5;:7::i;:::-;:23;;;50122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1:::1;25578:7;;:19;;25570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24980:1;25711:7;:18;;;;66583:12:::2;66609:42;66601:56;;66694:3;66689:2;66665:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;66601:101;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66582:120;;;66717:7;66709:16;;;::::0;::::2;;66738:15;66780:1;66756:21;:25;;;;:::i;:::-;66738:43;;66808:42;66800:56;;:65;66857:7;66800:65;;;;;;;;;;;;;;;;;;;;;;;66792:74;;;::::0;::::2;;66893:42;66885:56;;:65;66942:7;66885:65;;;;;;;;;;;;;;;;;;;;;;;66877:74;;;::::0;::::2;;66574:385;;24936:1:::1;25890:7;:22;;;;66512:447::o:0;12816:157::-;12901:4;12940:25;12925:40;;;:11;:40;;;;12918:47;;12816:157;;;:::o;37692:187::-;37749:4;37792:7;37773:15;:13;:15::i;:::-;:26;;:53;;;;;37813:13;;37803:7;:23;37773:53;:98;;;;;37844:11;:20;37856:7;37844:20;;;;;;;;;;;:27;;;;;;;;;;;;37843:28;37773:98;37766:105;;37692:187;;;:::o;26606:98::-;26659:7;26686:10;26679:17;;26606:98;:::o;45862:196::-;46004:2;45977:15;:24;45993:7;45977:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46042:7;46038:2;46022:28;;46031:5;46022:28;;;;;;;;;;;;45862:196;;;:::o;30113:92::-;30169:7;30113:92;:::o;40805:2130::-;40920:35;40958:21;40971:7;40958:12;:21::i;:::-;40920:59;;41018:4;40996:26;;:13;:18;;;:26;;;40992:67;;41031:28;;;;;;;;;;;;;;40992:67;41072:22;41114:4;41098:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41135:36;41152:4;41158:12;:10;:12::i;:::-;41135:16;:36::i;:::-;41098:73;:126;;;;41212:12;:10;:12::i;:::-;41188:36;;:20;41200:7;41188:11;:20::i;:::-;:36;;;41098:126;41072:153;;41243:17;41238:66;;41269:35;;;;;;;;;;;;;;41238:66;41333:1;41319:16;;:2;:16;;;41315:52;;;41344:23;;;;;;;;;;;;;;41315:52;41380:43;41402:4;41408:2;41412:7;41421:1;41380:21;:43::i;:::-;41488:35;41505:1;41509:7;41518:4;41488:8;:35::i;:::-;41849:1;41819:12;:18;41832:4;41819:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41893:1;41865:12;:16;41878:2;41865:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41911:31;41945:11;:20;41957:7;41945:20;;;;;;;;;;;41911:54;;41996:2;41980:8;:13;;;:18;;;;;;;;;;;;;;;;;;42046:15;42013:8;:23;;;:49;;;;;;;;;;;;;;;;;;42314:19;42346:1;42336:7;:11;42314:33;;42362:31;42396:11;:24;42408:11;42396:24;;;;;;;;;;;42362:58;;42464:1;42439:27;;:8;:13;;;;;;;;;;;;:27;;;42435:384;;;42649:13;;42634:11;:28;42630:174;;42703:4;42687:8;:13;;;:20;;;;;;;;;;;;;;;;;;42756:13;:28;;;42730:8;:23;;;:54;;;;;;;;;;;;;;;;;;42630:174;42435:384;41794:1036;;;42866:7;42862:2;42847:27;;42856:4;42847:27;;;;;;;;;;;;42885:42;42906:4;42912:2;42916:7;42925:1;42885:20;:42::i;:::-;40909:2026;;40805:2130;;;:::o;54240:98::-;54298:7;54329:1;54325;:5;;;;:::i;:::-;54318:12;;54240:98;;;;:::o;37887:104::-;37956:27;37966:2;37970:8;37956:27;;;;;;;;;;;;:9;:27::i;:::-;37887:104;;:::o;64662:530::-;64779:7;64808:16;64804:381;;;64865:1;64845:16;:21;64841:258;;;59935:10;64887:23;;;;64841:258;64956:1;64936:16;:21;64932:167;;;60003:10;64978:31;;;;64932:167;60073:9;65050:33;;;;64804:381;59935:10;65138:16;:35;;;;:::i;:::-;65131:42;;64662:530;;;;;:::o;19578:190::-;19703:4;19756;19727:25;19740:5;19747:4;19727:12;:25::i;:::-;:33;19720:40;;19578:190;;;;;:::o;907:114::-;972:7;999;:14;;;992:21;;907:114;;;:::o;1029:127::-;1136:1;1118:7;:14;;;:19;;;;;;;;;;;1029:127;:::o;30735:283::-;30782:7;30984:15;:13;:15::i;:::-;30968:13;;:31;30961:38;;30735:283;:::o;32840:1109::-;32902:21;;:::i;:::-;32936:12;32951:7;32936:22;;33019:4;33000:15;:13;:15::i;:::-;:23;;:47;;;;;33034:13;;33027:4;:20;33000:47;32996:886;;;33068:31;33102:11;:17;33114:4;33102:17;;;;;;;;;;;33068:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33143:9;:16;;;33138:729;;33214:1;33188:28;;:9;:14;;;:28;;;33184:101;;33252:9;33245:16;;;;;;33184:101;33587:261;33594:4;33587:261;;;33627:6;;;;;;;;33672:11;:17;33684:4;33672:17;;;;;;;;;;;33660:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33746:1;33720:28;;:9;:14;;;:28;;;33716:109;;33788:9;33781:16;;;;;;33716:109;33587:261;;;33138:729;33049:833;32996:886;33910:31;;;;;;;;;;;;;;32840:1109;;;;:::o;51180:191::-;51254:16;51273:6;;;;;;;;;;;51254:25;;51299:8;51290:6;;:17;;;;;;;;;;;;;;;;;;51354:8;51323:40;;51344:8;51323:40;;;;;;;;;;;;51243:128;51180:191;:::o;2733:326::-;2793:4;3050:1;3028:7;:19;;;:23;3021:30;;2733:326;;;:::o;46550:667::-;46713:4;46750:2;46734:36;;;46771:12;:10;:12::i;:::-;46785:4;46791:7;46800:5;46734:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46730:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46985:1;46968:6;:13;:18;46964:235;;;47014:40;;;;;;;;;;;;;;46964:235;47157:6;47151:13;47142:6;47138:2;47134:15;47127:38;46730:480;46863:45;;;46853:55;;;:6;:55;;;;46846:62;;;46550:667;;;;;;:::o;21409:723::-;21465:13;21695:1;21686:5;:10;21682:53;;;21713:10;;;;;;;;;;;;;;;;;;;;;21682:53;21745:12;21760:5;21745:20;;21776:14;21801:78;21816:1;21808:4;:9;21801:78;;21834:8;;;;;:::i;:::-;;;;21865:2;21857:10;;;;;:::i;:::-;;;21801:78;;;21889:19;21921:6;21911:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21889:39;;21939:154;21955:1;21946:5;:10;21939:154;;21983:1;21973:11;;;;;:::i;:::-;;;22050:2;22042:5;:10;;;;:::i;:::-;22029:2;:24;;;;:::i;:::-;22016:39;;21999:6;22006;21999:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22079:2;22070:11;;;;;:::i;:::-;;;21939:154;;;22117:6;22103:21;;;;;21409:723;;;;:::o;47865:159::-;;;;;:::o;48683:158::-;;;;;:::o;38354:163::-;38477:32;38483:2;38487:8;38497:5;38504:4;38477:5;:32::i;:::-;38354:163;;;:::o;20130:675::-;20213:7;20233:20;20256:4;20233:27;;20276:9;20271:497;20295:5;:12;20291:1;:16;20271:497;;;20329:20;20352:5;20358:1;20352:8;;;;;;;;:::i;:::-;;;;;;;;20329:31;;20395:12;20379;:28;20375:382;;20522:42;20537:12;20551;20522:14;:42::i;:::-;20507:57;;20375:382;;;20699:42;20714:12;20728;20699:14;:42::i;:::-;20684:57;;20375:382;20314:454;20309:3;;;;;:::i;:::-;;;;20271:497;;;;20785:12;20778:19;;;20130:675;;;;:::o;38776:1775::-;38915:20;38938:13;;38915:36;;38980:1;38966:16;;:2;:16;;;38962:48;;;38991:19;;;;;;;;;;;;;;38962:48;39037:1;39025:8;:13;39021:44;;;39047:18;;;;;;;;;;;;;;39021:44;39078:61;39108:1;39112:2;39116:12;39130:8;39078:21;:61::i;:::-;39451:8;39416:12;:16;39429:2;39416:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39515:8;39475:12;:16;39488:2;39475:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39574:2;39541:11;:25;39553:12;39541:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39641:15;39591:11;:25;39603:12;39591:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39674:20;39697:12;39674:35;;39724:11;39753:8;39738:12;:23;39724:37;;39782:4;:23;;;;;39790:15;:2;:13;;;:15::i;:::-;39782:23;39778:641;;;39826:314;39882:12;39878:2;39857:38;;39874:1;39857:38;;;;;;;;;;;;39923:69;39962:1;39966:2;39970:14;;;;;;39986:5;39923:30;:69::i;:::-;39918:174;;40028:40;;;;;;;;;;;;;;39918:174;40135:3;40119:12;:19;;39826:314;;40221:12;40204:13;;:29;40200:43;;40235:8;;;40200:43;39778:641;;;40284:120;40340:14;;;;;;40336:2;40315:40;;40332:1;40315:40;;;;;;;;;;;;40399:3;40383:12;:19;;40284:120;;39778:641;40449:12;40433:13;:28;;;;39391:1082;;40483:60;40512:1;40516:2;40520:12;40534:8;40483:20;:60::i;:::-;38904:1647;38776:1775;;;;:::o;20813:224::-;20881:13;20944:1;20938:4;20931:15;20973:1;20967:4;20960:15;21014:4;21008;20998:21;20989:30;;20813:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:118::-;8573:7;8613:34;8606:5;8602:46;8591:57;;8536:118;;;:::o;8660:122::-;8733:24;8751:5;8733:24;:::i;:::-;8726:5;8723:35;8713:63;;8772:1;8769;8762:12;8713:63;8660:122;:::o;8788:139::-;8834:5;8872:6;8859:20;8850:29;;8888:33;8915:5;8888:33;:::i;:::-;8788:139;;;;:::o;8933:112::-;9019:1;9012:5;9009:12;8999:40;;9035:1;9032;9025:12;8999:40;8933:112;:::o;9051:165::-;9110:5;9148:6;9135:20;9126:29;;9164:46;9204:5;9164:46;:::i;:::-;9051:165;;;;:::o;9222:117::-;9331:1;9328;9321:12;9345:117;9454:1;9451;9444:12;9485:568;9558:8;9568:6;9618:3;9611:4;9603:6;9599:17;9595:27;9585:122;;9626:79;;:::i;:::-;9585:122;9739:6;9726:20;9716:30;;9769:18;9761:6;9758:30;9755:117;;;9791:79;;:::i;:::-;9755:117;9905:4;9897:6;9893:17;9881:29;;9959:3;9951:4;9943:6;9939:17;9929:8;9925:32;9922:41;9919:128;;;9966:79;;:::i;:::-;9919:128;9485:568;;;;;:::o;10059:875::-;10176:6;10184;10192;10200;10249:2;10237:9;10228:7;10224:23;10220:32;10217:119;;;10255:79;;:::i;:::-;10217:119;10375:1;10400:53;10445:7;10436:6;10425:9;10421:22;10400:53;:::i;:::-;10390:63;;10346:117;10502:2;10528:66;10586:7;10577:6;10566:9;10562:22;10528:66;:::i;:::-;10518:76;;10473:131;10671:2;10660:9;10656:18;10643:32;10702:18;10694:6;10691:30;10688:117;;;10724:79;;:::i;:::-;10688:117;10837:80;10909:7;10900:6;10889:9;10885:22;10837:80;:::i;:::-;10819:98;;;;10614:313;10059:875;;;;;;;:::o;10940:329::-;10999:6;11048:2;11036:9;11027:7;11023:23;11019:32;11016:119;;;11054:79;;:::i;:::-;11016:119;11174:1;11199:53;11244:7;11235:6;11224:9;11220:22;11199:53;:::i;:::-;11189:63;;11145:117;10940:329;;;;:::o;11275:::-;11334:6;11383:2;11371:9;11362:7;11358:23;11354:32;11351:119;;;11389:79;;:::i;:::-;11351:119;11509:1;11534:53;11579:7;11570:6;11559:9;11555:22;11534:53;:::i;:::-;11524:63;;11480:117;11275:329;;;;:::o;11610:77::-;11647:7;11676:5;11665:16;;11610:77;;;:::o;11693:118::-;11780:24;11798:5;11780:24;:::i;:::-;11775:3;11768:37;11693:118;;:::o;11817:222::-;11910:4;11948:2;11937:9;11933:18;11925:26;;11961:71;12029:1;12018:9;12014:17;12005:6;11961:71;:::i;:::-;11817:222;;;;:::o;12045:116::-;12115:21;12130:5;12115:21;:::i;:::-;12108:5;12105:32;12095:60;;12151:1;12148;12141:12;12095:60;12045:116;:::o;12167:133::-;12210:5;12248:6;12235:20;12226:29;;12264:30;12288:5;12264:30;:::i;:::-;12167:133;;;;:::o;12306:468::-;12371:6;12379;12428:2;12416:9;12407:7;12403:23;12399:32;12396:119;;;12434:79;;:::i;:::-;12396:119;12554:1;12579:53;12624:7;12615:6;12604:9;12600:22;12579:53;:::i;:::-;12569:63;;12525:117;12681:2;12707:50;12749:7;12740:6;12729:9;12725:22;12707:50;:::i;:::-;12697:60;;12652:115;12306:468;;;;;:::o;12780:307::-;12841:4;12931:18;12923:6;12920:30;12917:56;;;12953:18;;:::i;:::-;12917:56;12991:29;13013:6;12991:29;:::i;:::-;12983:37;;13075:4;13069;13065:15;13057:23;;12780:307;;;:::o;13093:410::-;13170:5;13195:65;13211:48;13252:6;13211:48;:::i;:::-;13195:65;:::i;:::-;13186:74;;13283:6;13276:5;13269:21;13321:4;13314:5;13310:16;13359:3;13350:6;13345:3;13341:16;13338:25;13335:112;;;13366:79;;:::i;:::-;13335:112;13456:41;13490:6;13485:3;13480;13456:41;:::i;:::-;13176:327;13093:410;;;;;:::o;13522:338::-;13577:5;13626:3;13619:4;13611:6;13607:17;13603:27;13593:122;;13634:79;;:::i;:::-;13593:122;13751:6;13738:20;13776:78;13850:3;13842:6;13835:4;13827:6;13823:17;13776:78;:::i;:::-;13767:87;;13583:277;13522:338;;;;:::o;13866:943::-;13961:6;13969;13977;13985;14034:3;14022:9;14013:7;14009:23;14005:33;14002:120;;;14041:79;;:::i;:::-;14002:120;14161:1;14186:53;14231:7;14222:6;14211:9;14207:22;14186:53;:::i;:::-;14176:63;;14132:117;14288:2;14314:53;14359:7;14350:6;14339:9;14335:22;14314:53;:::i;:::-;14304:63;;14259:118;14416:2;14442:53;14487:7;14478:6;14467:9;14463:22;14442:53;:::i;:::-;14432:63;;14387:118;14572:2;14561:9;14557:18;14544:32;14603:18;14595:6;14592:30;14589:117;;;14625:79;;:::i;:::-;14589:117;14730:62;14784:7;14775:6;14764:9;14760:22;14730:62;:::i;:::-;14720:72;;14515:287;13866:943;;;;;;;:::o;14815:122::-;14888:24;14906:5;14888:24;:::i;:::-;14881:5;14878:35;14868:63;;14927:1;14924;14917:12;14868:63;14815:122;:::o;14943:139::-;14989:5;15027:6;15014:20;15005:29;;15043:33;15070:5;15043:33;:::i;:::-;14943:139;;;;:::o;15088:329::-;15147:6;15196:2;15184:9;15175:7;15171:23;15167:32;15164:119;;;15202:79;;:::i;:::-;15164:119;15322:1;15347:53;15392:7;15383:6;15372:9;15368:22;15347:53;:::i;:::-;15337:63;;15293:117;15088:329;;;;:::o;15423:474::-;15491:6;15499;15548:2;15536:9;15527:7;15523:23;15519:32;15516:119;;;15554:79;;:::i;:::-;15516:119;15674:1;15699:53;15744:7;15735:6;15724:9;15720:22;15699:53;:::i;:::-;15689:63;;15645:117;15801:2;15827:53;15872:7;15863:6;15852:9;15848:22;15827:53;:::i;:::-;15817:63;;15772:118;15423:474;;;;;:::o;15903:559::-;15989:6;15997;16046:2;16034:9;16025:7;16021:23;16017:32;16014:119;;;16052:79;;:::i;:::-;16014:119;16200:1;16189:9;16185:17;16172:31;16230:18;16222:6;16219:30;16216:117;;;16252:79;;:::i;:::-;16216:117;16365:80;16437:7;16428:6;16417:9;16413:22;16365:80;:::i;:::-;16347:98;;;;16143:312;15903:559;;;;;:::o;16468:180::-;16516:77;16513:1;16506:88;16613:4;16610:1;16603:15;16637:4;16634:1;16627:15;16654:320;16698:6;16735:1;16729:4;16725:12;16715:22;;16782:1;16776:4;16772:12;16803:18;16793:81;;16859:4;16851:6;16847:17;16837:27;;16793:81;16921:2;16913:6;16910:14;16890:18;16887:38;16884:84;;;16940:18;;:::i;:::-;16884:84;16705:269;16654:320;;;:::o;16980:182::-;17120:34;17116:1;17108:6;17104:14;17097:58;16980:182;:::o;17168:366::-;17310:3;17331:67;17395:2;17390:3;17331:67;:::i;:::-;17324:74;;17407:93;17496:3;17407:93;:::i;:::-;17525:2;17520:3;17516:12;17509:19;;17168:366;;;:::o;17540:419::-;17706:4;17744:2;17733:9;17729:18;17721:26;;17793:9;17787:4;17783:20;17779:1;17768:9;17764:17;17757:47;17821:131;17947:4;17821:131;:::i;:::-;17813:139;;17540:419;;;:::o;17965:181::-;18105:33;18101:1;18093:6;18089:14;18082:57;17965:181;:::o;18152:366::-;18294:3;18315:67;18379:2;18374:3;18315:67;:::i;:::-;18308:74;;18391:93;18480:3;18391:93;:::i;:::-;18509:2;18504:3;18500:12;18493:19;;18152:366;;;:::o;18524:419::-;18690:4;18728:2;18717:9;18713:18;18705:26;;18777:9;18771:4;18767:20;18763:1;18752:9;18748:17;18741:47;18805:131;18931:4;18805:131;:::i;:::-;18797:139;;18524:419;;;:::o;18949:147::-;19050:11;19087:3;19072:18;;18949:147;;;;:::o;19102:114::-;;:::o;19222:398::-;19381:3;19402:83;19483:1;19478:3;19402:83;:::i;:::-;19395:90;;19494:93;19583:3;19494:93;:::i;:::-;19612:1;19607:3;19603:11;19596:18;;19222:398;;;:::o;19626:379::-;19810:3;19832:147;19975:3;19832:147;:::i;:::-;19825:154;;19996:3;19989:10;;19626:379;;;:::o;20011:179::-;20151:31;20147:1;20139:6;20135:14;20128:55;20011:179;:::o;20196:366::-;20338:3;20359:67;20423:2;20418:3;20359:67;:::i;:::-;20352:74;;20435:93;20524:3;20435:93;:::i;:::-;20553:2;20548:3;20544:12;20537:19;;20196:366;;;:::o;20568:419::-;20734:4;20772:2;20761:9;20757:18;20749:26;;20821:9;20815:4;20811:20;20807:1;20796:9;20792:17;20785:47;20849:131;20975:4;20849:131;:::i;:::-;20841:139;;20568:419;;;:::o;20993:180::-;21041:77;21038:1;21031:88;21138:4;21135:1;21128:15;21162:4;21159:1;21152:15;21179:305;21219:3;21238:20;21256:1;21238:20;:::i;:::-;21233:25;;21272:20;21290:1;21272:20;:::i;:::-;21267:25;;21426:1;21358:66;21354:74;21351:1;21348:81;21345:107;;;21432:18;;:::i;:::-;21345:107;21476:1;21473;21469:9;21462:16;;21179:305;;;;:::o;21490:177::-;21630:29;21626:1;21618:6;21614:14;21607:53;21490:177;:::o;21673:366::-;21815:3;21836:67;21900:2;21895:3;21836:67;:::i;:::-;21829:74;;21912:93;22001:3;21912:93;:::i;:::-;22030:2;22025:3;22021:12;22014:19;;21673:366;;;:::o;22045:419::-;22211:4;22249:2;22238:9;22234:18;22226:26;;22298:9;22292:4;22288:20;22284:1;22273:9;22269:17;22262:47;22326:131;22452:4;22326:131;:::i;:::-;22318:139;;22045:419;;;:::o;22470:180::-;22518:77;22515:1;22508:88;22615:4;22612:1;22605:15;22639:4;22636:1;22629:15;22656:223;22796:34;22792:1;22784:6;22780:14;22773:58;22865:6;22860:2;22852:6;22848:15;22841:31;22656:223;:::o;22885:366::-;23027:3;23048:67;23112:2;23107:3;23048:67;:::i;:::-;23041:74;;23124:93;23213:3;23124:93;:::i;:::-;23242:2;23237:3;23233:12;23226:19;;22885:366;;;:::o;23257:419::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:131;23664:4;23538:131;:::i;:::-;23530:139;;23257:419;;;:::o;23682:176::-;23822:28;23818:1;23810:6;23806:14;23799:52;23682:176;:::o;23864:366::-;24006:3;24027:67;24091:2;24086:3;24027:67;:::i;:::-;24020:74;;24103:93;24192:3;24103:93;:::i;:::-;24221:2;24216:3;24212:12;24205:19;;23864:366;;;:::o;24236:419::-;24402:4;24440:2;24429:9;24425:18;24417:26;;24489:9;24483:4;24479:20;24475:1;24464:9;24460:17;24453:47;24517:131;24643:4;24517:131;:::i;:::-;24509:139;;24236:419;;;:::o;24661:94::-;24694:8;24742:5;24738:2;24734:14;24713:35;;24661:94;;;:::o;24761:::-;24800:7;24829:20;24843:5;24829:20;:::i;:::-;24818:31;;24761:94;;;:::o;24861:100::-;24900:7;24929:26;24949:5;24929:26;:::i;:::-;24918:37;;24861:100;;;:::o;24967:157::-;25072:45;25092:24;25110:5;25092:24;:::i;:::-;25072:45;:::i;:::-;25067:3;25060:58;24967:157;;:::o;25130:256::-;25242:3;25257:75;25328:3;25319:6;25257:75;:::i;:::-;25357:2;25352:3;25348:12;25341:19;;25377:3;25370:10;;25130:256;;;;:::o;25392:163::-;25532:15;25528:1;25520:6;25516:14;25509:39;25392:163;:::o;25561:366::-;25703:3;25724:67;25788:2;25783:3;25724:67;:::i;:::-;25717:74;;25800:93;25889:3;25800:93;:::i;:::-;25918:2;25913:3;25909:12;25902:19;;25561:366;;;:::o;25933:419::-;26099:4;26137:2;26126:9;26122:18;26114:26;;26186:9;26180:4;26176:20;26172:1;26161:9;26157:17;26150:47;26214:131;26340:4;26214:131;:::i;:::-;26206:139;;25933:419;;;:::o;26358:181::-;26498:33;26494:1;26486:6;26482:14;26475:57;26358:181;:::o;26545:366::-;26687:3;26708:67;26772:2;26767:3;26708:67;:::i;:::-;26701:74;;26784:93;26873:3;26784:93;:::i;:::-;26902:2;26897:3;26893:12;26886:19;;26545:366;;;:::o;26917:419::-;27083:4;27121:2;27110:9;27106:18;27098:26;;27170:9;27164:4;27160:20;27156:1;27145:9;27141:17;27134:47;27198:131;27324:4;27198:131;:::i;:::-;27190:139;;26917:419;;;:::o;27342:173::-;27482:25;27478:1;27470:6;27466:14;27459:49;27342:173;:::o;27521:366::-;27663:3;27684:67;27748:2;27743:3;27684:67;:::i;:::-;27677:74;;27760:93;27849:3;27760:93;:::i;:::-;27878:2;27873:3;27869:12;27862:19;;27521:366;;;:::o;27893:419::-;28059:4;28097:2;28086:9;28082:18;28074:26;;28146:9;28140:4;28136:20;28132:1;28121:9;28117:17;28110:47;28174:131;28300:4;28174:131;:::i;:::-;28166:139;;27893:419;;;:::o;28318:173::-;28458:25;28454:1;28446:6;28442:14;28435:49;28318:173;:::o;28497:366::-;28639:3;28660:67;28724:2;28719:3;28660:67;:::i;:::-;28653:74;;28736:93;28825:3;28736:93;:::i;:::-;28854:2;28849:3;28845:12;28838:19;;28497:366;;;:::o;28869:419::-;29035:4;29073:2;29062:9;29058:18;29050:26;;29122:9;29116:4;29112:20;29108:1;29097:9;29093:17;29086:47;29150:131;29276:4;29150:131;:::i;:::-;29142:139;;28869:419;;;:::o;29294:175::-;29434:27;29430:1;29422:6;29418:14;29411:51;29294:175;:::o;29475:366::-;29617:3;29638:67;29702:2;29697:3;29638:67;:::i;:::-;29631:74;;29714:93;29803:3;29714:93;:::i;:::-;29832:2;29827:3;29823:12;29816:19;;29475:366;;;:::o;29847:419::-;30013:4;30051:2;30040:9;30036:18;30028:26;;30100:9;30094:4;30090:20;30086:1;30075:9;30071:17;30064:47;30128:131;30254:4;30128:131;:::i;:::-;30120:139;;29847:419;;;:::o;30272:224::-;30412:34;30408:1;30400:6;30396:14;30389:58;30481:7;30476:2;30468:6;30464:15;30457:32;30272:224;:::o;30502:366::-;30644:3;30665:67;30729:2;30724:3;30665:67;:::i;:::-;30658:74;;30741:93;30830:3;30741:93;:::i;:::-;30859:2;30854:3;30850:12;30843:19;;30502:366;;;:::o;30874:419::-;31040:4;31078:2;31067:9;31063:18;31055:26;;31127:9;31121:4;31117:20;31113:1;31102:9;31098:17;31091:47;31155:131;31281:4;31155:131;:::i;:::-;31147:139;;30874:419;;;:::o;31299:222::-;31439:34;31435:1;31427:6;31423:14;31416:58;31508:5;31503:2;31495:6;31491:15;31484:30;31299:222;:::o;31527:366::-;31669:3;31690:67;31754:2;31749:3;31690:67;:::i;:::-;31683:74;;31766:93;31855:3;31766:93;:::i;:::-;31884:2;31879:3;31875:12;31868:19;;31527:366;;;:::o;31899:419::-;32065:4;32103:2;32092:9;32088:18;32080:26;;32152:9;32146:4;32142:20;32138:1;32127:9;32123:17;32116:47;32180:131;32306:4;32180:131;:::i;:::-;32172:139;;31899:419;;;:::o;32324:170::-;32464:22;32460:1;32452:6;32448:14;32441:46;32324:170;:::o;32500:366::-;32642:3;32663:67;32727:2;32722:3;32663:67;:::i;:::-;32656:74;;32739:93;32828:3;32739:93;:::i;:::-;32857:2;32852:3;32848:12;32841:19;;32500:366;;;:::o;32872:419::-;33038:4;33076:2;33065:9;33061:18;33053:26;;33125:9;33119:4;33115:20;33111:1;33100:9;33096:17;33089:47;33153:131;33279:4;33153:131;:::i;:::-;33145:139;;32872:419;;;:::o;33297:180::-;33345:77;33342:1;33335:88;33442:4;33439:1;33432:15;33466:4;33463:1;33456:15;33483:176;33515:1;33532:20;33550:1;33532:20;:::i;:::-;33527:25;;33566:20;33584:1;33566:20;:::i;:::-;33561:25;;33605:1;33595:35;;33610:18;;:::i;:::-;33595:35;33651:1;33648;33644:9;33639:14;;33483:176;;;;:::o;33665:148::-;33767:11;33804:3;33789:18;;33665:148;;;;:::o;33819:141::-;33868:4;33891:3;33883:11;;33914:3;33911:1;33904:14;33948:4;33945:1;33935:18;33927:26;;33819:141;;;:::o;33990:845::-;34093:3;34130:5;34124:12;34159:36;34185:9;34159:36;:::i;:::-;34211:89;34293:6;34288:3;34211:89;:::i;:::-;34204:96;;34331:1;34320:9;34316:17;34347:1;34342:137;;;;34493:1;34488:341;;;;34309:520;;34342:137;34426:4;34422:9;34411;34407:25;34402:3;34395:38;34462:6;34457:3;34453:16;34446:23;;34342:137;;34488:341;34555:38;34587:5;34555:38;:::i;:::-;34615:1;34629:154;34643:6;34640:1;34637:13;34629:154;;;34717:7;34711:14;34707:1;34702:3;34698:11;34691:35;34767:1;34758:7;34754:15;34743:26;;34665:4;34662:1;34658:12;34653:17;;34629:154;;;34812:6;34807:3;34803:16;34796:23;;34495:334;;34309:520;;34097:738;;33990:845;;;;:::o;34841:377::-;34947:3;34975:39;35008:5;34975:39;:::i;:::-;35030:89;35112:6;35107:3;35030:89;:::i;:::-;35023:96;;35128:52;35173:6;35168:3;35161:4;35154:5;35150:16;35128:52;:::i;:::-;35205:6;35200:3;35196:16;35189:23;;34951:267;34841:377;;;;:::o;35224:155::-;35364:7;35360:1;35352:6;35348:14;35341:31;35224:155;:::o;35385:400::-;35545:3;35566:84;35648:1;35643:3;35566:84;:::i;:::-;35559:91;;35659:93;35748:3;35659:93;:::i;:::-;35777:1;35772:3;35768:11;35761:18;;35385:400;;;:::o;35791:695::-;36069:3;36091:92;36179:3;36170:6;36091:92;:::i;:::-;36084:99;;36200:95;36291:3;36282:6;36200:95;:::i;:::-;36193:102;;36312:148;36456:3;36312:148;:::i;:::-;36305:155;;36477:3;36470:10;;35791:695;;;;;:::o;36492:220::-;36632:34;36628:1;36620:6;36616:14;36609:58;36701:3;36696:2;36688:6;36684:15;36677:28;36492:220;:::o;36718:366::-;36860:3;36881:67;36945:2;36940:3;36881:67;:::i;:::-;36874:74;;36957:93;37046:3;36957:93;:::i;:::-;37075:2;37070:3;37066:12;37059:19;;36718:366;;;:::o;37090:419::-;37256:4;37294:2;37283:9;37279:18;37271:26;;37343:9;37337:4;37333:20;37329:1;37318:9;37314:17;37307:47;37371:131;37497:4;37371:131;:::i;:::-;37363:139;;37090:419;;;:::o;37515:225::-;37655:34;37651:1;37643:6;37639:14;37632:58;37724:8;37719:2;37711:6;37707:15;37700:33;37515:225;:::o;37746:366::-;37888:3;37909:67;37973:2;37968:3;37909:67;:::i;:::-;37902:74;;37985:93;38074:3;37985:93;:::i;:::-;38103:2;38098:3;38094:12;38087:19;;37746:366;;;:::o;38118:419::-;38284:4;38322:2;38311:9;38307:18;38299:26;;38371:9;38365:4;38361:20;38357:1;38346:9;38342:17;38335:47;38399:131;38525:4;38399:131;:::i;:::-;38391:139;;38118:419;;;:::o;38543:348::-;38583:7;38606:20;38624:1;38606:20;:::i;:::-;38601:25;;38640:20;38658:1;38640:20;:::i;:::-;38635:25;;38828:1;38760:66;38756:74;38753:1;38750:81;38745:1;38738:9;38731:17;38727:105;38724:131;;;38835:18;;:::i;:::-;38724:131;38883:1;38880;38876:9;38865:20;;38543:348;;;;:::o;38897:185::-;38937:1;38954:20;38972:1;38954:20;:::i;:::-;38949:25;;38988:20;39006:1;38988:20;:::i;:::-;38983:25;;39027:1;39017:35;;39032:18;;:::i;:::-;39017:35;39074:1;39071;39067:9;39062:14;;38897:185;;;;:::o;39088:98::-;39139:6;39173:5;39167:12;39157:22;;39088:98;;;:::o;39192:168::-;39275:11;39309:6;39304:3;39297:19;39349:4;39344:3;39340:14;39325:29;;39192:168;;;;:::o;39366:360::-;39452:3;39480:38;39512:5;39480:38;:::i;:::-;39534:70;39597:6;39592:3;39534:70;:::i;:::-;39527:77;;39613:52;39658:6;39653:3;39646:4;39639:5;39635:16;39613:52;:::i;:::-;39690:29;39712:6;39690:29;:::i;:::-;39685:3;39681:39;39674:46;;39456:270;39366:360;;;;:::o;39732:640::-;39927:4;39965:3;39954:9;39950:19;39942:27;;39979:71;40047:1;40036:9;40032:17;40023:6;39979:71;:::i;:::-;40060:72;40128:2;40117:9;40113:18;40104:6;40060:72;:::i;:::-;40142;40210:2;40199:9;40195:18;40186:6;40142:72;:::i;:::-;40261:9;40255:4;40251:20;40246:2;40235:9;40231:18;40224:48;40289:76;40360:4;40351:6;40289:76;:::i;:::-;40281:84;;39732:640;;;;;;;:::o;40378:141::-;40434:5;40465:6;40459:13;40450:22;;40481:32;40507:5;40481:32;:::i;:::-;40378:141;;;;:::o;40525:349::-;40594:6;40643:2;40631:9;40622:7;40618:23;40614:32;40611:119;;;40649:79;;:::i;:::-;40611:119;40769:1;40794:63;40849:7;40840:6;40829:9;40825:22;40794:63;:::i;:::-;40784:73;;40740:127;40525:349;;;;:::o;40880:233::-;40919:3;40942:24;40960:5;40942:24;:::i;:::-;40933:33;;40988:66;40981:5;40978:77;40975:103;;;41058:18;;:::i;:::-;40975:103;41105:1;41098:5;41094:13;41087:20;;40880:233;;;:::o;41119:191::-;41159:4;41179:20;41197:1;41179:20;:::i;:::-;41174:25;;41213:20;41231:1;41213:20;:::i;:::-;41208:25;;41252:1;41249;41246:8;41243:34;;;41257:18;;:::i;:::-;41243:34;41302:1;41299;41295:9;41287:17;;41119:191;;;;:::o;41316:180::-;41364:77;41361:1;41354:88;41461:4;41458:1;41451:15;41485:4;41482:1;41475:15

Swarm Source

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