ETH Price: $3,377.08 (-1.95%)
Gas: 2 Gwei

Token

Mecha Cat Crew (MCC)
 

Overview

Max Total Supply

4,444 MCC

Holders

1,731

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
inthearenatryingthings.eth
Balance
4 MCC
0xb6d19afe6de6c1ab49b964e202ebbf6b8e590a33
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:
MechaCatCrew

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-04
*/

// File: contracts/common/meta-transactions/ContextMixin.sol



pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

// File: @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/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: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/MechaCatCrew.sol

//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.9;







contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract MechaCatCrew is ERC721, ContextMixin, Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using Strings for uint256;
    using Counters for Counters.Counter;

    mapping(address => uint256) private _tickets;
    uint256 public totalUpload = 0;
    string[4] private phases = ["ticket", "pre-mint", "mint", "end"];
    uint256 private phaseIndex = 0;

    Counters.Counter private _nextTokenId;
    uint256 public maxMintPerTime;
    uint256 public maxTokens;
    uint256 private reserved;
    string private _tokenBaseURI;
    string public image;
    bool public paused;

    address proxyRegistryAddress;

    event Mint(
        address indexed from,
        uint256 indexed id
    );

    struct TokenInfo {
        string name;
        string symbol;
        string baseURI;
        uint256 maxMintPerTime;
        uint256 maxTokens;
        uint256 reserved;
        string logo;
    }

    constructor(
        TokenInfo memory _t,
        address _proxyRegistryAddress
    ) ERC721(_t.name, _t.symbol) {
        _tokenBaseURI = _t.baseURI;
        maxMintPerTime = _t.maxMintPerTime;
        maxTokens = _t.maxTokens;
        reserved = _t.reserved;
        image = _t.logo;
        _nextTokenId._value = _t.reserved + 1;
        proxyRegistryAddress = _proxyRegistryAddress;
        paused = false;
    }

    function currentPhase() public view returns (string memory) {
        return phases[phaseIndex];
    }

    function uploadTickets(address[] memory recipients, uint256[] memory tickets) public onlyOwner {
        require(phaseIndex == 0, "error phase");
        require(recipients.length == tickets.length, "different length");
        require(recipients.length > 0, "no recipients");

        for (uint256 i = 0; i < recipients.length; i++) {
            _tickets[recipients[i]] = tickets[i];
        }

        totalUpload = totalUpload + recipients.length;
    }

    function ticketsOf() public view returns (uint256, uint256) {
        uint256 balance = balanceOf(_msgSender());
        uint256 ticket = _tickets[_msgSender()];
        return (ticket, balance);
    }

    function totalSupply() public view returns (uint256) {
        return _nextTokenId.current() - 1;
    }

    function canMint() public view returns (uint256, uint256, uint256) {
        return (maxTokens, totalSupply(), maxMintPerTime);
    }

    function mint(uint256 mintCount) public payable nonReentrant {
        require(phaseIndex == 1 || phaseIndex == 2, "error phase");
        require(!paused, "paused");
        require(maxTokens >= mintCount + totalSupply(), "not enough tokens");
        require(mintCount <= maxMintPerTime, "exceed max mint per time");

        address account = _msgSender();

        if (phaseIndex == 1) {
            uint256 ticket = _tickets[account];
            uint256 balance = balanceOf(account);
            require(mintCount + balance <= ticket, "not enough tickets");
        }

        for (uint256 i=0; i < mintCount; i++) {
            uint256 tokenId = _nextTokenId.current();
            _safeMint(account, tokenId);
            emit Mint(account, tokenId);
            _nextTokenId.increment();
        }
    }

    function sendReserved(address[] memory recipients, uint256[] memory ids) public onlyOwner {
        require(recipients.length == ids.length, "different length");
        require(recipients.length > 0, "no recipients");

        bool allReserved = true;
        for (uint256 i = 0; i < ids.length; i ++) {
            if (ids[i] < 1) {
                allReserved = false;
            }
            if (ids[i] > reserved) {
                allReserved = false;
            }
        }
        require(allReserved, "only reserved");

        for (uint256 i = 0; i < ids.length; i ++) {
            _safeMint(recipients[i], ids[i]);
            emit Mint(recipients[i], ids[i]);
        }
    }

    function giveAway(address[] memory recipients, uint256[] memory counts) public onlyOwner {
        require(phaseIndex == 3, "error phase");
        require(recipients.length == counts.length, "different length");
        require(recipients.length > 0, "no recipients");

        uint256 total = 0;
        for (uint256 i = 0; i < counts.length; i ++) {
            total = total + counts[i];
        }

        require(maxTokens >= total + totalSupply(), "not enough tokens");

        for (uint256 i = 0; i < recipients.length; i ++) {
            for (uint256 j = 0; j < counts[i]; j ++) {
                uint256 tokenId = _nextTokenId.current();
                _safeMint(recipients[i], tokenId);
                emit Mint(recipients[i], tokenId);
                _nextTokenId.increment();
            }
        }
    }

    function setNextPhase(uint256 nextPhase) public onlyOwner {
        require(nextPhase < 4, "error phase");
        require(nextPhase == phaseIndex + 1, "error phase");
        phaseIndex = phaseIndex + 1;
    }

    function setPaused(bool p) public onlyOwner {
        require(paused != p, "error value");
        paused = p;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "not exists");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString(), ".json"));
    }

    function isApprovedForAll(address owner, address operator) override public view returns (bool) {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function _msgSender() internal override view returns (address sender) {
        return ContextMixin.msgSender();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"uint256","name":"maxMintPerTime","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"},{"internalType":"uint256","name":"reserved","type":"uint256"},{"internalType":"string","name":"logo","type":"string"}],"internalType":"struct MechaCatCrew.TokenInfo","name":"_t","type":"tuple"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"image","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"sendReserved","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":"uint256","name":"nextPhase","type":"uint256"}],"name":"setNextPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"p","type":"bool"}],"name":"setPaused","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":"ticketsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUpload","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tickets","type":"uint256[]"}],"name":"uploadTickets","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060095560405180608001604052806040518060400160405280600681526020017f7469636b6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7072652d6d696e7400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d696e740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f656e640000000000000000000000000000000000000000000000000000000000815250815250600a906004620001109291906200041f565b506000600e553480156200012357600080fd5b506040516200519138038062005191833981810160405281019062000149919062000921565b8160000151826020015181600090805190602001906200016b92919062000479565b5080600190805190602001906200018492919062000479565b505050620001a76200019b6200028a60201b60201c565b620002a660201b60201c565b6001600781905550816040015160139080519060200190620001cb92919062000479565b50816060015160108190555081608001516011819055508160a001516012819055508160c00151601490805190602001906200020992919062000479565b5060018260a001516200021d9190620009b6565b600f6000018190555080601560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601560006101000a81548160ff021916908315150217905550505062000a78565b6000620002a16200036c60201b62001ed71760201c565b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200041857600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506200041c565b3390505b90565b826004810192821562000466579160200282015b82811115620004655782518290805190602001906200045492919062000479565b509160200191906001019062000433565b5b5090506200047591906200050a565b5090565b828054620004879062000a42565b90600052602060002090601f016020900481019282620004ab5760008555620004f7565b82601f10620004c657805160ff1916838001178555620004f7565b82800160010185558215620004f7579182015b82811115620004f6578251825591602001919060010190620004d9565b5b50905062000506919062000532565b5090565b5b808211156200052e576000818162000524919062000551565b506001016200050b565b5090565b5b808211156200054d57600081600090555060010162000533565b5090565b5080546200055f9062000a42565b6000825580601f1062000573575062000594565b601f01602090049060005260206000209081019062000593919062000532565b5b50565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005fb82620005b0565b810181811067ffffffffffffffff821117156200061d576200061c620005c1565b5b80604052505050565b60006200063262000597565b9050620006408282620005f0565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115620006725762000671620005c1565b5b6200067d82620005b0565b9050602081019050919050565b60005b83811015620006aa5780820151818401526020810190506200068d565b83811115620006ba576000848401525b50505050565b6000620006d7620006d18462000654565b62000626565b905082815260208101848484011115620006f657620006f56200064f565b5b620007038482856200068a565b509392505050565b600082601f8301126200072357620007226200064a565b5b815162000735848260208601620006c0565b91505092915050565b6000819050919050565b62000753816200073e565b81146200075f57600080fd5b50565b600081519050620007738162000748565b92915050565b600060e08284031215620007925762000791620005ab565b5b6200079e60e062000626565b9050600082015167ffffffffffffffff811115620007c157620007c062000645565b5b620007cf848285016200070b565b600083015250602082015167ffffffffffffffff811115620007f657620007f562000645565b5b62000804848285016200070b565b602083015250604082015167ffffffffffffffff8111156200082b576200082a62000645565b5b62000839848285016200070b565b60408301525060606200084f8482850162000762565b6060830152506080620008658482850162000762565b60808301525060a06200087b8482850162000762565b60a08301525060c082015167ffffffffffffffff811115620008a257620008a162000645565b5b620008b0848285016200070b565b60c08301525092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008e982620008bc565b9050919050565b620008fb81620008dc565b81146200090757600080fd5b50565b6000815190506200091b81620008f0565b92915050565b600080604083850312156200093b576200093a620005a1565b5b600083015167ffffffffffffffff8111156200095c576200095b620005a6565b5b6200096a8582860162000779565b92505060206200097d858286016200090a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620009c3826200073e565b9150620009d0836200073e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a085762000a0762000987565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a5b57607f821691505b6020821081141562000a725762000a7162000a13565b5b50919050565b6147098062000a886000396000f3fe6080604052600436106101d85760003560e01c80636b0944af11610102578063b59a926d11610095578063e831574211610064578063e83157421461068c578063e985e9c5146106b7578063f2fde38b146106f4578063f3ccaac01461071d576101d8565b8063b59a926d146105ce578063b88d4fde146105f9578063beb9716d14610622578063c87b56dd1461064f576101d8565b806395d89b41116100d157806395d89b4114610535578063a0712d6814610560578063a22cb4651461057c578063a5cc9e9c146105a5576101d8565b80636b0944af1461048d57806370a08231146104b6578063715018a6146104f35780638da5cb5b1461050a576101d8565b806322a2eced1161017a5780635836515d116101495780635836515d146103d157806358a3b9f2146103fa5780635c975abb146104255780636352211e14610450576101d8565b806322a2eced1461032a57806323b872dd1461035357806332ef96321461037c57806342842e0e146103a8576101d8565b8063081812fc116101b6578063081812fc14610270578063095ea7b3146102ad57806316c38b3c146102d657806318160ddd146102ff576101d8565b806301ffc9a7146101dd578063055ad42e1461021a57806306fdde0314610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612d96565b610748565b6040516102119190612dde565b60405180910390f35b34801561022657600080fd5b5061022f61082a565b60405161023c9190612e92565b60405180910390f35b34801561025157600080fd5b5061025a6108d1565b6040516102679190612e92565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190612eea565b610963565b6040516102a49190612f58565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190612f9f565b6109e8565b005b3480156102e257600080fd5b506102fd60048036038101906102f8919061300b565b610b00565b005b34801561030b57600080fd5b50610314610bef565b6040516103219190613047565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061326d565b610c0c565b005b34801561035f57600080fd5b5061037a600480360381019061037591906132e5565b610eee565b005b34801561038857600080fd5b50610391610f4e565b60405161039f929190613338565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906132e5565b610fbc565b005b3480156103dd57600080fd5b506103f860048036038101906103f3919061326d565b610fdc565b005b34801561040657600080fd5b5061040f6111d6565b60405161041c9190613047565b60405180910390f35b34801561043157600080fd5b5061043a6111dc565b6040516104479190612dde565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612eea565b6111ef565b6040516104849190612f58565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af919061326d565b6112a1565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613361565b611537565b6040516104ea9190613047565b60405180910390f35b3480156104ff57600080fd5b506105086115ef565b005b34801561051657600080fd5b5061051f611677565b60405161052c9190612f58565b60405180910390f35b34801561054157600080fd5b5061054a6116a1565b6040516105579190612e92565b60405180910390f35b61057a60048036038101906105759190612eea565b611733565b005b34801561058857600080fd5b506105a3600480360381019061059e919061338e565b611a0a565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190612eea565b611a20565b005b3480156105da57600080fd5b506105e3611b47565b6040516105f09190613047565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190613483565b611b4d565b005b34801561062e57600080fd5b50610637611baf565b60405161064693929190613506565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190612eea565b611bcd565b6040516106839190612e92565b60405180910390f35b34801561069857600080fd5b506106a1611c49565b6040516106ae9190613047565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061353d565b611c4f565b6040516106eb9190612dde565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613361565b611d51565b005b34801561072957600080fd5b50610732611e49565b60405161073f9190612e92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610823575061082282611f88565b5b9050919050565b6060600a600e54600481106108425761084161357d565b5b01805461084e906135db565b80601f016020809104026020016040519081016040528092919081815260200182805461087a906135db565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b6060600080546108e0906135db565b80601f016020809104026020016040519081016040528092919081815260200182805461090c906135db565b80156109595780601f1061092e57610100808354040283529160200191610959565b820191906000526020600020905b81548152906001019060200180831161093c57829003601f168201915b5050505050905090565b600061096e82611ff2565b6109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a49061367f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f3826111ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b90613711565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8361205e565b73ffffffffffffffffffffffffffffffffffffffff161480610ab25750610ab181610aac61205e565b611c4f565b5b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae8906137a3565b60405180910390fd5b610afb838361206d565b505050565b610b0861205e565b73ffffffffffffffffffffffffffffffffffffffff16610b26611677565b73ffffffffffffffffffffffffffffffffffffffff1614610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b739061380f565b60405180910390fd5b801515601560009054906101000a900460ff1615151415610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061387b565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b60006001610bfd600f612126565b610c0791906138ca565b905090565b610c1461205e565b73ffffffffffffffffffffffffffffffffffffffff16610c32611677565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f9061380f565b60405180910390fd5b6003600e5414610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc49061394a565b60405180910390fd5b8051825114610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906139b6565b60405180910390fd5b6000825111610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90613a22565b60405180910390fd5b6000805b8251811015610d9d57828181518110610d7557610d7461357d565b5b602002602001015182610d889190613a42565b91508080610d9590613a98565b915050610d59565b50610da6610bef565b81610db19190613a42565b6011541015610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613b2d565b60405180910390fd5b60005b8351811015610ee85760005b838281518110610e1757610e1661357d565b5b6020026020010151811015610ed4576000610e32600f612126565b9050610e58868481518110610e4a57610e4961357d565b5b602002602001015182612134565b80868481518110610e6c57610e6b61357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3610ec0600f612152565b508080610ecc90613a98565b915050610e04565b508080610ee090613a98565b915050610df8565b50505050565b610eff610ef961205e565b82612168565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613bbf565b60405180910390fd5b610f49838383612246565b505050565b6000806000610f63610f5e61205e565b611537565b9050600060086000610f7361205e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080829350935050509091565b610fd783838360405180602001604052806000815250611b4d565b505050565b610fe461205e565b73ffffffffffffffffffffffffffffffffffffffff16611002611677565b73ffffffffffffffffffffffffffffffffffffffff1614611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f9061380f565b60405180910390fd5b6000600e541461109d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110949061394a565b60405180910390fd5b80518251146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d8906139b6565b60405180910390fd5b6000825111611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613a22565b60405180910390fd5b60005b82518110156111bc578181815181106111445761114361357d565b5b6020026020010151600860008584815181106111635761116261357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806111b490613a98565b915050611128565b5081516009546111cc9190613a42565b6009819055505050565b60105481565b601560009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613c51565b60405180910390fd5b80915050919050565b6112a961205e565b73ffffffffffffffffffffffffffffffffffffffff166112c7611677565b73ffffffffffffffffffffffffffffffffffffffff161461131d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113149061380f565b60405180910390fd5b8051825114611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906139b6565b60405180910390fd5b60008251116113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90613a22565b60405180910390fd5b60006001905060005b825181101561141b5760018382815181106113cc576113cb61357d565b5b602002602001015110156113df57600091505b6012548382815181106113f5576113f461357d565b5b6020026020010151111561140857600091505b808061141390613a98565b9150506113ae565b508061145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613cbd565b60405180910390fd5b60005b8251811015611531576114a684828151811061147e5761147d61357d565b5b60200260200101518483815181106114995761149861357d565b5b6020026020010151612134565b8281815181106114b9576114b861357d565b5b60200260200101518482815181106114d4576114d361357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3808061152990613a98565b91505061145f565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90613d4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f761205e565b73ffffffffffffffffffffffffffffffffffffffff16611615611677565b73ffffffffffffffffffffffffffffffffffffffff161461166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061380f565b60405180910390fd5b61167560006124ad565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b0906135db565b80601f01602080910402602001604051908101604052809291908181526020018280546116dc906135db565b80156117295780601f106116fe57610100808354040283529160200191611729565b820191906000526020600020905b81548152906001019060200180831161170c57829003601f168201915b5050505050905090565b60026007541415611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090613dbb565b60405180910390fd5b60026007819055506001600e54148061179457506002600e54145b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca9061394a565b60405180910390fd5b601560009054906101000a900460ff1615611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613e27565b60405180910390fd5b61182b610bef565b816118369190613a42565b601154101561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187190613b2d565b60405180910390fd5b6010548111156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613e93565b60405180910390fd5b60006118c961205e565b90506001600e541415611978576000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061192583611537565b90508181856119349190613a42565b1115611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613eff565b60405180910390fd5b50505b60005b828110156119fd57600061198f600f612126565b905061199b8382612134565b808373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36119e9600f612152565b5080806119f590613a98565b91505061197b565b5050600160078190555050565b611a1c611a1561205e565b8383612573565b5050565b611a2861205e565b73ffffffffffffffffffffffffffffffffffffffff16611a46611677565b73ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a939061380f565b60405180910390fd5b60048110611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad69061394a565b60405180910390fd5b6001600e54611aee9190613a42565b8114611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061394a565b60405180910390fd5b6001600e54611b3e9190613a42565b600e8190555050565b60095481565b611b5e611b5861205e565b83612168565b611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490613bbf565b60405180910390fd5b611ba9848484846126e0565b50505050565b6000806000601154611bbf610bef565b601054925092509250909192565b6060611bd882611ff2565b611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90613f6b565b60405180910390fd5b6013611c228361273c565b604051602001611c339291906140a7565b6040516020818303038152906040529050919050565b60115481565b600080601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cc79190612f58565b60206040518083038186803b158015611cdf57600080fd5b505afa158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190614114565b73ffffffffffffffffffffffffffffffffffffffff161415611d3d576001915050611d4b565b611d47848461289d565b9150505b92915050565b611d5961205e565b73ffffffffffffffffffffffffffffffffffffffff16611d77611677565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc49061380f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e34906141b3565b60405180910390fd5b611e46816124ad565b50565b60148054611e56906135db565b80601f0160208091040260200160405190810160405280929190818152602001828054611e82906135db565b8015611ecf5780601f10611ea457610100808354040283529160200191611ecf565b820191906000526020600020905b815481529060010190602001808311611eb257829003601f168201915b505050505081565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f8157600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611f85565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000612068611ed7565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e0836111ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61214e828260405180602001604052806000815250612931565b5050565b6001816000016000828254019250508190555050565b600061217382611ff2565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614245565b60405180910390fd5b60006121bd836111ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121ff57506121fe8185611c4f565b5b8061223d57508373ffffffffffffffffffffffffffffffffffffffff1661222584610963565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612266826111ef565b73ffffffffffffffffffffffffffffffffffffffff16146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906142d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390614369565b60405180910390fd5b61233783838361298c565b61234260008261206d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461239291906138ca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e99190613a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a8838383612991565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d9906143d5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d39190612dde565b60405180910390a3505050565b6126eb848484612246565b6126f784848484612996565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90614467565b60405180910390fd5b50505050565b60606000821415612784576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612898565b600082905060005b600082146127b657808061279f90613a98565b915050600a826127af91906144b6565b915061278c565b60008167ffffffffffffffff8111156127d2576127d1613067565b5b6040519080825280601f01601f1916602001820160405280156128045781602001600182028036833780820191505090505b5090505b600085146128915760018261281d91906138ca565b9150600a8561282c91906144e7565b60306128389190613a42565b60f81b81838151811061284e5761284d61357d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288a91906144b6565b9450612808565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61293b8383612b2d565b6129486000848484612996565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614467565b60405180910390fd5b505050565b505050565b505050565b60006129b78473ffffffffffffffffffffffffffffffffffffffff16612d07565b15612b20578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e061205e565b8786866040518563ffffffff1660e01b8152600401612a02949392919061456d565b602060405180830381600087803b158015612a1c57600080fd5b505af1925050508015612a4d57506040513d601f19601f82011682018060405250810190612a4a91906145ce565b60015b612ad0573d8060008114612a7d576040519150601f19603f3d011682016040523d82523d6000602084013e612a82565b606091505b50600081511415612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614467565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b25565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9490614647565b60405180910390fd5b612ba681611ff2565b15612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd906146b3565b60405180910390fd5b612bf26000838361298c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c429190613a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0360008383612991565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d7381612d3e565b8114612d7e57600080fd5b50565b600081359050612d9081612d6a565b92915050565b600060208284031215612dac57612dab612d34565b5b6000612dba84828501612d81565b91505092915050565b60008115159050919050565b612dd881612dc3565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e33578082015181840152602081019050612e18565b83811115612e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e6482612df9565b612e6e8185612e04565b9350612e7e818560208601612e15565b612e8781612e48565b840191505092915050565b60006020820190508181036000830152612eac8184612e59565b905092915050565b6000819050919050565b612ec781612eb4565b8114612ed257600080fd5b50565b600081359050612ee481612ebe565b92915050565b600060208284031215612f0057612eff612d34565b5b6000612f0e84828501612ed5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4282612f17565b9050919050565b612f5281612f37565b82525050565b6000602082019050612f6d6000830184612f49565b92915050565b612f7c81612f37565b8114612f8757600080fd5b50565b600081359050612f9981612f73565b92915050565b60008060408385031215612fb657612fb5612d34565b5b6000612fc485828601612f8a565b9250506020612fd585828601612ed5565b9150509250929050565b612fe881612dc3565b8114612ff357600080fd5b50565b60008135905061300581612fdf565b92915050565b60006020828403121561302157613020612d34565b5b600061302f84828501612ff6565b91505092915050565b61304181612eb4565b82525050565b600060208201905061305c6000830184613038565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61309f82612e48565b810181811067ffffffffffffffff821117156130be576130bd613067565b5b80604052505050565b60006130d1612d2a565b90506130dd8282613096565b919050565b600067ffffffffffffffff8211156130fd576130fc613067565b5b602082029050602081019050919050565b600080fd5b6000613126613121846130e2565b6130c7565b905080838252602082019050602084028301858111156131495761314861310e565b5b835b81811015613172578061315e8882612f8a565b84526020840193505060208101905061314b565b5050509392505050565b600082601f83011261319157613190613062565b5b81356131a1848260208601613113565b91505092915050565b600067ffffffffffffffff8211156131c5576131c4613067565b5b602082029050602081019050919050565b60006131e96131e4846131aa565b6130c7565b9050808382526020820190506020840283018581111561320c5761320b61310e565b5b835b8181101561323557806132218882612ed5565b84526020840193505060208101905061320e565b5050509392505050565b600082601f83011261325457613253613062565b5b81356132648482602086016131d6565b91505092915050565b6000806040838503121561328457613283612d34565b5b600083013567ffffffffffffffff8111156132a2576132a1612d39565b5b6132ae8582860161317c565b925050602083013567ffffffffffffffff8111156132cf576132ce612d39565b5b6132db8582860161323f565b9150509250929050565b6000806000606084860312156132fe576132fd612d34565b5b600061330c86828701612f8a565b935050602061331d86828701612f8a565b925050604061332e86828701612ed5565b9150509250925092565b600060408201905061334d6000830185613038565b61335a6020830184613038565b9392505050565b60006020828403121561337757613376612d34565b5b600061338584828501612f8a565b91505092915050565b600080604083850312156133a5576133a4612d34565b5b60006133b385828601612f8a565b92505060206133c485828601612ff6565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133ee576133ed613067565b5b6133f782612e48565b9050602081019050919050565b82818337600083830152505050565b6000613426613421846133d3565b6130c7565b905082815260208101848484011115613442576134416133ce565b5b61344d848285613404565b509392505050565b600082601f83011261346a57613469613062565b5b813561347a848260208601613413565b91505092915050565b6000806000806080858703121561349d5761349c612d34565b5b60006134ab87828801612f8a565b94505060206134bc87828801612f8a565b93505060406134cd87828801612ed5565b925050606085013567ffffffffffffffff8111156134ee576134ed612d39565b5b6134fa87828801613455565b91505092959194509250565b600060608201905061351b6000830186613038565b6135286020830185613038565b6135356040830184613038565b949350505050565b6000806040838503121561355457613553612d34565b5b600061356285828601612f8a565b925050602061357385828601612f8a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135f357607f821691505b60208210811415613607576136066135ac565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613669602c83612e04565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136fb602183612e04565b91506137068261369f565b604082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061378d603883612e04565b915061379882613731565b604082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f9602083612e04565b9150613804826137c3565b602082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b7f6572726f722076616c7565000000000000000000000000000000000000000000600082015250565b6000613865600b83612e04565b91506138708261382f565b602082019050919050565b6000602082019050818103600083015261389481613858565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138d582612eb4565b91506138e083612eb4565b9250828210156138f3576138f261389b565b5b828203905092915050565b7f6572726f72207068617365000000000000000000000000000000000000000000600082015250565b6000613934600b83612e04565b915061393f826138fe565b602082019050919050565b6000602082019050818103600083015261396381613927565b9050919050565b7f646966666572656e74206c656e67746800000000000000000000000000000000600082015250565b60006139a0601083612e04565b91506139ab8261396a565b602082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f6e6f20726563697069656e747300000000000000000000000000000000000000600082015250565b6000613a0c600d83612e04565b9150613a17826139d6565b602082019050919050565b60006020820190508181036000830152613a3b816139ff565b9050919050565b6000613a4d82612eb4565b9150613a5883612eb4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8d57613a8c61389b565b5b828201905092915050565b6000613aa382612eb4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad657613ad561389b565b5b600182019050919050565b7f6e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b6000613b17601183612e04565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ba9603183612e04565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c3b602983612e04565b9150613c4682613bdf565b604082019050919050565b60006020820190508181036000830152613c6a81613c2e565b9050919050565b7f6f6e6c7920726573657276656400000000000000000000000000000000000000600082015250565b6000613ca7600d83612e04565b9150613cb282613c71565b602082019050919050565b60006020820190508181036000830152613cd681613c9a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d39602a83612e04565b9150613d4482613cdd565b604082019050919050565b60006020820190508181036000830152613d6881613d2c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613da5601f83612e04565b9150613db082613d6f565b602082019050919050565b60006020820190508181036000830152613dd481613d98565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000613e11600683612e04565b9150613e1c82613ddb565b602082019050919050565b60006020820190508181036000830152613e4081613e04565b9050919050565b7f657863656564206d6178206d696e74207065722074696d650000000000000000600082015250565b6000613e7d601883612e04565b9150613e8882613e47565b602082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f6e6f7420656e6f756768207469636b6574730000000000000000000000000000600082015250565b6000613ee9601283612e04565b9150613ef482613eb3565b602082019050919050565b60006020820190508181036000830152613f1881613edc565b9050919050565b7f6e6f742065786973747300000000000000000000000000000000000000000000600082015250565b6000613f55600a83612e04565b9150613f6082613f1f565b602082019050919050565b60006020820190508181036000830152613f8481613f48565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613fb8816135db565b613fc28186613f8b565b94506001821660008114613fdd5760018114613fee57614021565b60ff19831686528186019350614021565b613ff785613f96565b60005b8381101561401957815481890152600182019150602081019050613ffa565b838801955050505b50505092915050565b600061403582612df9565b61403f8185613f8b565b935061404f818560208601612e15565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614091600583613f8b565b915061409c8261405b565b600582019050919050565b60006140b38285613fab565b91506140bf828461402a565b91506140ca82614084565b91508190509392505050565b60006140e182612f37565b9050919050565b6140f1816140d6565b81146140fc57600080fd5b50565b60008151905061410e816140e8565b92915050565b60006020828403121561412a57614129612d34565b5b6000614138848285016140ff565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061419d602683612e04565b91506141a882614141565b604082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061422f602c83612e04565b915061423a826141d3565b604082019050919050565b6000602082019050818103600083015261425e81614222565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142c1602583612e04565b91506142cc82614265565b604082019050919050565b600060208201905081810360008301526142f0816142b4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614353602483612e04565b915061435e826142f7565b604082019050919050565b6000602082019050818103600083015261438281614346565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143bf601983612e04565b91506143ca82614389565b602082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614451603283612e04565b915061445c826143f5565b604082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144c182612eb4565b91506144cc83612eb4565b9250826144dc576144db614487565b5b828204905092915050565b60006144f282612eb4565b91506144fd83612eb4565b92508261450d5761450c614487565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612e15565b61456281612e48565b840191505092915050565b60006080820190506145826000830187612f49565b61458f6020830186612f49565b61459c6040830185613038565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612d6a565b92915050565b6000602082840312156145e4576145e3612d34565b5b60006145f2848285016145b9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614631602083612e04565b915061463c826145fb565b602082019050919050565b6000602082019050818103600083015261466081614624565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061469d601c83612e04565b91506146a882614667565b602082019050919050565b600060208201905081810360008301526146cc81614690565b905091905056fea2646970667358221220a2bfe6ca621576622d63e2cac1a28b2379f04528350c215fbbbd9f2d0a03d13064736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000115c00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000e4d6563686120436174204372657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d43430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f7777772e6d65636861636174637265772e636f6d2f746f6b656e732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f7777772e6d65636861636174637265772e636f6d2f7374617469632f696d616765732f6c6f676f2e706e6700000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636b0944af11610102578063b59a926d11610095578063e831574211610064578063e83157421461068c578063e985e9c5146106b7578063f2fde38b146106f4578063f3ccaac01461071d576101d8565b8063b59a926d146105ce578063b88d4fde146105f9578063beb9716d14610622578063c87b56dd1461064f576101d8565b806395d89b41116100d157806395d89b4114610535578063a0712d6814610560578063a22cb4651461057c578063a5cc9e9c146105a5576101d8565b80636b0944af1461048d57806370a08231146104b6578063715018a6146104f35780638da5cb5b1461050a576101d8565b806322a2eced1161017a5780635836515d116101495780635836515d146103d157806358a3b9f2146103fa5780635c975abb146104255780636352211e14610450576101d8565b806322a2eced1461032a57806323b872dd1461035357806332ef96321461037c57806342842e0e146103a8576101d8565b8063081812fc116101b6578063081812fc14610270578063095ea7b3146102ad57806316c38b3c146102d657806318160ddd146102ff576101d8565b806301ffc9a7146101dd578063055ad42e1461021a57806306fdde0314610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612d96565b610748565b6040516102119190612dde565b60405180910390f35b34801561022657600080fd5b5061022f61082a565b60405161023c9190612e92565b60405180910390f35b34801561025157600080fd5b5061025a6108d1565b6040516102679190612e92565b60405180910390f35b34801561027c57600080fd5b5061029760048036038101906102929190612eea565b610963565b6040516102a49190612f58565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190612f9f565b6109e8565b005b3480156102e257600080fd5b506102fd60048036038101906102f8919061300b565b610b00565b005b34801561030b57600080fd5b50610314610bef565b6040516103219190613047565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061326d565b610c0c565b005b34801561035f57600080fd5b5061037a600480360381019061037591906132e5565b610eee565b005b34801561038857600080fd5b50610391610f4e565b60405161039f929190613338565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906132e5565b610fbc565b005b3480156103dd57600080fd5b506103f860048036038101906103f3919061326d565b610fdc565b005b34801561040657600080fd5b5061040f6111d6565b60405161041c9190613047565b60405180910390f35b34801561043157600080fd5b5061043a6111dc565b6040516104479190612dde565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612eea565b6111ef565b6040516104849190612f58565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af919061326d565b6112a1565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613361565b611537565b6040516104ea9190613047565b60405180910390f35b3480156104ff57600080fd5b506105086115ef565b005b34801561051657600080fd5b5061051f611677565b60405161052c9190612f58565b60405180910390f35b34801561054157600080fd5b5061054a6116a1565b6040516105579190612e92565b60405180910390f35b61057a60048036038101906105759190612eea565b611733565b005b34801561058857600080fd5b506105a3600480360381019061059e919061338e565b611a0a565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190612eea565b611a20565b005b3480156105da57600080fd5b506105e3611b47565b6040516105f09190613047565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190613483565b611b4d565b005b34801561062e57600080fd5b50610637611baf565b60405161064693929190613506565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190612eea565b611bcd565b6040516106839190612e92565b60405180910390f35b34801561069857600080fd5b506106a1611c49565b6040516106ae9190613047565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061353d565b611c4f565b6040516106eb9190612dde565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190613361565b611d51565b005b34801561072957600080fd5b50610732611e49565b60405161073f9190612e92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610823575061082282611f88565b5b9050919050565b6060600a600e54600481106108425761084161357d565b5b01805461084e906135db565b80601f016020809104026020016040519081016040528092919081815260200182805461087a906135db565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b6060600080546108e0906135db565b80601f016020809104026020016040519081016040528092919081815260200182805461090c906135db565b80156109595780601f1061092e57610100808354040283529160200191610959565b820191906000526020600020905b81548152906001019060200180831161093c57829003601f168201915b5050505050905090565b600061096e82611ff2565b6109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a49061367f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f3826111ef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b90613711565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8361205e565b73ffffffffffffffffffffffffffffffffffffffff161480610ab25750610ab181610aac61205e565b611c4f565b5b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae8906137a3565b60405180910390fd5b610afb838361206d565b505050565b610b0861205e565b73ffffffffffffffffffffffffffffffffffffffff16610b26611677565b73ffffffffffffffffffffffffffffffffffffffff1614610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b739061380f565b60405180910390fd5b801515601560009054906101000a900460ff1615151415610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061387b565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b60006001610bfd600f612126565b610c0791906138ca565b905090565b610c1461205e565b73ffffffffffffffffffffffffffffffffffffffff16610c32611677565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f9061380f565b60405180910390fd5b6003600e5414610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc49061394a565b60405180910390fd5b8051825114610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906139b6565b60405180910390fd5b6000825111610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90613a22565b60405180910390fd5b6000805b8251811015610d9d57828181518110610d7557610d7461357d565b5b602002602001015182610d889190613a42565b91508080610d9590613a98565b915050610d59565b50610da6610bef565b81610db19190613a42565b6011541015610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613b2d565b60405180910390fd5b60005b8351811015610ee85760005b838281518110610e1757610e1661357d565b5b6020026020010151811015610ed4576000610e32600f612126565b9050610e58868481518110610e4a57610e4961357d565b5b602002602001015182612134565b80868481518110610e6c57610e6b61357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3610ec0600f612152565b508080610ecc90613a98565b915050610e04565b508080610ee090613a98565b915050610df8565b50505050565b610eff610ef961205e565b82612168565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613bbf565b60405180910390fd5b610f49838383612246565b505050565b6000806000610f63610f5e61205e565b611537565b9050600060086000610f7361205e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080829350935050509091565b610fd783838360405180602001604052806000815250611b4d565b505050565b610fe461205e565b73ffffffffffffffffffffffffffffffffffffffff16611002611677565b73ffffffffffffffffffffffffffffffffffffffff1614611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f9061380f565b60405180910390fd5b6000600e541461109d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110949061394a565b60405180910390fd5b80518251146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d8906139b6565b60405180910390fd5b6000825111611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90613a22565b60405180910390fd5b60005b82518110156111bc578181815181106111445761114361357d565b5b6020026020010151600860008584815181106111635761116261357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806111b490613a98565b915050611128565b5081516009546111cc9190613a42565b6009819055505050565b60105481565b601560009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613c51565b60405180910390fd5b80915050919050565b6112a961205e565b73ffffffffffffffffffffffffffffffffffffffff166112c7611677565b73ffffffffffffffffffffffffffffffffffffffff161461131d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113149061380f565b60405180910390fd5b8051825114611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906139b6565b60405180910390fd5b60008251116113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90613a22565b60405180910390fd5b60006001905060005b825181101561141b5760018382815181106113cc576113cb61357d565b5b602002602001015110156113df57600091505b6012548382815181106113f5576113f461357d565b5b6020026020010151111561140857600091505b808061141390613a98565b9150506113ae565b508061145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613cbd565b60405180910390fd5b60005b8251811015611531576114a684828151811061147e5761147d61357d565b5b60200260200101518483815181106114995761149861357d565b5b6020026020010151612134565b8281815181106114b9576114b861357d565b5b60200260200101518482815181106114d4576114d361357d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3808061152990613a98565b91505061145f565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90613d4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f761205e565b73ffffffffffffffffffffffffffffffffffffffff16611615611677565b73ffffffffffffffffffffffffffffffffffffffff161461166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061380f565b60405180910390fd5b61167560006124ad565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b0906135db565b80601f01602080910402602001604051908101604052809291908181526020018280546116dc906135db565b80156117295780601f106116fe57610100808354040283529160200191611729565b820191906000526020600020905b81548152906001019060200180831161170c57829003601f168201915b5050505050905090565b60026007541415611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090613dbb565b60405180910390fd5b60026007819055506001600e54148061179457506002600e54145b6117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca9061394a565b60405180910390fd5b601560009054906101000a900460ff1615611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613e27565b60405180910390fd5b61182b610bef565b816118369190613a42565b601154101561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187190613b2d565b60405180910390fd5b6010548111156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613e93565b60405180910390fd5b60006118c961205e565b90506001600e541415611978576000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061192583611537565b90508181856119349190613a42565b1115611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613eff565b60405180910390fd5b50505b60005b828110156119fd57600061198f600f612126565b905061199b8382612134565b808373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36119e9600f612152565b5080806119f590613a98565b91505061197b565b5050600160078190555050565b611a1c611a1561205e565b8383612573565b5050565b611a2861205e565b73ffffffffffffffffffffffffffffffffffffffff16611a46611677565b73ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a939061380f565b60405180910390fd5b60048110611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad69061394a565b60405180910390fd5b6001600e54611aee9190613a42565b8114611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061394a565b60405180910390fd5b6001600e54611b3e9190613a42565b600e8190555050565b60095481565b611b5e611b5861205e565b83612168565b611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490613bbf565b60405180910390fd5b611ba9848484846126e0565b50505050565b6000806000601154611bbf610bef565b601054925092509250909192565b6060611bd882611ff2565b611c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0e90613f6b565b60405180910390fd5b6013611c228361273c565b604051602001611c339291906140a7565b6040516020818303038152906040529050919050565b60115481565b600080601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cc79190612f58565b60206040518083038186803b158015611cdf57600080fd5b505afa158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190614114565b73ffffffffffffffffffffffffffffffffffffffff161415611d3d576001915050611d4b565b611d47848461289d565b9150505b92915050565b611d5961205e565b73ffffffffffffffffffffffffffffffffffffffff16611d77611677565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc49061380f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e34906141b3565b60405180910390fd5b611e46816124ad565b50565b60148054611e56906135db565b80601f0160208091040260200160405190810160405280929190818152602001828054611e82906135db565b8015611ecf5780601f10611ea457610100808354040283529160200191611ecf565b820191906000526020600020905b815481529060010190602001808311611eb257829003601f168201915b505050505081565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f8157600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611f85565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000612068611ed7565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120e0836111ef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61214e828260405180602001604052806000815250612931565b5050565b6001816000016000828254019250508190555050565b600061217382611ff2565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614245565b60405180910390fd5b60006121bd836111ef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121ff57506121fe8185611c4f565b5b8061223d57508373ffffffffffffffffffffffffffffffffffffffff1661222584610963565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612266826111ef565b73ffffffffffffffffffffffffffffffffffffffff16146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906142d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390614369565b60405180910390fd5b61233783838361298c565b61234260008261206d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461239291906138ca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e99190613a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a8838383612991565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d9906143d5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d39190612dde565b60405180910390a3505050565b6126eb848484612246565b6126f784848484612996565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90614467565b60405180910390fd5b50505050565b60606000821415612784576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612898565b600082905060005b600082146127b657808061279f90613a98565b915050600a826127af91906144b6565b915061278c565b60008167ffffffffffffffff8111156127d2576127d1613067565b5b6040519080825280601f01601f1916602001820160405280156128045781602001600182028036833780820191505090505b5090505b600085146128915760018261281d91906138ca565b9150600a8561282c91906144e7565b60306128389190613a42565b60f81b81838151811061284e5761284d61357d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288a91906144b6565b9450612808565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61293b8383612b2d565b6129486000848484612996565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614467565b60405180910390fd5b505050565b505050565b505050565b60006129b78473ffffffffffffffffffffffffffffffffffffffff16612d07565b15612b20578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e061205e565b8786866040518563ffffffff1660e01b8152600401612a02949392919061456d565b602060405180830381600087803b158015612a1c57600080fd5b505af1925050508015612a4d57506040513d601f19601f82011682018060405250810190612a4a91906145ce565b60015b612ad0573d8060008114612a7d576040519150601f19603f3d011682016040523d82523d6000602084013e612a82565b606091505b50600081511415612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614467565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b25565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9490614647565b60405180910390fd5b612ba681611ff2565b15612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd906146b3565b60405180910390fd5b612bf26000838361298c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c429190613a42565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0360008383612991565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d7381612d3e565b8114612d7e57600080fd5b50565b600081359050612d9081612d6a565b92915050565b600060208284031215612dac57612dab612d34565b5b6000612dba84828501612d81565b91505092915050565b60008115159050919050565b612dd881612dc3565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e33578082015181840152602081019050612e18565b83811115612e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e6482612df9565b612e6e8185612e04565b9350612e7e818560208601612e15565b612e8781612e48565b840191505092915050565b60006020820190508181036000830152612eac8184612e59565b905092915050565b6000819050919050565b612ec781612eb4565b8114612ed257600080fd5b50565b600081359050612ee481612ebe565b92915050565b600060208284031215612f0057612eff612d34565b5b6000612f0e84828501612ed5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4282612f17565b9050919050565b612f5281612f37565b82525050565b6000602082019050612f6d6000830184612f49565b92915050565b612f7c81612f37565b8114612f8757600080fd5b50565b600081359050612f9981612f73565b92915050565b60008060408385031215612fb657612fb5612d34565b5b6000612fc485828601612f8a565b9250506020612fd585828601612ed5565b9150509250929050565b612fe881612dc3565b8114612ff357600080fd5b50565b60008135905061300581612fdf565b92915050565b60006020828403121561302157613020612d34565b5b600061302f84828501612ff6565b91505092915050565b61304181612eb4565b82525050565b600060208201905061305c6000830184613038565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61309f82612e48565b810181811067ffffffffffffffff821117156130be576130bd613067565b5b80604052505050565b60006130d1612d2a565b90506130dd8282613096565b919050565b600067ffffffffffffffff8211156130fd576130fc613067565b5b602082029050602081019050919050565b600080fd5b6000613126613121846130e2565b6130c7565b905080838252602082019050602084028301858111156131495761314861310e565b5b835b81811015613172578061315e8882612f8a565b84526020840193505060208101905061314b565b5050509392505050565b600082601f83011261319157613190613062565b5b81356131a1848260208601613113565b91505092915050565b600067ffffffffffffffff8211156131c5576131c4613067565b5b602082029050602081019050919050565b60006131e96131e4846131aa565b6130c7565b9050808382526020820190506020840283018581111561320c5761320b61310e565b5b835b8181101561323557806132218882612ed5565b84526020840193505060208101905061320e565b5050509392505050565b600082601f83011261325457613253613062565b5b81356132648482602086016131d6565b91505092915050565b6000806040838503121561328457613283612d34565b5b600083013567ffffffffffffffff8111156132a2576132a1612d39565b5b6132ae8582860161317c565b925050602083013567ffffffffffffffff8111156132cf576132ce612d39565b5b6132db8582860161323f565b9150509250929050565b6000806000606084860312156132fe576132fd612d34565b5b600061330c86828701612f8a565b935050602061331d86828701612f8a565b925050604061332e86828701612ed5565b9150509250925092565b600060408201905061334d6000830185613038565b61335a6020830184613038565b9392505050565b60006020828403121561337757613376612d34565b5b600061338584828501612f8a565b91505092915050565b600080604083850312156133a5576133a4612d34565b5b60006133b385828601612f8a565b92505060206133c485828601612ff6565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133ee576133ed613067565b5b6133f782612e48565b9050602081019050919050565b82818337600083830152505050565b6000613426613421846133d3565b6130c7565b905082815260208101848484011115613442576134416133ce565b5b61344d848285613404565b509392505050565b600082601f83011261346a57613469613062565b5b813561347a848260208601613413565b91505092915050565b6000806000806080858703121561349d5761349c612d34565b5b60006134ab87828801612f8a565b94505060206134bc87828801612f8a565b93505060406134cd87828801612ed5565b925050606085013567ffffffffffffffff8111156134ee576134ed612d39565b5b6134fa87828801613455565b91505092959194509250565b600060608201905061351b6000830186613038565b6135286020830185613038565b6135356040830184613038565b949350505050565b6000806040838503121561355457613553612d34565b5b600061356285828601612f8a565b925050602061357385828601612f8a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135f357607f821691505b60208210811415613607576136066135ac565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613669602c83612e04565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136fb602183612e04565b91506137068261369f565b604082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061378d603883612e04565b915061379882613731565b604082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f9602083612e04565b9150613804826137c3565b602082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b7f6572726f722076616c7565000000000000000000000000000000000000000000600082015250565b6000613865600b83612e04565b91506138708261382f565b602082019050919050565b6000602082019050818103600083015261389481613858565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138d582612eb4565b91506138e083612eb4565b9250828210156138f3576138f261389b565b5b828203905092915050565b7f6572726f72207068617365000000000000000000000000000000000000000000600082015250565b6000613934600b83612e04565b915061393f826138fe565b602082019050919050565b6000602082019050818103600083015261396381613927565b9050919050565b7f646966666572656e74206c656e67746800000000000000000000000000000000600082015250565b60006139a0601083612e04565b91506139ab8261396a565b602082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f6e6f20726563697069656e747300000000000000000000000000000000000000600082015250565b6000613a0c600d83612e04565b9150613a17826139d6565b602082019050919050565b60006020820190508181036000830152613a3b816139ff565b9050919050565b6000613a4d82612eb4565b9150613a5883612eb4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a8d57613a8c61389b565b5b828201905092915050565b6000613aa382612eb4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad657613ad561389b565b5b600182019050919050565b7f6e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b6000613b17601183612e04565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ba9603183612e04565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c3b602983612e04565b9150613c4682613bdf565b604082019050919050565b60006020820190508181036000830152613c6a81613c2e565b9050919050565b7f6f6e6c7920726573657276656400000000000000000000000000000000000000600082015250565b6000613ca7600d83612e04565b9150613cb282613c71565b602082019050919050565b60006020820190508181036000830152613cd681613c9a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d39602a83612e04565b9150613d4482613cdd565b604082019050919050565b60006020820190508181036000830152613d6881613d2c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613da5601f83612e04565b9150613db082613d6f565b602082019050919050565b60006020820190508181036000830152613dd481613d98565b9050919050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000613e11600683612e04565b9150613e1c82613ddb565b602082019050919050565b60006020820190508181036000830152613e4081613e04565b9050919050565b7f657863656564206d6178206d696e74207065722074696d650000000000000000600082015250565b6000613e7d601883612e04565b9150613e8882613e47565b602082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f6e6f7420656e6f756768207469636b6574730000000000000000000000000000600082015250565b6000613ee9601283612e04565b9150613ef482613eb3565b602082019050919050565b60006020820190508181036000830152613f1881613edc565b9050919050565b7f6e6f742065786973747300000000000000000000000000000000000000000000600082015250565b6000613f55600a83612e04565b9150613f6082613f1f565b602082019050919050565b60006020820190508181036000830152613f8481613f48565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613fb8816135db565b613fc28186613f8b565b94506001821660008114613fdd5760018114613fee57614021565b60ff19831686528186019350614021565b613ff785613f96565b60005b8381101561401957815481890152600182019150602081019050613ffa565b838801955050505b50505092915050565b600061403582612df9565b61403f8185613f8b565b935061404f818560208601612e15565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614091600583613f8b565b915061409c8261405b565b600582019050919050565b60006140b38285613fab565b91506140bf828461402a565b91506140ca82614084565b91508190509392505050565b60006140e182612f37565b9050919050565b6140f1816140d6565b81146140fc57600080fd5b50565b60008151905061410e816140e8565b92915050565b60006020828403121561412a57614129612d34565b5b6000614138848285016140ff565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061419d602683612e04565b91506141a882614141565b604082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061422f602c83612e04565b915061423a826141d3565b604082019050919050565b6000602082019050818103600083015261425e81614222565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142c1602583612e04565b91506142cc82614265565b604082019050919050565b600060208201905081810360008301526142f0816142b4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614353602483612e04565b915061435e826142f7565b604082019050919050565b6000602082019050818103600083015261438281614346565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143bf601983612e04565b91506143ca82614389565b602082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614451603283612e04565b915061445c826143f5565b604082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144c182612eb4565b91506144cc83612eb4565b9250826144dc576144db614487565b5b828204905092915050565b60006144f282612eb4565b91506144fd83612eb4565b92508261450d5761450c614487565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612e15565b61456281612e48565b840191505092915050565b60006080820190506145826000830187612f49565b61458f6020830186612f49565b61459c6040830185613038565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612d6a565b92915050565b6000602082840312156145e4576145e3612d34565b5b60006145f2848285016145b9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614631602083612e04565b915061463c826145fb565b602082019050919050565b6000602082019050818103600083015261466081614624565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061469d601c83612e04565b91506146a882614667565b602082019050919050565b600060208201905081810360008301526146cc81614690565b905091905056fea2646970667358221220a2bfe6ca621576622d63e2cac1a28b2379f04528350c215fbbbd9f2d0a03d13064736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000115c00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000e4d6563686120436174204372657700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d43430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f7777772e6d65636861636174637265772e636f6d2f746f6b656e732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f7777772e6d65636861636174637265772e636f6d2f7374617469632f696d616765732f6c6f676f2e706e6700000000000000000000000000

-----Decoded View---------------
Arg [0] : _t (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 000000000000000000000000000000000000000000000000000000000000115c
Arg [7] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [10] : 4d65636861204361742043726577000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 4d43430000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [14] : 68747470733a2f2f7777772e6d65636861636174637265772e636f6d2f746f6b
Arg [15] : 656e732f00000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [17] : 68747470733a2f2f7777772e6d65636861636174637265772e636f6d2f737461
Arg [18] : 7469632f696d616765732f6c6f676f2e706e6700000000000000000000000000


Deployed Bytecode Sourcemap

49559:5915:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33670:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50948:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34615:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36175:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35698:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54635:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51748:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53562:843;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36925:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51535:205;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37335:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51060:467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49989:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50148:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34309:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52844:710;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34039:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48498:103;;;;;;;;;;;;;:::i;:::-;;47847:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34784:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52004:832;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36468:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54413:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49798:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37591:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51861:135;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;54762:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50025:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55002:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48756:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50122:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33670:305;33772:4;33824:25;33809:40;;;:11;:40;;;;:105;;;;33881:33;33866:48;;;:11;:48;;;;33809:105;:158;;;;33931:36;33955:11;33931:23;:36::i;:::-;33809:158;33789:178;;33670:305;;;:::o;50948:104::-;50993:13;51026:6;51033:10;;51026:18;;;;;;;:::i;:::-;;;51019:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50948:104;:::o;34615:100::-;34669:13;34702:5;34695:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34615:100;:::o;36175:221::-;36251:7;36279:16;36287:7;36279;:16::i;:::-;36271:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36364:15;:24;36380:7;36364:24;;;;;;;;;;;;;;;;;;;;;36357:31;;36175:221;;;:::o;35698:411::-;35779:13;35795:23;35810:7;35795:14;:23::i;:::-;35779:39;;35843:5;35837:11;;:2;:11;;;;35829:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35937:5;35921:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35946:37;35963:5;35970:12;:10;:12::i;:::-;35946:16;:37::i;:::-;35921:62;35899:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36080:21;36089:2;36093:7;36080:8;:21::i;:::-;35768:341;35698:411;;:::o;54635:119::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54708:1:::1;54698:11;;:6;;;;;;;;;;;:11;;;;54690:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;54745:1;54736:6;;:10;;;;;;;;;;;;;;;;;;54635:119:::0;:::o;51748:105::-;51792:7;51844:1;51819:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;51812:33;;51748:105;:::o;53562:843::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53684:1:::1;53670:10;;:15;53662:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;53741:6;:13;53720:10;:17;:34;53712:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53814:1;53794:10;:17;:21;53786:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53846:13;53879:9:::0;53874:97:::1;53898:6;:13;53894:1;:17;53874:97;;;53950:6;53957:1;53950:9;;;;;;;;:::i;:::-;;;;;;;;53942:5;:17;;;;:::i;:::-;53934:25;;53913:4;;;;;:::i;:::-;;;;53874:97;;;;54012:13;:11;:13::i;:::-;54004:5;:21;;;;:::i;:::-;53991:9;;:34;;53983:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54065:9;54060:338;54084:10;:17;54080:1;:21;54060:338;;;54129:9;54124:263;54148:6;54155:1;54148:9;;;;;;;;:::i;:::-;;;;;;;;54144:1;:13;54124:263;;;54184:15;54202:22;:12;:20;:22::i;:::-;54184:40;;54243:33;54253:10;54264:1;54253:13;;;;;;;;:::i;:::-;;;;;;;;54268:7;54243:9;:33::i;:::-;54320:7;54305:10;54316:1;54305:13;;;;;;;;:::i;:::-;;;;;;;;54300:28;;;;;;;;;;;;54347:24;:12;:22;:24::i;:::-;54165:222;54159:4;;;;;:::i;:::-;;;;54124:263;;;;54103:4;;;;;:::i;:::-;;;;54060:338;;;;53651:754;53562:843:::0;;:::o;36925:339::-;37120:41;37139:12;:10;:12::i;:::-;37153:7;37120:18;:41::i;:::-;37112:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37228:28;37238:4;37244:2;37248:7;37228:9;:28::i;:::-;36925:339;;;:::o;51535:205::-;51577:7;51586;51606:15;51624:23;51634:12;:10;:12::i;:::-;51624:9;:23::i;:::-;51606:41;;51658:14;51675:8;:22;51684:12;:10;:12::i;:::-;51675:22;;;;;;;;;;;;;;;;51658:39;;51716:6;51724:7;51708:24;;;;;;51535:205;;:::o;37335:185::-;37473:39;37490:4;37496:2;37500:7;37473:39;;;;;;;;;;;;:16;:39::i;:::-;37335:185;;;:::o;51060:467::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51188:1:::1;51174:10;;:15;51166:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;51245:7;:14;51224:10;:17;:35;51216:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51319:1;51299:10;:17;:21;51291:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51356:9;51351:111;51375:10;:17;51371:1;:21;51351:111;;;51440:7;51448:1;51440:10;;;;;;;;:::i;:::-;;;;;;;;51414:8;:23;51423:10;51434:1;51423:13;;;;;;;;:::i;:::-;;;;;;;;51414:23;;;;;;;;;;;;;;;:36;;;;51394:3;;;;;:::i;:::-;;;;51351:111;;;;51502:10;:17;51488:11;;:31;;;;:::i;:::-;51474:11;:45;;;;51060:467:::0;;:::o;49989:29::-;;;;:::o;50148:18::-;;;;;;;;;;;;;:::o;34309:239::-;34381:7;34401:13;34417:7;:16;34425:7;34417:16;;;;;;;;;;;;;;;;;;;;;34401:32;;34469:1;34452:19;;:5;:19;;;;34444:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34535:5;34528:12;;;34309:239;;;:::o;52844:710::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52974:3:::1;:10;52953;:17;:31;52945:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53044:1;53024:10;:17;:21;53016:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53076:16;53095:4;53076:23;;53115:9;53110:229;53134:3;:10;53130:1;:14;53110:229;;;53180:1;53171:3;53175:1;53171:6;;;;;;;;:::i;:::-;;;;;;;;:10;53167:70;;;53216:5;53202:19;;53167:70;53264:8;;53255:3;53259:1;53255:6;;;;;;;;:::i;:::-;;;;;;;;:17;53251:77;;;53307:5;53293:19;;53251:77;53146:4;;;;;:::i;:::-;;;;53110:229;;;;53357:11;53349:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;53404:9;53399:148;53423:3;:10;53419:1;:14;53399:148;;;53456:32;53466:10;53477:1;53466:13;;;;;;;;:::i;:::-;;;;;;;;53481:3;53485:1;53481:6;;;;;;;;:::i;:::-;;;;;;;;53456:9;:32::i;:::-;53528:3;53532:1;53528:6;;;;;;;;:::i;:::-;;;;;;;;53513:10;53524:1;53513:13;;;;;;;;:::i;:::-;;;;;;;;53508:27;;;;;;;;;;;;53435:4;;;;;:::i;:::-;;;;53399:148;;;;52934:620;52844:710:::0;;:::o;34039:208::-;34111:7;34156:1;34139:19;;:5;:19;;;;34131:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34223:9;:16;34233:5;34223:16;;;;;;;;;;;;;;;;34216:23;;34039:208;;;:::o;48498:103::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48563:30:::1;48590:1;48563:18;:30::i;:::-;48498:103::o:0;47847:87::-;47893:7;47920:6;;;;;;;;;;;47913:13;;47847:87;:::o;34784:104::-;34840:13;34873:7;34866:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34784:104;:::o;52004:832::-;30423:1;31021:7;;:19;;31013:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30423:1;31154:7;:18;;;;52098:1:::1;52084:10;;:15;:34;;;;52117:1;52103:10;;:15;52084:34;52076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52154:6;;;;;;;;;;;52153:7;52145:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;52215:13;:11;:13::i;:::-;52203:9;:25;;;;:::i;:::-;52190:9;;:38;;52182:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52282:14;;52269:9;:27;;52261:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;52338:15;52356:12;:10;:12::i;:::-;52338:30;;52399:1;52385:10;;:15;52381:208;;;52417:14;52434:8;:17;52443:7;52434:17;;;;;;;;;;;;;;;;52417:34;;52466:15;52484:18;52494:7;52484:9;:18::i;:::-;52466:36;;52548:6;52537:7;52525:9;:19;;;;:::i;:::-;:29;;52517:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52402:187;;52381:208;52606:9;52601:228;52623:9;52619:1;:13;52601:228;;;52654:15;52672:22;:12;:20;:22::i;:::-;52654:40;;52709:27;52719:7;52728;52709:9;:27::i;:::-;52770:7;52761;52756:22;;;;;;;;;;;;52793:24;:12;:22;:24::i;:::-;52639:190;52634:3;;;;;:::i;:::-;;;;52601:228;;;;52065:771;30379:1:::0;31333:7;:22;;;;52004:832;:::o;36468:155::-;36563:52;36582:12;:10;:12::i;:::-;36596:8;36606;36563:18;:52::i;:::-;36468:155;;:::o;54413:214::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54502:1:::1;54490:9;:13;54482:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;54564:1;54551:10;;:14;;;;:::i;:::-;54538:9;:27;54530:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54618:1;54605:10;;:14;;;;:::i;:::-;54592:10;:27;;;;54413:214:::0;:::o;49798:30::-;;;;:::o;37591:328::-;37766:41;37785:12;:10;:12::i;:::-;37799:7;37766:18;:41::i;:::-;37758:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37872:39;37886:4;37892:2;37896:7;37905:5;37872:13;:39::i;:::-;37591:328;;;;:::o;51861:135::-;51901:7;51910;51919;51947:9;;51958:13;:11;:13::i;:::-;51973:14;;51939:49;;;;;;51861:135;;;:::o;54762:232::-;54835:13;54869:16;54877:7;54869;:16::i;:::-;54861:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;54942:13;54957:18;:7;:16;:18::i;:::-;54925:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54911:75;;54762:232;;;:::o;50025:24::-;;;;:::o;55002:341::-;55091:4;55108:27;55152:20;;;;;;;;;;;55108:65;;55229:8;55188:49;;55196:13;:21;;;55218:5;55196:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55188:49;;;55184:93;;;55261:4;55254:11;;;;;55184:93;55296:39;55319:5;55326:8;55296:22;:39::i;:::-;55289:46;;;55002:341;;;;;:::o;48756:201::-;48078:12;:10;:12::i;:::-;48067:23;;:7;:5;:7::i;:::-;:23;;;48059:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48865:1:::1;48845:22;;:8;:22;;;;48837:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48921:28;48940:8;48921:18;:28::i;:::-;48756:201:::0;:::o;50122:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;133:650::-;204:22;270:4;248:27;;:10;:27;;;244:508;;;292:18;313:8;;292:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;336:13;352:8;;:15;;336:31;;604:42;574:5;567;563:17;557:24;531:134;521:144;;391:289;;244:508;;;729:10;712:28;;244:508;133:650;:::o;22757:157::-;22842:4;22881:25;22866:40;;;:11;:40;;;;22859:47;;22757:157;;;:::o;39429:127::-;39494:4;39546:1;39518:30;;:7;:16;39526:7;39518:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39511:37;;39429:127;;;:::o;55351:120::-;55405:14;55439:24;:22;:24::i;:::-;55432:31;;55351:120;:::o;43575:174::-;43677:2;43650:15;:24;43666:7;43650:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43733:7;43729:2;43695:46;;43704:23;43719:7;43704:14;:23::i;:::-;43695:46;;;;;;;;;;;;43575:174;;:::o;8701:114::-;8766:7;8793;:14;;;8786:21;;8701:114;;;:::o;40413:110::-;40489:26;40499:2;40503:7;40489:26;;;;;;;;;;;;:9;:26::i;:::-;40413:110;;:::o;8823:127::-;8930:1;8912:7;:14;;;:19;;;;;;;;;;;8823:127;:::o;39723:348::-;39816:4;39841:16;39849:7;39841;:16::i;:::-;39833:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39917:13;39933:23;39948:7;39933:14;:23::i;:::-;39917:39;;39986:5;39975:16;;:7;:16;;;:52;;;;39995:32;40012:5;40019:7;39995:16;:32::i;:::-;39975:52;:87;;;;40055:7;40031:31;;:20;40043:7;40031:11;:20::i;:::-;:31;;;39975:87;39967:96;;;39723:348;;;;:::o;42832:625::-;42991:4;42964:31;;:23;42979:7;42964:14;:23::i;:::-;:31;;;42956:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43070:1;43056:16;;:2;:16;;;;43048:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43126:39;43147:4;43153:2;43157:7;43126:20;:39::i;:::-;43230:29;43247:1;43251:7;43230:8;:29::i;:::-;43291:1;43272:9;:15;43282:4;43272:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43320:1;43303:9;:13;43313:2;43303:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43351:2;43332:7;:16;43340:7;43332:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43390:7;43386:2;43371:27;;43380:4;43371:27;;;;;;;;;;;;43411:38;43431:4;43437:2;43441:7;43411:19;:38::i;:::-;42832:625;;;:::o;49117:191::-;49191:16;49210:6;;;;;;;;;;;49191:25;;49236:8;49227:6;;:17;;;;;;;;;;;;;;;;;;49291:8;49260:40;;49281:8;49260:40;;;;;;;;;;;;49180:128;49117:191;:::o;43891:315::-;44046:8;44037:17;;:5;:17;;;;44029:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44133:8;44095:18;:25;44114:5;44095:25;;;;;;;;;;;;;;;:35;44121:8;44095:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44179:8;44157:41;;44172:5;44157:41;;;44189:8;44157:41;;;;;;:::i;:::-;;;;;;;;43891:315;;;:::o;38801:::-;38958:28;38968:4;38974:2;38978:7;38958:9;:28::i;:::-;39005:48;39028:4;39034:2;39038:7;39047:5;39005:22;:48::i;:::-;38997:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38801:315;;;;:::o;9659:723::-;9715:13;9945:1;9936:5;:10;9932:53;;;9963:10;;;;;;;;;;;;;;;;;;;;;9932:53;9995:12;10010:5;9995:20;;10026:14;10051:78;10066:1;10058:4;:9;10051:78;;10084:8;;;;;:::i;:::-;;;;10115:2;10107:10;;;;;:::i;:::-;;;10051:78;;;10139:19;10171:6;10161:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10139:39;;10189:154;10205:1;10196:5;:10;10189:154;;10233:1;10223:11;;;;;:::i;:::-;;;10300:2;10292:5;:10;;;;:::i;:::-;10279:2;:24;;;;:::i;:::-;10266:39;;10249:6;10256;10249:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10329:2;10320:11;;;;;:::i;:::-;;;10189:154;;;10367:6;10353:21;;;;;9659:723;;;;:::o;36694:164::-;36791:4;36815:18;:25;36834:5;36815:25;;;;;;;;;;;;;;;:35;36841:8;36815:35;;;;;;;;;;;;;;;;;;;;;;;;;36808:42;;36694:164;;;;:::o;40750:321::-;40880:18;40886:2;40890:7;40880:5;:18::i;:::-;40931:54;40962:1;40966:2;40970:7;40979:5;40931:22;:54::i;:::-;40909:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40750:321;;;:::o;46142:126::-;;;;:::o;46653:125::-;;;;:::o;44771:799::-;44926:4;44947:15;:2;:13;;;:15::i;:::-;44943:620;;;44999:2;44983:36;;;45020:12;:10;:12::i;:::-;45034:4;45040:7;45049:5;44983:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44979:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45242:1;45225:6;:13;:18;45221:272;;;45268:60;;;;;;;;;;:::i;:::-;;;;;;;;45221:272;45443:6;45437:13;45428:6;45424:2;45420:15;45413:38;44979:529;45116:41;;;45106:51;;;:6;:51;;;;45099:58;;;;;44943:620;45547:4;45540:11;;44771:799;;;;;;;:::o;41407:439::-;41501:1;41487:16;;:2;:16;;;;41479:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41560:16;41568:7;41560;:16::i;:::-;41559:17;41551:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41622:45;41651:1;41655:2;41659:7;41622:20;:45::i;:::-;41697:1;41680:9;:13;41690:2;41680:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41728:2;41709:7;:16;41717:7;41709:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41773:7;41769:2;41748:33;;41765:1;41748:33;;;;;;;;;;;;41794:44;41822:1;41826:2;41830:7;41794:19;:44::i;:::-;41407:439;;:::o;12651:326::-;12711:4;12968:1;12946:7;:19;;;:23;12939:30;;12651:326;;;:::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:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:117::-;5989:1;5986;5979:12;6003:180;6051:77;6048:1;6041:88;6148:4;6145:1;6138:15;6172:4;6169:1;6162:15;6189:281;6272:27;6294:4;6272:27;:::i;:::-;6264:6;6260:40;6402:6;6390:10;6387:22;6366:18;6354:10;6351:34;6348:62;6345:88;;;6413:18;;:::i;:::-;6345:88;6453:10;6449:2;6442:22;6232:238;6189:281;;:::o;6476:129::-;6510:6;6537:20;;:::i;:::-;6527:30;;6566:33;6594:4;6586:6;6566:33;:::i;:::-;6476:129;;;:::o;6611:311::-;6688:4;6778:18;6770:6;6767:30;6764:56;;;6800:18;;:::i;:::-;6764:56;6850:4;6842:6;6838:17;6830:25;;6910:4;6904;6900:15;6892:23;;6611:311;;;:::o;6928:117::-;7037:1;7034;7027:12;7068:710;7164:5;7189:81;7205:64;7262:6;7205:64;:::i;:::-;7189:81;:::i;:::-;7180:90;;7290:5;7319:6;7312:5;7305:21;7353:4;7346:5;7342:16;7335:23;;7406:4;7398:6;7394:17;7386:6;7382:30;7435:3;7427:6;7424:15;7421:122;;;7454:79;;:::i;:::-;7421:122;7569:6;7552:220;7586:6;7581:3;7578:15;7552:220;;;7661:3;7690:37;7723:3;7711:10;7690:37;:::i;:::-;7685:3;7678:50;7757:4;7752:3;7748:14;7741:21;;7628:144;7612:4;7607:3;7603:14;7596:21;;7552:220;;;7556:21;7170:608;;7068:710;;;;;:::o;7801:370::-;7872:5;7921:3;7914:4;7906:6;7902:17;7898:27;7888:122;;7929:79;;:::i;:::-;7888:122;8046:6;8033:20;8071:94;8161:3;8153:6;8146:4;8138:6;8134:17;8071:94;:::i;:::-;8062:103;;7878:293;7801:370;;;;:::o;8177:311::-;8254:4;8344:18;8336:6;8333:30;8330:56;;;8366:18;;:::i;:::-;8330:56;8416:4;8408:6;8404:17;8396:25;;8476:4;8470;8466:15;8458:23;;8177:311;;;:::o;8511:710::-;8607:5;8632:81;8648:64;8705:6;8648:64;:::i;:::-;8632:81;:::i;:::-;8623:90;;8733:5;8762:6;8755:5;8748:21;8796:4;8789:5;8785:16;8778:23;;8849:4;8841:6;8837:17;8829:6;8825:30;8878:3;8870:6;8867:15;8864:122;;;8897:79;;:::i;:::-;8864:122;9012:6;8995:220;9029:6;9024:3;9021:15;8995:220;;;9104:3;9133:37;9166:3;9154:10;9133:37;:::i;:::-;9128:3;9121:50;9200:4;9195:3;9191:14;9184:21;;9071:144;9055:4;9050:3;9046:14;9039:21;;8995:220;;;8999:21;8613:608;;8511:710;;;;;:::o;9244:370::-;9315:5;9364:3;9357:4;9349:6;9345:17;9341:27;9331:122;;9372:79;;:::i;:::-;9331:122;9489:6;9476:20;9514:94;9604:3;9596:6;9589:4;9581:6;9577:17;9514:94;:::i;:::-;9505:103;;9321:293;9244:370;;;;:::o;9620:894::-;9738:6;9746;9795:2;9783:9;9774:7;9770:23;9766:32;9763:119;;;9801:79;;:::i;:::-;9763:119;9949:1;9938:9;9934:17;9921:31;9979:18;9971:6;9968:30;9965:117;;;10001:79;;:::i;:::-;9965:117;10106:78;10176:7;10167:6;10156:9;10152:22;10106:78;:::i;:::-;10096:88;;9892:302;10261:2;10250:9;10246:18;10233:32;10292:18;10284:6;10281:30;10278:117;;;10314:79;;:::i;:::-;10278:117;10419:78;10489:7;10480:6;10469:9;10465:22;10419:78;:::i;:::-;10409:88;;10204:303;9620:894;;;;;:::o;10520:619::-;10597:6;10605;10613;10662:2;10650:9;10641:7;10637:23;10633:32;10630:119;;;10668:79;;:::i;:::-;10630:119;10788:1;10813:53;10858:7;10849:6;10838:9;10834:22;10813:53;:::i;:::-;10803:63;;10759:117;10915:2;10941:53;10986:7;10977:6;10966:9;10962:22;10941:53;:::i;:::-;10931:63;;10886:118;11043:2;11069:53;11114:7;11105:6;11094:9;11090:22;11069:53;:::i;:::-;11059:63;;11014:118;10520:619;;;;;:::o;11145:332::-;11266:4;11304:2;11293:9;11289:18;11281:26;;11317:71;11385:1;11374:9;11370:17;11361:6;11317:71;:::i;:::-;11398:72;11466:2;11455:9;11451:18;11442:6;11398:72;:::i;:::-;11145:332;;;;;:::o;11483:329::-;11542:6;11591:2;11579:9;11570:7;11566:23;11562:32;11559:119;;;11597:79;;:::i;:::-;11559:119;11717:1;11742:53;11787:7;11778:6;11767:9;11763:22;11742:53;:::i;:::-;11732:63;;11688:117;11483:329;;;;:::o;11818:468::-;11883:6;11891;11940:2;11928:9;11919:7;11915:23;11911:32;11908:119;;;11946:79;;:::i;:::-;11908:119;12066:1;12091:53;12136:7;12127:6;12116:9;12112:22;12091:53;:::i;:::-;12081:63;;12037:117;12193:2;12219:50;12261:7;12252:6;12241:9;12237:22;12219:50;:::i;:::-;12209:60;;12164:115;11818:468;;;;;:::o;12292:117::-;12401:1;12398;12391:12;12415:307;12476:4;12566:18;12558:6;12555:30;12552:56;;;12588:18;;:::i;:::-;12552:56;12626:29;12648:6;12626:29;:::i;:::-;12618:37;;12710:4;12704;12700:15;12692:23;;12415:307;;;:::o;12728:154::-;12812:6;12807:3;12802;12789:30;12874:1;12865:6;12860:3;12856:16;12849:27;12728:154;;;:::o;12888:410::-;12965:5;12990:65;13006:48;13047:6;13006:48;:::i;:::-;12990:65;:::i;:::-;12981:74;;13078:6;13071:5;13064:21;13116:4;13109:5;13105:16;13154:3;13145:6;13140:3;13136:16;13133:25;13130:112;;;13161:79;;:::i;:::-;13130:112;13251:41;13285:6;13280:3;13275;13251:41;:::i;:::-;12971:327;12888:410;;;;;:::o;13317:338::-;13372:5;13421:3;13414:4;13406:6;13402:17;13398:27;13388:122;;13429:79;;:::i;:::-;13388:122;13546:6;13533:20;13571:78;13645:3;13637:6;13630:4;13622:6;13618:17;13571:78;:::i;:::-;13562:87;;13378:277;13317:338;;;;:::o;13661:943::-;13756:6;13764;13772;13780;13829:3;13817:9;13808:7;13804:23;13800:33;13797:120;;;13836:79;;:::i;:::-;13797:120;13956:1;13981:53;14026:7;14017:6;14006:9;14002:22;13981:53;:::i;:::-;13971:63;;13927:117;14083:2;14109:53;14154:7;14145:6;14134:9;14130:22;14109:53;:::i;:::-;14099:63;;14054:118;14211:2;14237:53;14282:7;14273:6;14262:9;14258:22;14237:53;:::i;:::-;14227:63;;14182:118;14367:2;14356:9;14352:18;14339:32;14398:18;14390:6;14387:30;14384:117;;;14420:79;;:::i;:::-;14384:117;14525:62;14579:7;14570:6;14559:9;14555:22;14525:62;:::i;:::-;14515:72;;14310:287;13661:943;;;;;;;:::o;14610:442::-;14759:4;14797:2;14786:9;14782:18;14774:26;;14810:71;14878:1;14867:9;14863:17;14854:6;14810:71;:::i;:::-;14891:72;14959:2;14948:9;14944:18;14935:6;14891:72;:::i;:::-;14973;15041:2;15030:9;15026:18;15017:6;14973:72;:::i;:::-;14610:442;;;;;;:::o;15058:474::-;15126:6;15134;15183:2;15171:9;15162:7;15158:23;15154:32;15151:119;;;15189:79;;:::i;:::-;15151:119;15309:1;15334:53;15379:7;15370:6;15359:9;15355:22;15334:53;:::i;:::-;15324:63;;15280:117;15436:2;15462:53;15507:7;15498:6;15487:9;15483:22;15462:53;:::i;:::-;15452:63;;15407:118;15058:474;;;;;:::o;15538:180::-;15586:77;15583:1;15576:88;15683:4;15680:1;15673:15;15707:4;15704:1;15697:15;15724:180;15772:77;15769:1;15762:88;15869:4;15866:1;15859:15;15893:4;15890:1;15883:15;15910:320;15954:6;15991:1;15985:4;15981:12;15971:22;;16038:1;16032:4;16028:12;16059:18;16049:81;;16115:4;16107:6;16103:17;16093:27;;16049:81;16177:2;16169:6;16166:14;16146:18;16143:38;16140:84;;;16196:18;;:::i;:::-;16140:84;15961:269;15910:320;;;:::o;16236:231::-;16376:34;16372:1;16364:6;16360:14;16353:58;16445:14;16440:2;16432:6;16428:15;16421:39;16236:231;:::o;16473:366::-;16615:3;16636:67;16700:2;16695:3;16636:67;:::i;:::-;16629:74;;16712:93;16801:3;16712:93;:::i;:::-;16830:2;16825:3;16821:12;16814:19;;16473:366;;;:::o;16845:419::-;17011:4;17049:2;17038:9;17034:18;17026:26;;17098:9;17092:4;17088:20;17084:1;17073:9;17069:17;17062:47;17126:131;17252:4;17126:131;:::i;:::-;17118:139;;16845:419;;;:::o;17270:220::-;17410:34;17406:1;17398:6;17394:14;17387:58;17479:3;17474:2;17466:6;17462:15;17455:28;17270:220;:::o;17496:366::-;17638:3;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17735:93;17824:3;17735:93;:::i;:::-;17853:2;17848:3;17844:12;17837:19;;17496:366;;;:::o;17868:419::-;18034:4;18072:2;18061:9;18057:18;18049:26;;18121:9;18115:4;18111:20;18107:1;18096:9;18092:17;18085:47;18149:131;18275:4;18149:131;:::i;:::-;18141:139;;17868:419;;;:::o;18293:243::-;18433:34;18429:1;18421:6;18417:14;18410:58;18502:26;18497:2;18489:6;18485:15;18478:51;18293:243;:::o;18542:366::-;18684:3;18705:67;18769:2;18764:3;18705:67;:::i;:::-;18698:74;;18781:93;18870:3;18781:93;:::i;:::-;18899:2;18894:3;18890:12;18883:19;;18542:366;;;:::o;18914:419::-;19080:4;19118:2;19107:9;19103:18;19095:26;;19167:9;19161:4;19157:20;19153:1;19142:9;19138:17;19131:47;19195:131;19321:4;19195:131;:::i;:::-;19187:139;;18914:419;;;:::o;19339:182::-;19479:34;19475:1;19467:6;19463:14;19456:58;19339:182;:::o;19527:366::-;19669:3;19690:67;19754:2;19749:3;19690:67;:::i;:::-;19683:74;;19766:93;19855:3;19766:93;:::i;:::-;19884:2;19879:3;19875:12;19868:19;;19527:366;;;:::o;19899:419::-;20065:4;20103:2;20092:9;20088:18;20080:26;;20152:9;20146:4;20142:20;20138:1;20127:9;20123:17;20116:47;20180:131;20306:4;20180:131;:::i;:::-;20172:139;;19899:419;;;:::o;20324:161::-;20464:13;20460:1;20452:6;20448:14;20441:37;20324:161;:::o;20491:366::-;20633:3;20654:67;20718:2;20713:3;20654:67;:::i;:::-;20647:74;;20730:93;20819:3;20730:93;:::i;:::-;20848:2;20843:3;20839:12;20832:19;;20491:366;;;:::o;20863:419::-;21029:4;21067:2;21056:9;21052:18;21044:26;;21116:9;21110:4;21106:20;21102:1;21091:9;21087:17;21080:47;21144:131;21270:4;21144:131;:::i;:::-;21136:139;;20863:419;;;:::o;21288:180::-;21336:77;21333:1;21326:88;21433:4;21430:1;21423:15;21457:4;21454:1;21447:15;21474:191;21514:4;21534:20;21552:1;21534:20;:::i;:::-;21529:25;;21568:20;21586:1;21568:20;:::i;:::-;21563:25;;21607:1;21604;21601:8;21598:34;;;21612:18;;:::i;:::-;21598:34;21657:1;21654;21650:9;21642:17;;21474:191;;;;:::o;21671:161::-;21811:13;21807:1;21799:6;21795:14;21788:37;21671:161;:::o;21838:366::-;21980:3;22001:67;22065:2;22060:3;22001:67;:::i;:::-;21994:74;;22077:93;22166:3;22077:93;:::i;:::-;22195:2;22190:3;22186:12;22179:19;;21838:366;;;:::o;22210:419::-;22376:4;22414:2;22403:9;22399:18;22391:26;;22463:9;22457:4;22453:20;22449:1;22438:9;22434:17;22427:47;22491:131;22617:4;22491:131;:::i;:::-;22483:139;;22210:419;;;:::o;22635:166::-;22775:18;22771:1;22763:6;22759:14;22752:42;22635:166;:::o;22807:366::-;22949:3;22970:67;23034:2;23029:3;22970:67;:::i;:::-;22963:74;;23046:93;23135:3;23046:93;:::i;:::-;23164:2;23159:3;23155:12;23148:19;;22807:366;;;:::o;23179:419::-;23345:4;23383:2;23372:9;23368:18;23360:26;;23432:9;23426:4;23422:20;23418:1;23407:9;23403:17;23396:47;23460:131;23586:4;23460:131;:::i;:::-;23452:139;;23179:419;;;:::o;23604:163::-;23744:15;23740:1;23732:6;23728:14;23721:39;23604:163;:::o;23773:366::-;23915:3;23936:67;24000:2;23995:3;23936:67;:::i;:::-;23929:74;;24012:93;24101:3;24012:93;:::i;:::-;24130:2;24125:3;24121:12;24114:19;;23773:366;;;:::o;24145:419::-;24311:4;24349:2;24338:9;24334:18;24326:26;;24398:9;24392:4;24388:20;24384:1;24373:9;24369:17;24362:47;24426:131;24552:4;24426:131;:::i;:::-;24418:139;;24145:419;;;:::o;24570:305::-;24610:3;24629:20;24647:1;24629:20;:::i;:::-;24624:25;;24663:20;24681:1;24663:20;:::i;:::-;24658:25;;24817:1;24749:66;24745:74;24742:1;24739:81;24736:107;;;24823:18;;:::i;:::-;24736:107;24867:1;24864;24860:9;24853:16;;24570:305;;;;:::o;24881:233::-;24920:3;24943:24;24961:5;24943:24;:::i;:::-;24934:33;;24989:66;24982:5;24979:77;24976:103;;;25059:18;;:::i;:::-;24976:103;25106:1;25099:5;25095:13;25088:20;;24881:233;;;:::o;25120:167::-;25260:19;25256:1;25248:6;25244:14;25237:43;25120:167;:::o;25293:366::-;25435:3;25456:67;25520:2;25515:3;25456:67;:::i;:::-;25449:74;;25532:93;25621:3;25532:93;:::i;:::-;25650:2;25645:3;25641:12;25634:19;;25293:366;;;:::o;25665:419::-;25831:4;25869:2;25858:9;25854:18;25846:26;;25918:9;25912:4;25908:20;25904:1;25893:9;25889:17;25882:47;25946:131;26072:4;25946:131;:::i;:::-;25938:139;;25665:419;;;:::o;26090:236::-;26230:34;26226:1;26218:6;26214:14;26207:58;26299:19;26294:2;26286:6;26282:15;26275:44;26090:236;:::o;26332:366::-;26474:3;26495:67;26559:2;26554:3;26495:67;:::i;:::-;26488:74;;26571:93;26660:3;26571:93;:::i;:::-;26689:2;26684:3;26680:12;26673:19;;26332:366;;;:::o;26704:419::-;26870:4;26908:2;26897:9;26893:18;26885:26;;26957:9;26951:4;26947:20;26943:1;26932:9;26928:17;26921:47;26985:131;27111:4;26985:131;:::i;:::-;26977:139;;26704:419;;;:::o;27129:228::-;27269:34;27265:1;27257:6;27253:14;27246:58;27338:11;27333:2;27325:6;27321:15;27314:36;27129:228;:::o;27363:366::-;27505:3;27526:67;27590:2;27585:3;27526:67;:::i;:::-;27519:74;;27602:93;27691:3;27602:93;:::i;:::-;27720:2;27715:3;27711:12;27704:19;;27363:366;;;:::o;27735:419::-;27901:4;27939:2;27928:9;27924:18;27916:26;;27988:9;27982:4;27978:20;27974:1;27963:9;27959:17;27952:47;28016:131;28142:4;28016:131;:::i;:::-;28008:139;;27735:419;;;:::o;28160:163::-;28300:15;28296:1;28288:6;28284:14;28277:39;28160:163;:::o;28329:366::-;28471:3;28492:67;28556:2;28551:3;28492:67;:::i;:::-;28485:74;;28568:93;28657:3;28568:93;:::i;:::-;28686:2;28681:3;28677:12;28670:19;;28329:366;;;:::o;28701:419::-;28867:4;28905:2;28894:9;28890:18;28882:26;;28954:9;28948:4;28944:20;28940:1;28929:9;28925:17;28918:47;28982:131;29108:4;28982:131;:::i;:::-;28974:139;;28701:419;;;:::o;29126:229::-;29266:34;29262:1;29254:6;29250:14;29243:58;29335:12;29330:2;29322:6;29318:15;29311:37;29126:229;:::o;29361:366::-;29503:3;29524:67;29588:2;29583:3;29524:67;:::i;:::-;29517:74;;29600:93;29689:3;29600:93;:::i;:::-;29718:2;29713:3;29709:12;29702:19;;29361:366;;;:::o;29733:419::-;29899:4;29937:2;29926:9;29922:18;29914:26;;29986:9;29980:4;29976:20;29972:1;29961:9;29957:17;29950:47;30014:131;30140:4;30014:131;:::i;:::-;30006:139;;29733:419;;;:::o;30158:181::-;30298:33;30294:1;30286:6;30282:14;30275:57;30158:181;:::o;30345:366::-;30487:3;30508:67;30572:2;30567:3;30508:67;:::i;:::-;30501:74;;30584:93;30673:3;30584:93;:::i;:::-;30702:2;30697:3;30693:12;30686:19;;30345:366;;;:::o;30717:419::-;30883:4;30921:2;30910:9;30906:18;30898:26;;30970:9;30964:4;30960:20;30956:1;30945:9;30941:17;30934:47;30998:131;31124:4;30998:131;:::i;:::-;30990:139;;30717:419;;;:::o;31142:156::-;31282:8;31278:1;31270:6;31266:14;31259:32;31142:156;:::o;31304:365::-;31446:3;31467:66;31531:1;31526:3;31467:66;:::i;:::-;31460:73;;31542:93;31631:3;31542:93;:::i;:::-;31660:2;31655:3;31651:12;31644:19;;31304:365;;;:::o;31675:419::-;31841:4;31879:2;31868:9;31864:18;31856:26;;31928:9;31922:4;31918:20;31914:1;31903:9;31899:17;31892:47;31956:131;32082:4;31956:131;:::i;:::-;31948:139;;31675:419;;;:::o;32100:174::-;32240:26;32236:1;32228:6;32224:14;32217:50;32100:174;:::o;32280:366::-;32422:3;32443:67;32507:2;32502:3;32443:67;:::i;:::-;32436:74;;32519:93;32608:3;32519:93;:::i;:::-;32637:2;32632:3;32628:12;32621:19;;32280:366;;;:::o;32652:419::-;32818:4;32856:2;32845:9;32841:18;32833:26;;32905:9;32899:4;32895:20;32891:1;32880:9;32876:17;32869:47;32933:131;33059:4;32933:131;:::i;:::-;32925:139;;32652:419;;;:::o;33077:168::-;33217:20;33213:1;33205:6;33201:14;33194:44;33077:168;:::o;33251:366::-;33393:3;33414:67;33478:2;33473:3;33414:67;:::i;:::-;33407:74;;33490:93;33579:3;33490:93;:::i;:::-;33608:2;33603:3;33599:12;33592:19;;33251:366;;;:::o;33623:419::-;33789:4;33827:2;33816:9;33812:18;33804:26;;33876:9;33870:4;33866:20;33862:1;33851:9;33847:17;33840:47;33904:131;34030:4;33904:131;:::i;:::-;33896:139;;33623:419;;;:::o;34048:160::-;34188:12;34184:1;34176:6;34172:14;34165:36;34048:160;:::o;34214:366::-;34356:3;34377:67;34441:2;34436:3;34377:67;:::i;:::-;34370:74;;34453:93;34542:3;34453:93;:::i;:::-;34571:2;34566:3;34562:12;34555:19;;34214:366;;;:::o;34586:419::-;34752:4;34790:2;34779:9;34775:18;34767:26;;34839:9;34833:4;34829:20;34825:1;34814:9;34810:17;34803:47;34867:131;34993:4;34867:131;:::i;:::-;34859:139;;34586:419;;;:::o;35011:148::-;35113:11;35150:3;35135:18;;35011:148;;;;:::o;35165:141::-;35214:4;35237:3;35229:11;;35260:3;35257:1;35250:14;35294:4;35291:1;35281:18;35273:26;;35165:141;;;:::o;35336:845::-;35439:3;35476:5;35470:12;35505:36;35531:9;35505:36;:::i;:::-;35557:89;35639:6;35634:3;35557:89;:::i;:::-;35550:96;;35677:1;35666:9;35662:17;35693:1;35688:137;;;;35839:1;35834:341;;;;35655:520;;35688:137;35772:4;35768:9;35757;35753:25;35748:3;35741:38;35808:6;35803:3;35799:16;35792:23;;35688:137;;35834:341;35901:38;35933:5;35901:38;:::i;:::-;35961:1;35975:154;35989:6;35986:1;35983:13;35975:154;;;36063:7;36057:14;36053:1;36048:3;36044:11;36037:35;36113:1;36104:7;36100:15;36089:26;;36011:4;36008:1;36004:12;35999:17;;35975:154;;;36158:6;36153:3;36149:16;36142:23;;35841:334;;35655:520;;35443:738;;35336:845;;;;:::o;36187:377::-;36293:3;36321:39;36354:5;36321:39;:::i;:::-;36376:89;36458:6;36453:3;36376:89;:::i;:::-;36369:96;;36474:52;36519:6;36514:3;36507:4;36500:5;36496:16;36474:52;:::i;:::-;36551:6;36546:3;36542:16;36535:23;;36297:267;36187:377;;;;:::o;36570:155::-;36710:7;36706:1;36698:6;36694:14;36687:31;36570:155;:::o;36731:400::-;36891:3;36912:84;36994:1;36989:3;36912:84;:::i;:::-;36905:91;;37005:93;37094:3;37005:93;:::i;:::-;37123:1;37118:3;37114:11;37107:18;;36731:400;;;:::o;37137:695::-;37415:3;37437:92;37525:3;37516:6;37437:92;:::i;:::-;37430:99;;37546:95;37637:3;37628:6;37546:95;:::i;:::-;37539:102;;37658:148;37802:3;37658:148;:::i;:::-;37651:155;;37823:3;37816:10;;37137:695;;;;;:::o;37838:125::-;37904:7;37933:24;37951:5;37933:24;:::i;:::-;37922:35;;37838:125;;;:::o;37969:180::-;38071:53;38118:5;38071:53;:::i;:::-;38064:5;38061:64;38051:92;;38139:1;38136;38129:12;38051:92;37969:180;:::o;38155:201::-;38241:5;38272:6;38266:13;38257:22;;38288:62;38344:5;38288:62;:::i;:::-;38155:201;;;;:::o;38362:409::-;38461:6;38510:2;38498:9;38489:7;38485:23;38481:32;38478:119;;;38516:79;;:::i;:::-;38478:119;38636:1;38661:93;38746:7;38737:6;38726:9;38722:22;38661:93;:::i;:::-;38651:103;;38607:157;38362:409;;;;:::o;38777:225::-;38917:34;38913:1;38905:6;38901:14;38894:58;38986:8;38981:2;38973:6;38969:15;38962:33;38777:225;:::o;39008:366::-;39150:3;39171:67;39235:2;39230:3;39171:67;:::i;:::-;39164:74;;39247:93;39336:3;39247:93;:::i;:::-;39365:2;39360:3;39356:12;39349:19;;39008:366;;;:::o;39380:419::-;39546:4;39584:2;39573:9;39569:18;39561:26;;39633:9;39627:4;39623:20;39619:1;39608:9;39604:17;39597:47;39661:131;39787:4;39661:131;:::i;:::-;39653:139;;39380:419;;;:::o;39805:231::-;39945:34;39941:1;39933:6;39929:14;39922:58;40014:14;40009:2;40001:6;39997:15;39990:39;39805:231;:::o;40042:366::-;40184:3;40205:67;40269:2;40264:3;40205:67;:::i;:::-;40198:74;;40281:93;40370:3;40281:93;:::i;:::-;40399:2;40394:3;40390:12;40383:19;;40042:366;;;:::o;40414:419::-;40580:4;40618:2;40607:9;40603:18;40595:26;;40667:9;40661:4;40657:20;40653:1;40642:9;40638:17;40631:47;40695:131;40821:4;40695:131;:::i;:::-;40687:139;;40414:419;;;:::o;40839:224::-;40979:34;40975:1;40967:6;40963:14;40956:58;41048:7;41043:2;41035:6;41031:15;41024:32;40839:224;:::o;41069:366::-;41211:3;41232:67;41296:2;41291:3;41232:67;:::i;:::-;41225:74;;41308:93;41397:3;41308:93;:::i;:::-;41426:2;41421:3;41417:12;41410:19;;41069:366;;;:::o;41441:419::-;41607:4;41645:2;41634:9;41630:18;41622:26;;41694:9;41688:4;41684:20;41680:1;41669:9;41665:17;41658:47;41722:131;41848:4;41722:131;:::i;:::-;41714:139;;41441:419;;;:::o;41866:223::-;42006:34;42002:1;41994:6;41990:14;41983:58;42075:6;42070:2;42062:6;42058:15;42051:31;41866:223;:::o;42095:366::-;42237:3;42258:67;42322:2;42317:3;42258:67;:::i;:::-;42251:74;;42334:93;42423:3;42334:93;:::i;:::-;42452:2;42447:3;42443:12;42436:19;;42095:366;;;:::o;42467:419::-;42633:4;42671:2;42660:9;42656:18;42648:26;;42720:9;42714:4;42710:20;42706:1;42695:9;42691:17;42684:47;42748:131;42874:4;42748:131;:::i;:::-;42740:139;;42467:419;;;:::o;42892:175::-;43032:27;43028:1;43020:6;43016:14;43009:51;42892:175;:::o;43073:366::-;43215:3;43236:67;43300:2;43295:3;43236:67;:::i;:::-;43229:74;;43312:93;43401:3;43312:93;:::i;:::-;43430:2;43425:3;43421:12;43414:19;;43073:366;;;:::o;43445:419::-;43611:4;43649:2;43638:9;43634:18;43626:26;;43698:9;43692:4;43688:20;43684:1;43673:9;43669:17;43662:47;43726:131;43852:4;43726:131;:::i;:::-;43718:139;;43445:419;;;:::o;43870:237::-;44010:34;44006:1;43998:6;43994:14;43987:58;44079:20;44074:2;44066:6;44062:15;44055:45;43870:237;:::o;44113:366::-;44255:3;44276:67;44340:2;44335:3;44276:67;:::i;:::-;44269:74;;44352:93;44441:3;44352:93;:::i;:::-;44470:2;44465:3;44461:12;44454:19;;44113:366;;;:::o;44485:419::-;44651:4;44689:2;44678:9;44674:18;44666:26;;44738:9;44732:4;44728:20;44724:1;44713:9;44709:17;44702:47;44766:131;44892:4;44766:131;:::i;:::-;44758:139;;44485:419;;;:::o;44910:180::-;44958:77;44955:1;44948:88;45055:4;45052:1;45045:15;45079:4;45076:1;45069:15;45096:185;45136:1;45153:20;45171:1;45153:20;:::i;:::-;45148:25;;45187:20;45205:1;45187:20;:::i;:::-;45182:25;;45226:1;45216:35;;45231:18;;:::i;:::-;45216:35;45273:1;45270;45266:9;45261:14;;45096:185;;;;:::o;45287:176::-;45319:1;45336:20;45354:1;45336:20;:::i;:::-;45331:25;;45370:20;45388:1;45370:20;:::i;:::-;45365:25;;45409:1;45399:35;;45414:18;;:::i;:::-;45399:35;45455:1;45452;45448:9;45443:14;;45287:176;;;;:::o;45469:98::-;45520:6;45554:5;45548:12;45538:22;;45469:98;;;:::o;45573:168::-;45656:11;45690:6;45685:3;45678:19;45730:4;45725:3;45721:14;45706:29;;45573:168;;;;:::o;45747:360::-;45833:3;45861:38;45893:5;45861:38;:::i;:::-;45915:70;45978:6;45973:3;45915:70;:::i;:::-;45908:77;;45994:52;46039:6;46034:3;46027:4;46020:5;46016:16;45994:52;:::i;:::-;46071:29;46093:6;46071:29;:::i;:::-;46066:3;46062:39;46055:46;;45837:270;45747:360;;;;:::o;46113:640::-;46308:4;46346:3;46335:9;46331:19;46323:27;;46360:71;46428:1;46417:9;46413:17;46404:6;46360:71;:::i;:::-;46441:72;46509:2;46498:9;46494:18;46485:6;46441:72;:::i;:::-;46523;46591:2;46580:9;46576:18;46567:6;46523:72;:::i;:::-;46642:9;46636:4;46632:20;46627:2;46616:9;46612:18;46605:48;46670:76;46741:4;46732:6;46670:76;:::i;:::-;46662:84;;46113:640;;;;;;;:::o;46759:141::-;46815:5;46846:6;46840:13;46831:22;;46862:32;46888:5;46862:32;:::i;:::-;46759:141;;;;:::o;46906:349::-;46975:6;47024:2;47012:9;47003:7;46999:23;46995:32;46992:119;;;47030:79;;:::i;:::-;46992:119;47150:1;47175:63;47230:7;47221:6;47210:9;47206:22;47175:63;:::i;:::-;47165:73;;47121:127;46906:349;;;;:::o;47261:182::-;47401:34;47397:1;47389:6;47385:14;47378:58;47261:182;:::o;47449:366::-;47591:3;47612:67;47676:2;47671:3;47612:67;:::i;:::-;47605:74;;47688:93;47777:3;47688:93;:::i;:::-;47806:2;47801:3;47797:12;47790:19;;47449:366;;;:::o;47821:419::-;47987:4;48025:2;48014:9;48010:18;48002:26;;48074:9;48068:4;48064:20;48060:1;48049:9;48045:17;48038:47;48102:131;48228:4;48102:131;:::i;:::-;48094:139;;47821:419;;;:::o;48246:178::-;48386:30;48382:1;48374:6;48370:14;48363:54;48246:178;:::o;48430:366::-;48572:3;48593:67;48657:2;48652:3;48593:67;:::i;:::-;48586:74;;48669:93;48758:3;48669:93;:::i;:::-;48787:2;48782:3;48778:12;48771:19;;48430:366;;;:::o;48802:419::-;48968:4;49006:2;48995:9;48991:18;48983:26;;49055:9;49049:4;49045:20;49041:1;49030:9;49026:17;49019:47;49083:131;49209:4;49083:131;:::i;:::-;49075:139;;48802:419;;;:::o

Swarm Source

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