ETH Price: $3,352.55 (-3.49%)

Token

MoonRaRa (RaRa)
 

Overview

Max Total Supply

5,555 RaRa

Holders

2,978

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 RaRa
0xe89c7ff9d7c289fe7816cf7a36632d662b35c7f7
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:
MoonRaRa

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-16
*/

// SPDX-License-Identifier: MIT

//...............................................................................................
//.MMMM.......MMMM.................................nRRRRRRRRR.............aRRRRRRRRR.............
//.MMMM......MMMMM.................................nRRRRRRRRRR............aRRRRRRRRRR............
//.MMMMM.....MMMMM.................................nRR...RRRRR............aRR...RRRRR............
//.MMMMM....MMMMMM..ooooooo....ooooooo..onnnnnnnn..nRR.....RRR..aaaaaaaa..aRR.....RRR..aaaaaaaa..
//.MMMMM....MMMMMM.Moooooooo..ooooooooo.onnnnnnnn..nRR....RRRR..aaaaaaaa..aRR....RRRR..aaaaaaaa..
//.MMMMMM..MMMMMMM.Mooooooooo.ooooooooo.onnnnnnnnn.nRRRRRRRRRR.Raaaaaaaa..aRRRRRRRRRR.Raaaaaaaa..
//.MMMMMM..MMMMMMM.Moo...oooooooo...ooo.onnn..nnnn.nRRRRRRRRR..Raaa.aaaaa.aRRRRRRRRR..Raaa.aaaa..
//.MMMMMMMMMMMMMMMMMoo...oooooooo...ooooonnn..nnnn.nRRRRRRRRRR..aaaaaaaaa.aRRRRRRRRRR..aaaaaaaa..
//.MMM.MMMMMMMMMMMMMoo...oooooooo...ooooonn...nnnn.nRR....RRRR.Raaaaaaaaa.aRR....RRRR.Raaaaaaaa..
//.MMM.MMMMMM.MMMM.Moo...oooooooo...ooooonn...nnnn.nRR....RRRR.Raaa..aaaa.aRR....RRRR.Raaa..aaa..
//.MMM.MMMMMM.MMMM.Mooo.oooooooooo.oooo.onn...nnnn.nRR.....RRR.Raa..aaaaa.aRR.....RRR.Raa..aaaa..
//.MMM..MMMM..MMMM.Moooooooo..ooooooooo.onn...nnnn.nRR.....RRR.Raaaaaaaaa.aRR.....RRR.Raaaaaaaa..
//.MMM..MMMM..MMMM..ooooooo....ooooooo..onn...nnnn.nRR.....RRRRRaaaaaaaaa.aRR.....RRRRRaaaaaaaa..
//....................ooo........ooo.............................aaa....................aaa......
//...............................................................................................

// 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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/new.sol




pragma solidity ^0.8.4;








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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

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

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);
    }
}
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
pragma solidity ^0.8.13;



abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
pragma solidity ^0.8.13;



abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
    pragma solidity ^0.8.7;
    
    contract MoonRaRa is ERC721A, DefaultOperatorFilterer , Ownable {
    using Strings for uint256;


  string private uriPrefix;
  string private uriSuffix = ".json";
  string public hiddenURL;

  
  

  uint256 public cost = 0.003 ether;
 
  

  uint16 public maxSupply = 7777;
  uint8 public maxMintAmountPerTx = 11;
  uint8 public maxFreeMintAmountPerWallet = 1;
                                                             
 
  bool public paused = true;
  bool public reveal = true;

   mapping (address => uint8) public NFTPerPublicAddress;

 
  
  
 
  

  constructor() ERC721A("MoonRaRa", "RaRa") {
  }


  
 
  function mint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerTx, "Exceeds max per transaction.");
    require(msg.sender == tx.origin , "No Bots Allowed");

    require(!paused, "The contract is paused!");
    
      if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
       
         
    }
    


    _safeMint(msg.sender , _mintAmount);

    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function  Airdrop(uint8 _amountPerAddress, address[] calldata addresses) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
     uint totalAmount =   _amountPerAddress * addresses.length;
    require(totalSupply + totalAmount <= maxSupply, "Exceeds max supply.");
     for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], _amountPerAddress);
        }

     delete _amountPerAddress;
     delete totalSupply;
  }

 

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }



   
  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
  
if ( reveal == false)
{
    return hiddenURL;
}
    

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


 function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
   delete _limit;

}

    
  

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }
   function setHiddenUri(string memory _uriPrefix) external onlyOwner {
    hiddenURL = _uriPrefix;
  }


  function setPaused() external onlyOwner {
    paused = !paused;
   
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;

  }

 function setRevealed() external onlyOwner{
     reveal = !reveal;
 }

  function setMaxMintAmountPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;

  }

 

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance ); 
       
  }


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

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"uint8","name":"_amountPerAddress","type":"uint8"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURL","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":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"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":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setHiddenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620004b5565b50660aa87bee538000600c55611e61600d60006101000a81548161ffff021916908361ffff160217905550600b600d60026101000a81548160ff021916908360ff1602179055506001600d60036101000a81548160ff021916908360ff1602179055506001600d60046101000a81548160ff0219169083151502179055506001600d60056101000a81548160ff021916908315150217905550348015620000f757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020017f4d6f6f6e526152610000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5261526100000000000000000000000000000000000000000000000000000000815250816002908051906020019062000193929190620004b5565b508060039080519060200190620001ac929190620004b5565b50620001bd620003e260201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003ba57801562000280576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000246929190620005aa565b600060405180830381600087803b1580156200026157600080fd5b505af115801562000276573d6000803e3d6000fd5b50505050620003b9565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200033a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000300929190620005aa565b600060405180830381600087803b1580156200031b57600080fd5b505af115801562000330573d6000803e3d6000fd5b50505050620003b8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003839190620005d7565b600060405180830381600087803b1580156200039e57600080fd5b505af1158015620003b3573d6000803e3d6000fd5b505050505b5b5b5050620003dc620003d0620003e760201b60201c565b620003ef60201b60201c565b62000658565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004c39062000623565b90600052602060002090601f016020900481019282620004e7576000855562000533565b82601f106200050257805160ff191683800117855562000533565b8280016001018555821562000533579182015b828111156200053257825182559160200191906001019062000515565b5b50905062000542919062000546565b5090565b5b808211156200056157600081600090555060010162000547565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005928262000565565b9050919050565b620005a48162000585565b82525050565b6000604082019050620005c1600083018562000599565b620005d0602083018462000599565b9392505050565b6000602082019050620005ee600083018462000599565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063c57607f821691505b602082108103620006525762000651620005f4565b5b50919050565b6148d380620006686000396000f3fe60806040526004361061021a5760003560e01c80636ecd230611610123578063aa062290116100ab578063e94053c71161006f578063e94053c714610760578063e985e9c51461079d578063eef440af146107da578063f2fde38b14610805578063f8bf51721461082e5761021a565b8063aa0622901461067d578063b88d4fde146106a6578063c87b56dd146106cf578063cffb6e201461070c578063d5abeb01146107355761021a565b80638da5cb5b116100f25780638da5cb5b146105a857806394354fd0146105d357806395d89b41146105fe578063a22cb46514610629578063a475b5dd146106525761021a565b80636ecd23061461050f57806370a082311461052b578063715018a6146105685780637ec4a6591461057f5761021a565b80632f6f98e1116101a657806342842e0e1161017557806342842e0e1461042c57806344a0d68a146104555780634d9c18481461047e5780635c975abb146104a75780636352211e146104d25761021a565b80632f6f98e1146103be57806337a66d85146103e75780633bd64968146103fe5780633ccfd60b146104155761021a565b8063095ea7b3116101ed578063095ea7b3146102ed5780631067fcc71461031657806313faede61461033f57806318160ddd1461036a57806323b872dd146103955761021a565b806301ffc9a71461021f57806306421c2f1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613722565b610859565b604051610253919061376a565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906137bf565b61093b565b005b34801561029157600080fd5b5061029a6109d7565b6040516102a79190613885565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906138dd565b610a69565b6040516102e4919061394b565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613992565b610ae5565b005b34801561032257600080fd5b5061033d60048036038101906103389190613b07565b610bef565b005b34801561034b57600080fd5b50610354610c85565b6040516103619190613b5f565b60405180910390f35b34801561037657600080fd5b5061037f610c8b565b60405161038c9190613b5f565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613b7a565b610ca2565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613bcd565b610e84565b005b3480156103f357600080fd5b506103fc610f91565b005b34801561040a57600080fd5b50610413611039565b005b34801561042157600080fd5b5061042a6110e1565b005b34801561043857600080fd5b50610453600480360381019061044e9190613b7a565b6111ac565b005b34801561046157600080fd5b5061047c600480360381019061047791906138dd565b61138e565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613c46565b611414565b005b3480156104b357600080fd5b506104bc6114b2565b6040516104c9919061376a565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906138dd565b6114c5565b604051610506919061394b565b60405180910390f35b61052960048036038101906105249190613c46565b6114db565b005b34801561053757600080fd5b50610552600480360381019061054d9190613c73565b611853565b60405161055f9190613b5f565b60405180910390f35b34801561057457600080fd5b5061057d611922565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613b07565b6119aa565b005b3480156105b457600080fd5b506105bd611a40565b6040516105ca919061394b565b60405180910390f35b3480156105df57600080fd5b506105e8611a6a565b6040516105f59190613caf565b60405180910390f35b34801561060a57600080fd5b50610613611a7d565b6040516106209190613885565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613cf6565b611b0f565b005b34801561065e57600080fd5b50610667611c86565b604051610674919061376a565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613c46565b611c99565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190613dd7565b611d33565b005b3480156106db57600080fd5b506106f660048036038101906106f191906138dd565b611f18565b6040516107039190613885565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613eba565b612070565b005b34801561074157600080fd5b5061074a6121d9565b6040516107579190613f29565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190613c73565b6121ed565b6040516107949190613caf565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613f44565b61220d565b6040516107d1919061376a565b60405180910390f35b3480156107e657600080fd5b506107ef6122a1565b6040516107fc9190613885565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613c73565b61232f565b005b34801561083a57600080fd5b50610843612426565b6040516108509190613caf565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610934575061093382612439565b5b9050919050565b6109436124a3565b73ffffffffffffffffffffffffffffffffffffffff16610961611a40565b73ffffffffffffffffffffffffffffffffffffffff16146109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90613fd0565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b6060600280546109e69061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a129061401f565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050905090565b6000610a74826124ab565b610aaa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af0826114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b57576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b766124a3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba85750610ba681610ba16124a3565b61220d565b155b15610bdf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bea8383836124f9565b505050565b610bf76124a3565b73ffffffffffffffffffffffffffffffffffffffff16610c15611a40565b73ffffffffffffffffffffffffffffffffffffffff1614610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613fd0565b60405180910390fd5b80600b9080519060200190610c819291906135d0565b5050565b600c5481565b6000610c956125ab565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e72573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d1457610d0f8484846125b0565b610e7e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d5d929190614050565b602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e919061408e565b8015610e3057506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610dee929190614050565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f919061408e565b5b610e7157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e68919061394b565b60405180910390fd5b5b610e7d8484846125b0565b5b50505050565b610e8c6124a3565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611a40565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790613fd0565b60405180910390fd5b6000610f0a610c8b565b9050600d60009054906101000a900461ffff1661ffff168382610f2d91906140ea565b61ffff161115610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f699061416e565b60405180910390fd5b610f80828461ffff166125c0565b600092506000915060009050505050565b610f996124a3565b73ffffffffffffffffffffffffffffffffffffffff16610fb7611a40565b73ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490613fd0565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b6110416124a3565b73ffffffffffffffffffffffffffffffffffffffff1661105f611a40565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613fd0565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b6110e96124a3565b73ffffffffffffffffffffffffffffffffffffffff16611107611a40565b73ffffffffffffffffffffffffffffffffffffffff161461115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613fd0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a8573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361121e576112198484846125de565b611388565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611267929190614050565b602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a8919061408e565b801561133a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112f8929190614050565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611339919061408e565b5b61137b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611372919061394b565b60405180910390fd5b5b6113878484846125de565b5b50505050565b6113966124a3565b73ffffffffffffffffffffffffffffffffffffffff166113b4611a40565b73ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613fd0565b60405180910390fd5b80600c8190555050565b61141c6124a3565b73ffffffffffffffffffffffffffffffffffffffff1661143a611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613fd0565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b600d60049054906101000a900460ff1681565b60006114d0826125fe565b600001519050919050565b60006114e5610c8b565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff168361155c91906140ea565b61ffff1611156115a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115989061416e565b60405180910390fd5b600d60029054906101000a900460ff1660ff1681846115c0919061418e565b60ff161115611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90614211565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116699061427d565b60405180910390fd5b600d60049054906101000a900460ff16156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906142e9565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff1610611736578260ff16600c546116ef9190614309565b341015611731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611728906143af565b60405180910390fd5b6117d6565b60008184611744919061418e565b9050600d60039054906101000a900460ff1660ff168160ff1611156117d457600d60039054906101000a900460ff168161177e91906143cf565b90508060ff16600c546117919190614309565b3410156117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca906143af565b60405180910390fd5b5b505b6117e3338460ff166125c0565b80836117ef919061418e565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61192a6124a3565b73ffffffffffffffffffffffffffffffffffffffff16611948611a40565b73ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590613fd0565b60405180910390fd5b6119a8600061288d565b565b6119b26124a3565b73ffffffffffffffffffffffffffffffffffffffff166119d0611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90613fd0565b60405180910390fd5b8060099080519060200190611a3c9291906135d0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b606060038054611a8c9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab89061401f565b8015611b055780601f10611ada57610100808354040283529160200191611b05565b820191906000526020600020905b815481529060010190602001808311611ae857829003601f168201915b5050505050905090565b611b176124a3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b886124a3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c356124a3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7a919061376a565b60405180910390a35050565b600d60059054906101000a900460ff1681565b611ca16124a3565b73ffffffffffffffffffffffffffffffffffffffff16611cbf611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90613fd0565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611f04573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611da657611da185858585612953565b611f11565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611def929190614050565b602060405180830381865afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e30919061408e565b8015611ec257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e80929190614050565b602060405180830381865afa158015611e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec1919061408e565b5b611f0357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611efa919061394b565b60405180910390fd5b5b611f1085858585612953565b5b5050505050565b6060611f23826124ab565b611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990614475565b60405180910390fd5b60001515600d60059054906101000a900460ff1615150361200f57600b8054611f8a9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb69061401f565b80156120035780601f10611fd857610100808354040283529160200191612003565b820191906000526020600020905b815481529060010190602001808311611fe657829003601f168201915b5050505050905061206b565b60006120196129cf565b905060008151116120395760405180602001604052806000815250612067565b8061204384612a61565b600a60405160200161205793929190614565565b6040516020818303038152906040525b9150505b919050565b6120786124a3565b73ffffffffffffffffffffffffffffffffffffffff16612096611a40565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e390613fd0565b60405180910390fd5b60006120f6610c8b565b90506000838390508560ff1661210c9190614309565b9050600d60009054906101000a900461ffff1661ffff16818361ffff166121339190614596565b1115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b9061416e565b60405180910390fd5b60005b848490508110156121c9576121b6858583818110612198576121976145ec565b5b90506020020160208101906121ad9190613c73565b8760ff166125c0565b80806121c19061461b565b915050612177565b5060009450600091505050505050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b80546122ae9061401f565b80601f01602080910402602001604051908101604052809291908181526020018280546122da9061401f565b80156123275780601f106122fc57610100808354040283529160200191612327565b820191906000526020600020905b81548152906001019060200180831161230a57829003601f168201915b505050505081565b6123376124a3565b73ffffffffffffffffffffffffffffffffffffffff16612355611a40565b73ffffffffffffffffffffffffffffffffffffffff16146123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290613fd0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906146d5565b60405180910390fd5b6124238161288d565b50565b600d60039054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816124b66125ab565b111580156124c5575060005482105b80156124f2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6125bb838383612bc1565b505050565b6125da828260405180602001604052806000815250613075565b5050565b6125f983838360405180602001604052806000815250611d33565b505050565b612606613656565b6000829050806126146125ab565b11158015612623575060005481105b15612856576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161285457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612738578092505050612888565b5b60011561285357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e578092505050612888565b612739565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61295e848484612bc1565b61297d8373ffffffffffffffffffffffffffffffffffffffff16613087565b80156129925750612990848484846130aa565b155b156129c9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546129de9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0a9061401f565b8015612a575780601f10612a2c57610100808354040283529160200191612a57565b820191906000526020600020905b815481529060010190602001808311612a3a57829003601f168201915b5050505050905090565b606060008203612aa8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bbc565b600082905060005b60008214612ada578080612ac39061461b565b915050600a82612ad39190614724565b9150612ab0565b60008167ffffffffffffffff811115612af657612af56139dc565b5b6040519080825280601f01601f191660200182016040528015612b285781602001600182028036833780820191505090505b5090505b60008514612bb557600182612b419190614755565b9150600a85612b509190614789565b6030612b5c9190614596565b60f81b818381518110612b7257612b716145ec565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bae9190614724565b9450612b2c565b8093505050505b919050565b6000612bcc826125fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c37576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612c586124a3565b73ffffffffffffffffffffffffffffffffffffffff161480612c875750612c8685612c816124a3565b61220d565b5b80612ccc5750612c956124a3565b73ffffffffffffffffffffffffffffffffffffffff16612cb484610a69565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612d05576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d7885858560016131fa565b612d84600084876124f9565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361300357600054821461300257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461306e8585856001613200565b5050505050565b6130828383836001613206565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d06124a3565b8786866040518563ffffffff1660e01b81526004016130f2949392919061480f565b6020604051808303816000875af192505050801561312e57506040513d601f19601f8201168201806040525081019061312b9190614870565b60015b6131a7573d806000811461315e576040519150601f19603f3d011682016040523d82523d6000602084013e613163565b606091505b50600081510361319f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613272576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036132ac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132b960008683876131fa565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561348357506134828773ffffffffffffffffffffffffffffffffffffffff16613087565b5b15613548575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134f860008884806001019550886130aa565b61352e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361348957826000541461354357600080fd5b6135b3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613549575b8160008190555050506135c96000868387613200565b5050505050565b8280546135dc9061401f565b90600052602060002090601f0160209004810192826135fe5760008555613645565b82601f1061361757805160ff1916838001178555613645565b82800160010185558215613645579182015b82811115613644578251825591602001919060010190613629565b5b5090506136529190613699565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136b257600081600090555060010161369a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136ff816136ca565b811461370a57600080fd5b50565b60008135905061371c816136f6565b92915050565b600060208284031215613738576137376136c0565b5b60006137468482850161370d565b91505092915050565b60008115159050919050565b6137648161374f565b82525050565b600060208201905061377f600083018461375b565b92915050565b600061ffff82169050919050565b61379c81613785565b81146137a757600080fd5b50565b6000813590506137b981613793565b92915050565b6000602082840312156137d5576137d46136c0565b5b60006137e3848285016137aa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561382657808201518184015260208101905061380b565b83811115613835576000848401525b50505050565b6000601f19601f8301169050919050565b6000613857826137ec565b61386181856137f7565b9350613871818560208601613808565b61387a8161383b565b840191505092915050565b6000602082019050818103600083015261389f818461384c565b905092915050565b6000819050919050565b6138ba816138a7565b81146138c557600080fd5b50565b6000813590506138d7816138b1565b92915050565b6000602082840312156138f3576138f26136c0565b5b6000613901848285016138c8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139358261390a565b9050919050565b6139458161392a565b82525050565b6000602082019050613960600083018461393c565b92915050565b61396f8161392a565b811461397a57600080fd5b50565b60008135905061398c81613966565b92915050565b600080604083850312156139a9576139a86136c0565b5b60006139b78582860161397d565b92505060206139c8858286016138c8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a148261383b565b810181811067ffffffffffffffff82111715613a3357613a326139dc565b5b80604052505050565b6000613a466136b6565b9050613a528282613a0b565b919050565b600067ffffffffffffffff821115613a7257613a716139dc565b5b613a7b8261383b565b9050602081019050919050565b82818337600083830152505050565b6000613aaa613aa584613a57565b613a3c565b905082815260208101848484011115613ac657613ac56139d7565b5b613ad1848285613a88565b509392505050565b600082601f830112613aee57613aed6139d2565b5b8135613afe848260208601613a97565b91505092915050565b600060208284031215613b1d57613b1c6136c0565b5b600082013567ffffffffffffffff811115613b3b57613b3a6136c5565b5b613b4784828501613ad9565b91505092915050565b613b59816138a7565b82525050565b6000602082019050613b746000830184613b50565b92915050565b600080600060608486031215613b9357613b926136c0565b5b6000613ba18682870161397d565b9350506020613bb28682870161397d565b9250506040613bc3868287016138c8565b9150509250925092565b60008060408385031215613be457613be36136c0565b5b6000613bf2858286016137aa565b9250506020613c038582860161397d565b9150509250929050565b600060ff82169050919050565b613c2381613c0d565b8114613c2e57600080fd5b50565b600081359050613c4081613c1a565b92915050565b600060208284031215613c5c57613c5b6136c0565b5b6000613c6a84828501613c31565b91505092915050565b600060208284031215613c8957613c886136c0565b5b6000613c978482850161397d565b91505092915050565b613ca981613c0d565b82525050565b6000602082019050613cc46000830184613ca0565b92915050565b613cd38161374f565b8114613cde57600080fd5b50565b600081359050613cf081613cca565b92915050565b60008060408385031215613d0d57613d0c6136c0565b5b6000613d1b8582860161397d565b9250506020613d2c85828601613ce1565b9150509250929050565b600067ffffffffffffffff821115613d5157613d506139dc565b5b613d5a8261383b565b9050602081019050919050565b6000613d7a613d7584613d36565b613a3c565b905082815260208101848484011115613d9657613d956139d7565b5b613da1848285613a88565b509392505050565b600082601f830112613dbe57613dbd6139d2565b5b8135613dce848260208601613d67565b91505092915050565b60008060008060808587031215613df157613df06136c0565b5b6000613dff8782880161397d565b9450506020613e108782880161397d565b9350506040613e21878288016138c8565b925050606085013567ffffffffffffffff811115613e4257613e416136c5565b5b613e4e87828801613da9565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613e7a57613e796139d2565b5b8235905067ffffffffffffffff811115613e9757613e96613e5a565b5b602083019150836020820283011115613eb357613eb2613e5f565b5b9250929050565b600080600060408486031215613ed357613ed26136c0565b5b6000613ee186828701613c31565b935050602084013567ffffffffffffffff811115613f0257613f016136c5565b5b613f0e86828701613e64565b92509250509250925092565b613f2381613785565b82525050565b6000602082019050613f3e6000830184613f1a565b92915050565b60008060408385031215613f5b57613f5a6136c0565b5b6000613f698582860161397d565b9250506020613f7a8582860161397d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fba6020836137f7565b9150613fc582613f84565b602082019050919050565b60006020820190508181036000830152613fe981613fad565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403757607f821691505b60208210810361404a57614049613ff0565b5b50919050565b6000604082019050614065600083018561393c565b614072602083018461393c565b9392505050565b60008151905061408881613cca565b92915050565b6000602082840312156140a4576140a36136c0565b5b60006140b284828501614079565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140f582613785565b915061410083613785565b92508261ffff03821115614117576141166140bb565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b60006141586013836137f7565b915061416382614122565b602082019050919050565b600060208201905081810360008301526141878161414b565b9050919050565b600061419982613c0d565b91506141a483613c0d565b92508260ff038211156141ba576141b96140bb565b5b828201905092915050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b60006141fb601c836137f7565b9150614206826141c5565b602082019050919050565b6000602082019050818103600083015261422a816141ee565b9050919050565b7f4e6f20426f747320416c6c6f7765640000000000000000000000000000000000600082015250565b6000614267600f836137f7565b915061427282614231565b602082019050919050565b600060208201905081810360008301526142968161425a565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006142d36017836137f7565b91506142de8261429d565b602082019050919050565b60006020820190508181036000830152614302816142c6565b9050919050565b6000614314826138a7565b915061431f836138a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614358576143576140bb565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006143996013836137f7565b91506143a482614363565b602082019050919050565b600060208201905081810360008301526143c88161438c565b9050919050565b60006143da82613c0d565b91506143e583613c0d565b9250828210156143f8576143f76140bb565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061445f602f836137f7565b915061446a82614403565b604082019050919050565b6000602082019050818103600083015261448e81614452565b9050919050565b600081905092915050565b60006144ab826137ec565b6144b58185614495565b93506144c5818560208601613808565b80840191505092915050565b60008190508160005260206000209050919050565b600081546144f38161401f565b6144fd8186614495565b9450600182166000811461451857600181146145295761455c565b60ff1983168652818601935061455c565b614532856144d1565b60005b8381101561455457815481890152600182019150602081019050614535565b838801955050505b50505092915050565b600061457182866144a0565b915061457d82856144a0565b915061458982846144e6565b9150819050949350505050565b60006145a1826138a7565b91506145ac836138a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e1576145e06140bb565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614626826138a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614658576146576140bb565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146bf6026836137f7565b91506146ca82614663565b604082019050919050565b600060208201905081810360008301526146ee816146b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061472f826138a7565b915061473a836138a7565b92508261474a576147496146f5565b5b828204905092915050565b6000614760826138a7565b915061476b836138a7565b92508282101561477e5761477d6140bb565b5b828203905092915050565b6000614794826138a7565b915061479f836138a7565b9250826147af576147ae6146f5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147e1826147ba565b6147eb81856147c5565b93506147fb818560208601613808565b6148048161383b565b840191505092915050565b6000608082019050614824600083018761393c565b614831602083018661393c565b61483e6040830185613b50565b818103606083015261485081846147d6565b905095945050505050565b60008151905061486a816136f6565b92915050565b600060208284031215614886576148856136c0565b5b60006148948482850161485b565b9150509291505056fea2646970667358221220ac10622dd34d27af10f2ee151d62e5df7a4e5bd939fe3149cbf604fc2b1656cc64736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636ecd230611610123578063aa062290116100ab578063e94053c71161006f578063e94053c714610760578063e985e9c51461079d578063eef440af146107da578063f2fde38b14610805578063f8bf51721461082e5761021a565b8063aa0622901461067d578063b88d4fde146106a6578063c87b56dd146106cf578063cffb6e201461070c578063d5abeb01146107355761021a565b80638da5cb5b116100f25780638da5cb5b146105a857806394354fd0146105d357806395d89b41146105fe578063a22cb46514610629578063a475b5dd146106525761021a565b80636ecd23061461050f57806370a082311461052b578063715018a6146105685780637ec4a6591461057f5761021a565b80632f6f98e1116101a657806342842e0e1161017557806342842e0e1461042c57806344a0d68a146104555780634d9c18481461047e5780635c975abb146104a75780636352211e146104d25761021a565b80632f6f98e1146103be57806337a66d85146103e75780633bd64968146103fe5780633ccfd60b146104155761021a565b8063095ea7b3116101ed578063095ea7b3146102ed5780631067fcc71461031657806313faede61461033f57806318160ddd1461036a57806323b872dd146103955761021a565b806301ffc9a71461021f57806306421c2f1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613722565b610859565b604051610253919061376a565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906137bf565b61093b565b005b34801561029157600080fd5b5061029a6109d7565b6040516102a79190613885565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906138dd565b610a69565b6040516102e4919061394b565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613992565b610ae5565b005b34801561032257600080fd5b5061033d60048036038101906103389190613b07565b610bef565b005b34801561034b57600080fd5b50610354610c85565b6040516103619190613b5f565b60405180910390f35b34801561037657600080fd5b5061037f610c8b565b60405161038c9190613b5f565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613b7a565b610ca2565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613bcd565b610e84565b005b3480156103f357600080fd5b506103fc610f91565b005b34801561040a57600080fd5b50610413611039565b005b34801561042157600080fd5b5061042a6110e1565b005b34801561043857600080fd5b50610453600480360381019061044e9190613b7a565b6111ac565b005b34801561046157600080fd5b5061047c600480360381019061047791906138dd565b61138e565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613c46565b611414565b005b3480156104b357600080fd5b506104bc6114b2565b6040516104c9919061376a565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f491906138dd565b6114c5565b604051610506919061394b565b60405180910390f35b61052960048036038101906105249190613c46565b6114db565b005b34801561053757600080fd5b50610552600480360381019061054d9190613c73565b611853565b60405161055f9190613b5f565b60405180910390f35b34801561057457600080fd5b5061057d611922565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613b07565b6119aa565b005b3480156105b457600080fd5b506105bd611a40565b6040516105ca919061394b565b60405180910390f35b3480156105df57600080fd5b506105e8611a6a565b6040516105f59190613caf565b60405180910390f35b34801561060a57600080fd5b50610613611a7d565b6040516106209190613885565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613cf6565b611b0f565b005b34801561065e57600080fd5b50610667611c86565b604051610674919061376a565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613c46565b611c99565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190613dd7565b611d33565b005b3480156106db57600080fd5b506106f660048036038101906106f191906138dd565b611f18565b6040516107039190613885565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613eba565b612070565b005b34801561074157600080fd5b5061074a6121d9565b6040516107579190613f29565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190613c73565b6121ed565b6040516107949190613caf565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613f44565b61220d565b6040516107d1919061376a565b60405180910390f35b3480156107e657600080fd5b506107ef6122a1565b6040516107fc9190613885565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613c73565b61232f565b005b34801561083a57600080fd5b50610843612426565b6040516108509190613caf565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610934575061093382612439565b5b9050919050565b6109436124a3565b73ffffffffffffffffffffffffffffffffffffffff16610961611a40565b73ffffffffffffffffffffffffffffffffffffffff16146109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90613fd0565b60405180910390fd5b80600d60006101000a81548161ffff021916908361ffff16021790555050565b6060600280546109e69061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a129061401f565b8015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050905090565b6000610a74826124ab565b610aaa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af0826114c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b57576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b766124a3565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba85750610ba681610ba16124a3565b61220d565b155b15610bdf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bea8383836124f9565b505050565b610bf76124a3565b73ffffffffffffffffffffffffffffffffffffffff16610c15611a40565b73ffffffffffffffffffffffffffffffffffffffff1614610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613fd0565b60405180910390fd5b80600b9080519060200190610c819291906135d0565b5050565b600c5481565b6000610c956125ab565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e72573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d1457610d0f8484846125b0565b610e7e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d5d929190614050565b602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e919061408e565b8015610e3057506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610dee929190614050565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f919061408e565b5b610e7157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e68919061394b565b60405180910390fd5b5b610e7d8484846125b0565b5b50505050565b610e8c6124a3565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611a40565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790613fd0565b60405180910390fd5b6000610f0a610c8b565b9050600d60009054906101000a900461ffff1661ffff168382610f2d91906140ea565b61ffff161115610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f699061416e565b60405180910390fd5b610f80828461ffff166125c0565b600092506000915060009050505050565b610f996124a3565b73ffffffffffffffffffffffffffffffffffffffff16610fb7611a40565b73ffffffffffffffffffffffffffffffffffffffff161461100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490613fd0565b60405180910390fd5b600d60049054906101000a900460ff1615600d60046101000a81548160ff021916908315150217905550565b6110416124a3565b73ffffffffffffffffffffffffffffffffffffffff1661105f611a40565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613fd0565b60405180910390fd5b600d60059054906101000a900460ff1615600d60056101000a81548160ff021916908315150217905550565b6110e96124a3565b73ffffffffffffffffffffffffffffffffffffffff16611107611a40565b73ffffffffffffffffffffffffffffffffffffffff161461115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613fd0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a8573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561137c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361121e576112198484846125de565b611388565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611267929190614050565b602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a8919061408e565b801561133a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016112f8929190614050565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611339919061408e565b5b61137b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611372919061394b565b60405180910390fd5b5b6113878484846125de565b5b50505050565b6113966124a3565b73ffffffffffffffffffffffffffffffffffffffff166113b4611a40565b73ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613fd0565b60405180910390fd5b80600c8190555050565b61141c6124a3565b73ffffffffffffffffffffffffffffffffffffffff1661143a611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613fd0565b60405180910390fd5b80600d60036101000a81548160ff021916908360ff1602179055506000905050565b600d60049054906101000a900460ff1681565b60006114d0826125fe565b600001519050919050565b60006114e5610c8b565b90506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600d60009054906101000a900461ffff1661ffff168360ff168361155c91906140ea565b61ffff1611156115a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115989061416e565b60405180910390fd5b600d60029054906101000a900460ff1660ff1681846115c0919061418e565b60ff161115611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90614211565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116699061427d565b60405180910390fd5b600d60049054906101000a900460ff16156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906142e9565b60405180910390fd5b600d60039054906101000a900460ff1660ff168160ff1610611736578260ff16600c546116ef9190614309565b341015611731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611728906143af565b60405180910390fd5b6117d6565b60008184611744919061418e565b9050600d60039054906101000a900460ff1660ff168160ff1611156117d457600d60039054906101000a900460ff168161177e91906143cf565b90508060ff16600c546117919190614309565b3410156117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca906143af565b60405180910390fd5b5b505b6117e3338460ff166125c0565b80836117ef919061418e565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61192a6124a3565b73ffffffffffffffffffffffffffffffffffffffff16611948611a40565b73ffffffffffffffffffffffffffffffffffffffff161461199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590613fd0565b60405180910390fd5b6119a8600061288d565b565b6119b26124a3565b73ffffffffffffffffffffffffffffffffffffffff166119d0611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90613fd0565b60405180910390fd5b8060099080519060200190611a3c9291906135d0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60029054906101000a900460ff1681565b606060038054611a8c9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab89061401f565b8015611b055780601f10611ada57610100808354040283529160200191611b05565b820191906000526020600020905b815481529060010190602001808311611ae857829003601f168201915b5050505050905090565b611b176124a3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b886124a3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c356124a3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7a919061376a565b60405180910390a35050565b600d60059054906101000a900460ff1681565b611ca16124a3565b73ffffffffffffffffffffffffffffffffffffffff16611cbf611a40565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90613fd0565b60405180910390fd5b80600d60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611f04573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611da657611da185858585612953565b611f11565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611def929190614050565b602060405180830381865afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e30919061408e565b8015611ec257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e80929190614050565b602060405180830381865afa158015611e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec1919061408e565b5b611f0357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611efa919061394b565b60405180910390fd5b5b611f1085858585612953565b5b5050505050565b6060611f23826124ab565b611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990614475565b60405180910390fd5b60001515600d60059054906101000a900460ff1615150361200f57600b8054611f8a9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb69061401f565b80156120035780601f10611fd857610100808354040283529160200191612003565b820191906000526020600020905b815481529060010190602001808311611fe657829003601f168201915b5050505050905061206b565b60006120196129cf565b905060008151116120395760405180602001604052806000815250612067565b8061204384612a61565b600a60405160200161205793929190614565565b6040516020818303038152906040525b9150505b919050565b6120786124a3565b73ffffffffffffffffffffffffffffffffffffffff16612096611a40565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e390613fd0565b60405180910390fd5b60006120f6610c8b565b90506000838390508560ff1661210c9190614309565b9050600d60009054906101000a900461ffff1661ffff16818361ffff166121339190614596565b1115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b9061416e565b60405180910390fd5b60005b848490508110156121c9576121b6858583818110612198576121976145ec565b5b90506020020160208101906121ad9190613c73565b8760ff166125c0565b80806121c19061461b565b915050612177565b5060009450600091505050505050565b600d60009054906101000a900461ffff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b80546122ae9061401f565b80601f01602080910402602001604051908101604052809291908181526020018280546122da9061401f565b80156123275780601f106122fc57610100808354040283529160200191612327565b820191906000526020600020905b81548152906001019060200180831161230a57829003601f168201915b505050505081565b6123376124a3565b73ffffffffffffffffffffffffffffffffffffffff16612355611a40565b73ffffffffffffffffffffffffffffffffffffffff16146123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290613fd0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361241a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612411906146d5565b60405180910390fd5b6124238161288d565b50565b600d60039054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816124b66125ab565b111580156124c5575060005482105b80156124f2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6125bb838383612bc1565b505050565b6125da828260405180602001604052806000815250613075565b5050565b6125f983838360405180602001604052806000815250611d33565b505050565b612606613656565b6000829050806126146125ab565b11158015612623575060005481105b15612856576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161285457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612738578092505050612888565b5b60011561285357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e578092505050612888565b612739565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61295e848484612bc1565b61297d8373ffffffffffffffffffffffffffffffffffffffff16613087565b80156129925750612990848484846130aa565b155b156129c9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546129de9061401f565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0a9061401f565b8015612a575780601f10612a2c57610100808354040283529160200191612a57565b820191906000526020600020905b815481529060010190602001808311612a3a57829003601f168201915b5050505050905090565b606060008203612aa8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bbc565b600082905060005b60008214612ada578080612ac39061461b565b915050600a82612ad39190614724565b9150612ab0565b60008167ffffffffffffffff811115612af657612af56139dc565b5b6040519080825280601f01601f191660200182016040528015612b285781602001600182028036833780820191505090505b5090505b60008514612bb557600182612b419190614755565b9150600a85612b509190614789565b6030612b5c9190614596565b60f81b818381518110612b7257612b716145ec565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bae9190614724565b9450612b2c565b8093505050505b919050565b6000612bcc826125fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c37576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612c586124a3565b73ffffffffffffffffffffffffffffffffffffffff161480612c875750612c8685612c816124a3565b61220d565b5b80612ccc5750612c956124a3565b73ffffffffffffffffffffffffffffffffffffffff16612cb484610a69565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612d05576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d7885858560016131fa565b612d84600084876124f9565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361300357600054821461300257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461306e8585856001613200565b5050505050565b6130828383836001613206565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d06124a3565b8786866040518563ffffffff1660e01b81526004016130f2949392919061480f565b6020604051808303816000875af192505050801561312e57506040513d601f19601f8201168201806040525081019061312b9190614870565b60015b6131a7573d806000811461315e576040519150601f19603f3d011682016040523d82523d6000602084013e613163565b606091505b50600081510361319f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613272576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036132ac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132b960008683876131fa565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561348357506134828773ffffffffffffffffffffffffffffffffffffffff16613087565b5b15613548575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134f860008884806001019550886130aa565b61352e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361348957826000541461354357600080fd5b6135b3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613549575b8160008190555050506135c96000868387613200565b5050505050565b8280546135dc9061401f565b90600052602060002090601f0160209004810192826135fe5760008555613645565b82601f1061361757805160ff1916838001178555613645565b82800160010185558215613645579182015b82811115613644578251825591602001919060010190613629565b5b5090506136529190613699565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136b257600081600090555060010161369a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136ff816136ca565b811461370a57600080fd5b50565b60008135905061371c816136f6565b92915050565b600060208284031215613738576137376136c0565b5b60006137468482850161370d565b91505092915050565b60008115159050919050565b6137648161374f565b82525050565b600060208201905061377f600083018461375b565b92915050565b600061ffff82169050919050565b61379c81613785565b81146137a757600080fd5b50565b6000813590506137b981613793565b92915050565b6000602082840312156137d5576137d46136c0565b5b60006137e3848285016137aa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561382657808201518184015260208101905061380b565b83811115613835576000848401525b50505050565b6000601f19601f8301169050919050565b6000613857826137ec565b61386181856137f7565b9350613871818560208601613808565b61387a8161383b565b840191505092915050565b6000602082019050818103600083015261389f818461384c565b905092915050565b6000819050919050565b6138ba816138a7565b81146138c557600080fd5b50565b6000813590506138d7816138b1565b92915050565b6000602082840312156138f3576138f26136c0565b5b6000613901848285016138c8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139358261390a565b9050919050565b6139458161392a565b82525050565b6000602082019050613960600083018461393c565b92915050565b61396f8161392a565b811461397a57600080fd5b50565b60008135905061398c81613966565b92915050565b600080604083850312156139a9576139a86136c0565b5b60006139b78582860161397d565b92505060206139c8858286016138c8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a148261383b565b810181811067ffffffffffffffff82111715613a3357613a326139dc565b5b80604052505050565b6000613a466136b6565b9050613a528282613a0b565b919050565b600067ffffffffffffffff821115613a7257613a716139dc565b5b613a7b8261383b565b9050602081019050919050565b82818337600083830152505050565b6000613aaa613aa584613a57565b613a3c565b905082815260208101848484011115613ac657613ac56139d7565b5b613ad1848285613a88565b509392505050565b600082601f830112613aee57613aed6139d2565b5b8135613afe848260208601613a97565b91505092915050565b600060208284031215613b1d57613b1c6136c0565b5b600082013567ffffffffffffffff811115613b3b57613b3a6136c5565b5b613b4784828501613ad9565b91505092915050565b613b59816138a7565b82525050565b6000602082019050613b746000830184613b50565b92915050565b600080600060608486031215613b9357613b926136c0565b5b6000613ba18682870161397d565b9350506020613bb28682870161397d565b9250506040613bc3868287016138c8565b9150509250925092565b60008060408385031215613be457613be36136c0565b5b6000613bf2858286016137aa565b9250506020613c038582860161397d565b9150509250929050565b600060ff82169050919050565b613c2381613c0d565b8114613c2e57600080fd5b50565b600081359050613c4081613c1a565b92915050565b600060208284031215613c5c57613c5b6136c0565b5b6000613c6a84828501613c31565b91505092915050565b600060208284031215613c8957613c886136c0565b5b6000613c978482850161397d565b91505092915050565b613ca981613c0d565b82525050565b6000602082019050613cc46000830184613ca0565b92915050565b613cd38161374f565b8114613cde57600080fd5b50565b600081359050613cf081613cca565b92915050565b60008060408385031215613d0d57613d0c6136c0565b5b6000613d1b8582860161397d565b9250506020613d2c85828601613ce1565b9150509250929050565b600067ffffffffffffffff821115613d5157613d506139dc565b5b613d5a8261383b565b9050602081019050919050565b6000613d7a613d7584613d36565b613a3c565b905082815260208101848484011115613d9657613d956139d7565b5b613da1848285613a88565b509392505050565b600082601f830112613dbe57613dbd6139d2565b5b8135613dce848260208601613d67565b91505092915050565b60008060008060808587031215613df157613df06136c0565b5b6000613dff8782880161397d565b9450506020613e108782880161397d565b9350506040613e21878288016138c8565b925050606085013567ffffffffffffffff811115613e4257613e416136c5565b5b613e4e87828801613da9565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613e7a57613e796139d2565b5b8235905067ffffffffffffffff811115613e9757613e96613e5a565b5b602083019150836020820283011115613eb357613eb2613e5f565b5b9250929050565b600080600060408486031215613ed357613ed26136c0565b5b6000613ee186828701613c31565b935050602084013567ffffffffffffffff811115613f0257613f016136c5565b5b613f0e86828701613e64565b92509250509250925092565b613f2381613785565b82525050565b6000602082019050613f3e6000830184613f1a565b92915050565b60008060408385031215613f5b57613f5a6136c0565b5b6000613f698582860161397d565b9250506020613f7a8582860161397d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fba6020836137f7565b9150613fc582613f84565b602082019050919050565b60006020820190508181036000830152613fe981613fad565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403757607f821691505b60208210810361404a57614049613ff0565b5b50919050565b6000604082019050614065600083018561393c565b614072602083018461393c565b9392505050565b60008151905061408881613cca565b92915050565b6000602082840312156140a4576140a36136c0565b5b60006140b284828501614079565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140f582613785565b915061410083613785565b92508261ffff03821115614117576141166140bb565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b60006141586013836137f7565b915061416382614122565b602082019050919050565b600060208201905081810360008301526141878161414b565b9050919050565b600061419982613c0d565b91506141a483613c0d565b92508260ff038211156141ba576141b96140bb565b5b828201905092915050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b60006141fb601c836137f7565b9150614206826141c5565b602082019050919050565b6000602082019050818103600083015261422a816141ee565b9050919050565b7f4e6f20426f747320416c6c6f7765640000000000000000000000000000000000600082015250565b6000614267600f836137f7565b915061427282614231565b602082019050919050565b600060208201905081810360008301526142968161425a565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006142d36017836137f7565b91506142de8261429d565b602082019050919050565b60006020820190508181036000830152614302816142c6565b9050919050565b6000614314826138a7565b915061431f836138a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614358576143576140bb565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006143996013836137f7565b91506143a482614363565b602082019050919050565b600060208201905081810360008301526143c88161438c565b9050919050565b60006143da82613c0d565b91506143e583613c0d565b9250828210156143f8576143f76140bb565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061445f602f836137f7565b915061446a82614403565b604082019050919050565b6000602082019050818103600083015261448e81614452565b9050919050565b600081905092915050565b60006144ab826137ec565b6144b58185614495565b93506144c5818560208601613808565b80840191505092915050565b60008190508160005260206000209050919050565b600081546144f38161401f565b6144fd8186614495565b9450600182166000811461451857600181146145295761455c565b60ff1983168652818601935061455c565b614532856144d1565b60005b8381101561455457815481890152600182019150602081019050614535565b838801955050505b50505092915050565b600061457182866144a0565b915061457d82856144a0565b915061458982846144e6565b9150819050949350505050565b60006145a1826138a7565b91506145ac836138a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e1576145e06140bb565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614626826138a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614658576146576140bb565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146bf6026836137f7565b91506146ca82614663565b604082019050919050565b600060208201905081810360008301526146ee816146b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061472f826138a7565b915061473a836138a7565b92508261474a576147496146f5565b5b828204905092915050565b6000614760826138a7565b915061476b836138a7565b92508282101561477e5761477d6140bb565b5b828203905092915050565b6000614794826138a7565b915061479f836138a7565b9250826147af576147ae6146f5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147e1826147ba565b6147eb81856147c5565b93506147fb818560208601613808565b6148048161383b565b840191505092915050565b6000608082019050614824600083018761393c565b614831602083018661393c565b61483e6040830185613b50565b818103606083015261485081846147d6565b905095945050505050565b60008151905061486a816136f6565b92915050565b600060208284031215614886576148856136c0565b5b60006148948482850161485b565b9150509291505056fea2646970667358221220ac10622dd34d27af10f2ee151d62e5df7a4e5bd939fe3149cbf604fc2b1656cc64736f6c634300080d0033

Deployed Bytecode Sourcemap

50136:4692:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26025:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52651:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29138:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30641:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30204:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53525:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50349:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25274:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54247:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51835:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53635:74;;;;;;;;;;;;;:::i;:::-;;53796:70;;;;;;;;;;;;;:::i;:::-;;53990:144;;;;;;;;;;;;;:::i;:::-;;54418:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53715:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53266:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50586:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28946:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50792:1035;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26394:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44847:103;;;;;;;;;;;;;:::i;:::-;;53418:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44195:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50431:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29307:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30917:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50616:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53872:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54597:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52763:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52167:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50396:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50649:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31275:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50309:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45105:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50472:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26025:305;26127:4;26179:25;26164:40;;;:11;:40;;;;:105;;;;26236:33;26221:48;;;:11;:48;;;;26164:105;:158;;;;26286:36;26310:11;26286:23;:36::i;:::-;26164:158;26144:178;;26025:305;;;:::o;52651:97::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52732:10:::1;52720:9;;:22;;;;;;;;;;;;;;;;;;52651:97:::0;:::o;29138:100::-;29192:13;29225:5;29218:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29138:100;:::o;30641:204::-;30709:7;30734:16;30742:7;30734;:16::i;:::-;30729:64;;30759:34;;;;;;;;;;;;;;30729:64;30813:15;:24;30829:7;30813:24;;;;;;;;;;;;;;;;;;;;;30806:31;;30641:204;;;:::o;30204:371::-;30277:13;30293:24;30309:7;30293:15;:24::i;:::-;30277:40;;30338:5;30332:11;;:2;:11;;;30328:48;;30352:24;;;;;;;;;;;;;;30328:48;30409:5;30393:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30419:37;30436:5;30443:12;:10;:12::i;:::-;30419:16;:37::i;:::-;30418:38;30393:63;30389:138;;;30480:35;;;;;;;;;;;;;;30389:138;30539:28;30548:2;30552:7;30561:5;30539:8;:28::i;:::-;30266:309;30204:371;;:::o;53525:102::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53611:10:::1;53599:9;:22;;;;;;;;;;;;:::i;:::-;;53525:102:::0;:::o;50349:33::-;;;;:::o;25274:303::-;25318:7;25543:15;:13;:15::i;:::-;25528:12;;25512:13;;:28;:46;25505:53;;25274:303;:::o;54247:163::-;54348:4;49157:1;47971:42;49111:43;;;:47;49107:699;;;49398:10;49390:18;;:4;:18;;;49386:85;;54365:37:::1;54384:4;54390:2;54394:7;54365:18;:37::i;:::-;49449:7:::0;;49386:85;47971:42;49531:40;;;49580:4;49587:10;49531:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;47971:42;49627:40;;;49676:4;49683;49627:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49531:157;49485:310;;49768:10;49749:30;;;;;;;;;;;:::i;:::-;;;;;;;;49485:310;49107:699;54365:37:::1;54384:4;54390:2;54394:7;54365:18;:37::i;:::-;54247:163:::0;;;;;:::o;51835:326::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51918:18:::1;51946:13;:11;:13::i;:::-;51918:42;;52004:9;;;;;;;;;;;51975:38;;51989:11;51975;:25;;;;:::i;:::-;:38;;;;51967:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52045:34;52055:9;52067:11;52045:34;;:9;:34::i;:::-;52087:18;;;52113:16;;;52137:18;;;51910:251;51835:326:::0;;:::o;53635:74::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53692:6:::1;;;;;;;;;;;53691:7;53682:6;;:16;;;;;;;;;;;;;;;;;;53635:74::o:0;53796:70::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53855:6:::1;;;;;;;;;;;53854:7;53845:6;;:16;;;;;;;;;;;;;;;;;;53796:70::o:0;53990:144::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54034:13:::1;54050:21;54034:37;;54087:10;54079:28;;:39;54108:8;54079:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54029:105;53990:144::o:0;54418:171::-;54523:4;49157:1;47971:42;49111:43;;;:47;49107:699;;;49398:10;49390:18;;:4;:18;;;49386:85;;54540:41:::1;54563:4;54569:2;54573:7;54540:22;:41::i;:::-;49449:7:::0;;49386:85;47971:42;49531:40;;;49580:4;49587:10;49531:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;47971:42;49627:40;;;49676:4;49683;49627:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49531:157;49485:310;;49768:10;49749:30;;;;;;;;;;;:::i;:::-;;;;;;;;49485:310;49107:699;54540:41:::1;54563:4;54569:2;54573:7;54540:22;:41::i;:::-;54418:171:::0;;;;;:::o;53715:76::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53778:5:::1;53771:4;:12;;;;53715:76:::0;:::o;53266:134::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53369:6:::1;53340:26;;:35;;;;;;;;;;;;;;;;;;53381:13;;;53266:134:::0;:::o;50586:25::-;;;;;;;;;;;;;:::o;28946:125::-;29010:7;29037:21;29050:7;29037:12;:21::i;:::-;:26;;;29030:33;;28946:125;;;:::o;50792:1035::-;50851:18;50879:13;:11;:13::i;:::-;50851:42;;50901:9;50913:19;:31;50933:10;50913:31;;;;;;;;;;;;;;;;;;;;;;;;;50901:43;;50988:9;;;;;;;;;;;50959:38;;50973:11;50959:25;;:11;:25;;;;:::i;:::-;:38;;;;50951:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51057:18;;;;;;;;;;;51036:39;;51050:3;51036:11;:17;;;;:::i;:::-;:39;;;;51028:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51137:9;51123:23;;:10;:23;;;51115:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51185:6;;;;;;;;;;;51184:7;51176:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51244:26;;;;;;;;;;;51237:33;;:3;:33;;;51234:417;;51312:11;51305:18;;:4;;:18;;;;:::i;:::-;51292:9;:31;;51284:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51234:417;;;51378:16;51411:3;51397:11;:17;;;;:::i;:::-;51378:36;;51441:26;;;;;;;;;;;51428:39;;:10;:39;;;51425:199;;;51514:26;;;;;;;;;;;51501:10;:39;;;;:::i;:::-;51488:52;;51579:10;51572:17;;:4;;:17;;;;:::i;:::-;51559:9;:30;;51551:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51425:199;51366:285;51234:417;51667:35;51677:10;51690:11;51667:35;;:9;:35::i;:::-;51759:3;51745:11;:17;;;;:::i;:::-;51711:19;:31;51731:10;51711:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;51777:18;;;51803;;;50843:984;;50792:1035;:::o;26394:206::-;26458:7;26499:1;26482:19;;:5;:19;;;26478:60;;26510:28;;;;;;;;;;;;;;26478:60;26564:12;:19;26577:5;26564:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26556:36;;26549:43;;26394:206;;;:::o;44847:103::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:30:::1;44939:1;44912:18;:30::i;:::-;44847:103::o:0;53418:102::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53504:10:::1;53492:9;:22;;;;;;;;;;;;:::i;:::-;;53418:102:::0;:::o;44195:87::-;44241:7;44268:6;;;;;;;;;;;44261:13;;44195:87;:::o;50431:36::-;;;;;;;;;;;;;:::o;29307:104::-;29363:13;29396:7;29389:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29307:104;:::o;30917:287::-;31028:12;:10;:12::i;:::-;31016:24;;:8;:24;;;31012:54;;31049:17;;;;;;;;;;;;;;31012:54;31124:8;31079:18;:32;31098:12;:10;:12::i;:::-;31079:32;;;;;;;;;;;;;;;:42;31112:8;31079:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31177:8;31148:48;;31163:12;:10;:12::i;:::-;31148:48;;;31187:8;31148:48;;;;;;:::i;:::-;;;;;;;;30917:287;;:::o;50616:25::-;;;;;;;;;;;;;:::o;53872:107::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53965:6:::1;53944:18;;:27;;;;;;;;;;;;;;;;;;53872:107:::0;:::o;54597:228::-;54748:4;49157:1;47971:42;49111:43;;;:47;49107:699;;;49398:10;49390:18;;:4;:18;;;49386:85;;54770:47:::1;54793:4;54799:2;54803:7;54812:4;54770:22;:47::i;:::-;49449:7:::0;;49386:85;47971:42;49531:40;;;49580:4;49587:10;49531:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;47971:42;49627:40;;;49676:4;49683;49627:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49531:157;49485:310;;49768:10;49749:30;;;;;;;;;;;:::i;:::-;;;;;;;;49485:310;49107:699;54770:47:::1;54793:4;54799:2;54803:7;54812:4;54770:22;:47::i;:::-;54597:228:::0;;;;;;:::o;52763:490::-;52862:13;52903:17;52911:8;52903:7;:17::i;:::-;52887:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;53013:5;53003:15;;:6;;;;;;;;;;;:15;;;52998:50;;53035:9;53028:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52998:50;53062:28;53093:10;:8;:10::i;:::-;53062:41;;53148:1;53123:14;53117:28;:32;:130;;;;;;;;;;;;;;;;;53185:14;53201:19;:8;:17;:19::i;:::-;53222:9;53168:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53117:130;53110:137;;;52763:490;;;;:::o;52167:473::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52267:18:::1;52295:13;:11;:13::i;:::-;52267:42;;52317:16;52358:9;;:16;;52338:17;:36;;;;;;:::i;:::-;52317:57;;52418:9;;;;;;;;;;;52389:38;;52403:11;52389;:25;;;;;;:::i;:::-;:38;;52381:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52464:9;52459:116;52483:9;;:16;;52479:1;:20;52459:116;;;52521:42;52531:9;;52541:1;52531:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52545:17;52521:42;;:9;:42::i;:::-;52501:3;;;;;:::i;:::-;;;;52459:116;;;;52584:24;;;52616:18;;;52259:381;;52167:473:::0;;;:::o;50396:30::-;;;;;;;;;;;;;:::o;50649:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;31275:164::-;31372:4;31396:18;:25;31415:5;31396:25;;;;;;;;;;;;;;;:35;31422:8;31396:35;;;;;;;;;;;;;;;;;;;;;;;;;31389:42;;31275:164;;;;:::o;50309:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45105:201::-;44426:12;:10;:12::i;:::-;44415:23;;:7;:5;:7::i;:::-;:23;;;44407:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45214:1:::1;45194:22;;:8;:22;;::::0;45186:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45270:28;45289:8;45270:18;:28::i;:::-;45105:201:::0;:::o;50472:43::-;;;;;;;;;;;;;:::o;15950:157::-;16035:4;16074:25;16059:40;;;:11;:40;;;;16052:47;;15950:157;;;:::o;4420:98::-;4473:7;4500:10;4493:17;;4420:98;:::o;32627:187::-;32684:4;32727:7;32708:15;:13;:15::i;:::-;:26;;:53;;;;;32748:13;;32738:7;:23;32708:53;:98;;;;;32779:11;:20;32791:7;32779:20;;;;;;;;;;;:27;;;;;;;;;;;;32778:28;32708:98;32701:105;;32627:187;;;:::o;40797:196::-;40939:2;40912:15;:24;40928:7;40912:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40977:7;40973:2;40957:28;;40966:5;40957:28;;;;;;;;;;;;40797:196;;;:::o;25048:92::-;25104:7;25048:92;:::o;31506:170::-;31640:28;31650:4;31656:2;31660:7;31640:9;:28::i;:::-;31506:170;;;:::o;32822:104::-;32891:27;32901:2;32905:8;32891:27;;;;;;;;;;;;:9;:27::i;:::-;32822:104;;:::o;31747:185::-;31885:39;31902:4;31908:2;31912:7;31885:39;;;;;;;;;;;;:16;:39::i;:::-;31747:185;;;:::o;27775:1109::-;27837:21;;:::i;:::-;27871:12;27886:7;27871:22;;27954:4;27935:15;:13;:15::i;:::-;:23;;:47;;;;;27969:13;;27962:4;:20;27935:47;27931:886;;;28003:31;28037:11;:17;28049:4;28037:17;;;;;;;;;;;28003:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28078:9;:16;;;28073:729;;28149:1;28123:28;;:9;:14;;;:28;;;28119:101;;28187:9;28180:16;;;;;;28119:101;28522:261;28529:4;28522:261;;;28562:6;;;;;;;;28607:11;:17;28619:4;28607:17;;;;;;;;;;;28595:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28681:1;28655:28;;:9;:14;;;:28;;;28651:109;;28723:9;28716:16;;;;;;28651:109;28522:261;;;28073:729;27984:833;27931:886;28845:31;;;;;;;;;;;;;;27775:1109;;;;:::o;45466:191::-;45540:16;45559:6;;;;;;;;;;;45540:25;;45585:8;45576:6;;:17;;;;;;;;;;;;;;;;;;45640:8;45609:40;;45630:8;45609:40;;;;;;;;;;;;45529:128;45466:191;:::o;32003:369::-;32170:28;32180:4;32186:2;32190:7;32170:9;:28::i;:::-;32213:15;:2;:13;;;:15::i;:::-;:76;;;;;32233:56;32264:4;32270:2;32274:7;32283:5;32233:30;:56::i;:::-;32232:57;32213:76;32209:156;;;32313:40;;;;;;;;;;;;;;32209:156;32003:369;;;;:::o;54142:97::-;54195:13;54224:9;54217:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54142:97;:::o;1982:723::-;2038:13;2268:1;2259:5;:10;2255:53;;2286:10;;;;;;;;;;;;;;;;;;;;;2255:53;2318:12;2333:5;2318:20;;2349:14;2374:78;2389:1;2381:4;:9;2374:78;;2407:8;;;;;:::i;:::-;;;;2438:2;2430:10;;;;;:::i;:::-;;;2374:78;;;2462:19;2494:6;2484:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2462:39;;2512:154;2528:1;2519:5;:10;2512:154;;2556:1;2546:11;;;;;:::i;:::-;;;2623:2;2615:5;:10;;;;:::i;:::-;2602:2;:24;;;;:::i;:::-;2589:39;;2572:6;2579;2572:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2652:2;2643:11;;;;;:::i;:::-;;;2512:154;;;2690:6;2676:21;;;;;1982:723;;;;:::o;35740:2130::-;35855:35;35893:21;35906:7;35893:12;:21::i;:::-;35855:59;;35953:4;35931:26;;:13;:18;;;:26;;;35927:67;;35966:28;;;;;;;;;;;;;;35927:67;36007:22;36049:4;36033:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;36070:36;36087:4;36093:12;:10;:12::i;:::-;36070:16;:36::i;:::-;36033:73;:126;;;;36147:12;:10;:12::i;:::-;36123:36;;:20;36135:7;36123:11;:20::i;:::-;:36;;;36033:126;36007:153;;36178:17;36173:66;;36204:35;;;;;;;;;;;;;;36173:66;36268:1;36254:16;;:2;:16;;;36250:52;;36279:23;;;;;;;;;;;;;;36250:52;36315:43;36337:4;36343:2;36347:7;36356:1;36315:21;:43::i;:::-;36423:35;36440:1;36444:7;36453:4;36423:8;:35::i;:::-;36784:1;36754:12;:18;36767:4;36754:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36828:1;36800:12;:16;36813:2;36800:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36846:31;36880:11;:20;36892:7;36880:20;;;;;;;;;;;36846:54;;36931:2;36915:8;:13;;;:18;;;;;;;;;;;;;;;;;;36981:15;36948:8;:23;;;:49;;;;;;;;;;;;;;;;;;37249:19;37281:1;37271:7;:11;37249:33;;37297:31;37331:11;:24;37343:11;37331:24;;;;;;;;;;;37297:58;;37399:1;37374:27;;:8;:13;;;;;;;;;;;;:27;;;37370:384;;37584:13;;37569:11;:28;37565:174;;37638:4;37622:8;:13;;;:20;;;;;;;;;;;;;;;;;;37691:13;:28;;;37665:8;:23;;;:54;;;;;;;;;;;;;;;;;;37565:174;37370:384;36729:1036;;;37801:7;37797:2;37782:27;;37791:4;37782:27;;;;;;;;;;;;37820:42;37841:4;37847:2;37851:7;37860:1;37820:20;:42::i;:::-;35844:2026;;35740:2130;;;:::o;33289:163::-;33412:32;33418:2;33422:8;33432:5;33439:4;33412:5;:32::i;:::-;33289:163;;;:::o;5867:326::-;5927:4;6184:1;6162:7;:19;;;:23;6155:30;;5867:326;;;:::o;41485:667::-;41648:4;41685:2;41669:36;;;41706:12;:10;:12::i;:::-;41720:4;41726:7;41735:5;41669:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41665:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41920:1;41903:6;:13;:18;41899:235;;41949:40;;;;;;;;;;;;;;41899:235;42092:6;42086:13;42077:6;42073:2;42069:15;42062:38;41665:480;41798:45;;;41788:55;;;:6;:55;;;;41781:62;;;41485:667;;;;;;:::o;42800:159::-;;;;;:::o;43618:158::-;;;;;:::o;33711:1775::-;33850:20;33873:13;;33850:36;;33915:1;33901:16;;:2;:16;;;33897:48;;33926:19;;;;;;;;;;;;;;33897:48;33972:1;33960:8;:13;33956:44;;33982:18;;;;;;;;;;;;;;33956:44;34013:61;34043:1;34047:2;34051:12;34065:8;34013:21;:61::i;:::-;34386:8;34351:12;:16;34364:2;34351:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34450:8;34410:12;:16;34423:2;34410:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34509:2;34476:11;:25;34488:12;34476:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34576:15;34526:11;:25;34538:12;34526:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34609:20;34632:12;34609:35;;34659:11;34688:8;34673:12;:23;34659:37;;34717:4;:23;;;;;34725:15;:2;:13;;;:15::i;:::-;34717:23;34713:641;;;34761:314;34817:12;34813:2;34792:38;;34809:1;34792:38;;;;;;;;;;;;34858:69;34897:1;34901:2;34905:14;;;;;;34921:5;34858:30;:69::i;:::-;34853:174;;34963:40;;;;;;;;;;;;;;34853:174;35070:3;35054:12;:19;34761:314;;35156:12;35139:13;;:29;35135:43;;35170:8;;;35135:43;34713:641;;;35219:120;35275:14;;;;;;35271:2;35250:40;;35267:1;35250:40;;;;;;;;;;;;35334:3;35318:12;:19;35219:120;;34713:641;35384:12;35368:13;:28;;;;34326:1082;;35418:60;35447:1;35451:2;35455:12;35469:8;35418:20;:60::i;:::-;33839:1647;33711:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:89::-;1554:7;1594:6;1587:5;1583:18;1572:29;;1518:89;;;:::o;1613:120::-;1685:23;1702:5;1685:23;:::i;:::-;1678:5;1675:34;1665:62;;1723:1;1720;1713:12;1665:62;1613:120;:::o;1739:137::-;1784:5;1822:6;1809:20;1800:29;;1838:32;1864:5;1838:32;:::i;:::-;1739:137;;;;:::o;1882:327::-;1940:6;1989:2;1977:9;1968:7;1964:23;1960:32;1957:119;;;1995:79;;:::i;:::-;1957:119;2115:1;2140:52;2184:7;2175:6;2164:9;2160:22;2140:52;:::i;:::-;2130:62;;2086:116;1882:327;;;;:::o;2215:99::-;2267:6;2301:5;2295:12;2285:22;;2215:99;;;:::o;2320:169::-;2404:11;2438:6;2433:3;2426:19;2478:4;2473:3;2469:14;2454:29;;2320:169;;;;:::o;2495:307::-;2563:1;2573:113;2587:6;2584:1;2581:13;2573:113;;;2672:1;2667:3;2663:11;2657:18;2653:1;2648:3;2644:11;2637:39;2609:2;2606:1;2602:10;2597:15;;2573:113;;;2704:6;2701:1;2698:13;2695:101;;;2784:1;2775:6;2770:3;2766:16;2759:27;2695:101;2544:258;2495:307;;;:::o;2808:102::-;2849:6;2900:2;2896:7;2891:2;2884:5;2880:14;2876:28;2866:38;;2808:102;;;:::o;2916:364::-;3004:3;3032:39;3065:5;3032:39;:::i;:::-;3087:71;3151:6;3146:3;3087:71;:::i;:::-;3080:78;;3167:52;3212:6;3207:3;3200:4;3193:5;3189:16;3167:52;:::i;:::-;3244:29;3266:6;3244:29;:::i;:::-;3239:3;3235:39;3228:46;;3008:272;2916:364;;;;:::o;3286:313::-;3399:4;3437:2;3426:9;3422:18;3414:26;;3486:9;3480:4;3476:20;3472:1;3461:9;3457:17;3450:47;3514:78;3587:4;3578:6;3514:78;:::i;:::-;3506:86;;3286:313;;;;:::o;3605:77::-;3642:7;3671:5;3660:16;;3605:77;;;:::o;3688:122::-;3761:24;3779:5;3761:24;:::i;:::-;3754:5;3751:35;3741:63;;3800:1;3797;3790:12;3741:63;3688:122;:::o;3816:139::-;3862:5;3900:6;3887:20;3878:29;;3916:33;3943:5;3916:33;:::i;:::-;3816:139;;;;:::o;3961:329::-;4020:6;4069:2;4057:9;4048:7;4044:23;4040:32;4037:119;;;4075:79;;:::i;:::-;4037:119;4195:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4166:117;3961:329;;;;:::o;4296:126::-;4333:7;4373:42;4366:5;4362:54;4351:65;;4296:126;;;:::o;4428:96::-;4465:7;4494:24;4512:5;4494:24;:::i;:::-;4483:35;;4428:96;;;:::o;4530:118::-;4617:24;4635:5;4617:24;:::i;:::-;4612:3;4605:37;4530:118;;:::o;4654:222::-;4747:4;4785:2;4774:9;4770:18;4762:26;;4798:71;4866:1;4855:9;4851:17;4842:6;4798:71;:::i;:::-;4654:222;;;;:::o;4882:122::-;4955:24;4973:5;4955:24;:::i;:::-;4948:5;4945:35;4935:63;;4994:1;4991;4984:12;4935:63;4882:122;:::o;5010:139::-;5056:5;5094:6;5081:20;5072:29;;5110:33;5137:5;5110:33;:::i;:::-;5010:139;;;;:::o;5155:474::-;5223:6;5231;5280:2;5268:9;5259:7;5255:23;5251:32;5248:119;;;5286:79;;:::i;:::-;5248:119;5406:1;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5377:117;5533:2;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5504:118;5155:474;;;;;:::o;5635:117::-;5744:1;5741;5734:12;5758:117;5867:1;5864;5857:12;5881:180;5929:77;5926:1;5919:88;6026:4;6023:1;6016:15;6050:4;6047:1;6040:15;6067:281;6150:27;6172:4;6150:27;:::i;:::-;6142:6;6138:40;6280:6;6268:10;6265:22;6244:18;6232:10;6229:34;6226:62;6223:88;;;6291:18;;:::i;:::-;6223:88;6331:10;6327:2;6320:22;6110:238;6067:281;;:::o;6354:129::-;6388:6;6415:20;;:::i;:::-;6405:30;;6444:33;6472:4;6464:6;6444:33;:::i;:::-;6354:129;;;:::o;6489:308::-;6551:4;6641:18;6633:6;6630:30;6627:56;;;6663:18;;:::i;:::-;6627:56;6701:29;6723:6;6701:29;:::i;:::-;6693:37;;6785:4;6779;6775:15;6767:23;;6489:308;;;:::o;6803:154::-;6887:6;6882:3;6877;6864:30;6949:1;6940:6;6935:3;6931:16;6924:27;6803:154;;;:::o;6963:412::-;7041:5;7066:66;7082:49;7124:6;7082:49;:::i;:::-;7066:66;:::i;:::-;7057:75;;7155:6;7148:5;7141:21;7193:4;7186:5;7182:16;7231:3;7222:6;7217:3;7213:16;7210:25;7207:112;;;7238:79;;:::i;:::-;7207:112;7328:41;7362:6;7357:3;7352;7328:41;:::i;:::-;7047:328;6963:412;;;;;:::o;7395:340::-;7451:5;7500:3;7493:4;7485:6;7481:17;7477:27;7467:122;;7508:79;;:::i;:::-;7467:122;7625:6;7612:20;7650:79;7725:3;7717:6;7710:4;7702:6;7698:17;7650:79;:::i;:::-;7641:88;;7457:278;7395:340;;;;:::o;7741:509::-;7810:6;7859:2;7847:9;7838:7;7834:23;7830:32;7827:119;;;7865:79;;:::i;:::-;7827:119;8013:1;8002:9;7998:17;7985:31;8043:18;8035:6;8032:30;8029:117;;;8065:79;;:::i;:::-;8029:117;8170:63;8225:7;8216:6;8205:9;8201:22;8170:63;:::i;:::-;8160:73;;7956:287;7741:509;;;;:::o;8256:118::-;8343:24;8361:5;8343:24;:::i;:::-;8338:3;8331:37;8256:118;;:::o;8380:222::-;8473:4;8511:2;8500:9;8496:18;8488:26;;8524:71;8592:1;8581:9;8577:17;8568:6;8524:71;:::i;:::-;8380:222;;;;:::o;8608:619::-;8685:6;8693;8701;8750:2;8738:9;8729:7;8725:23;8721:32;8718:119;;;8756:79;;:::i;:::-;8718:119;8876:1;8901:53;8946:7;8937:6;8926:9;8922:22;8901:53;:::i;:::-;8891:63;;8847:117;9003:2;9029:53;9074:7;9065:6;9054:9;9050:22;9029:53;:::i;:::-;9019:63;;8974:118;9131:2;9157:53;9202:7;9193:6;9182:9;9178:22;9157:53;:::i;:::-;9147:63;;9102:118;8608:619;;;;;:::o;9233:472::-;9300:6;9308;9357:2;9345:9;9336:7;9332:23;9328:32;9325:119;;;9363:79;;:::i;:::-;9325:119;9483:1;9508:52;9552:7;9543:6;9532:9;9528:22;9508:52;:::i;:::-;9498:62;;9454:116;9609:2;9635:53;9680:7;9671:6;9660:9;9656:22;9635:53;:::i;:::-;9625:63;;9580:118;9233:472;;;;;:::o;9711:86::-;9746:7;9786:4;9779:5;9775:16;9764:27;;9711:86;;;:::o;9803:118::-;9874:22;9890:5;9874:22;:::i;:::-;9867:5;9864:33;9854:61;;9911:1;9908;9901:12;9854:61;9803:118;:::o;9927:135::-;9971:5;10009:6;9996:20;9987:29;;10025:31;10050:5;10025:31;:::i;:::-;9927:135;;;;:::o;10068:325::-;10125:6;10174:2;10162:9;10153:7;10149:23;10145:32;10142:119;;;10180:79;;:::i;:::-;10142:119;10300:1;10325:51;10368:7;10359:6;10348:9;10344:22;10325:51;:::i;:::-;10315:61;;10271:115;10068:325;;;;:::o;10399:329::-;10458:6;10507:2;10495:9;10486:7;10482:23;10478:32;10475:119;;;10513:79;;:::i;:::-;10475:119;10633:1;10658:53;10703:7;10694:6;10683:9;10679:22;10658:53;:::i;:::-;10648:63;;10604:117;10399:329;;;;:::o;10734:112::-;10817:22;10833:5;10817:22;:::i;:::-;10812:3;10805:35;10734:112;;:::o;10852:214::-;10941:4;10979:2;10968:9;10964:18;10956:26;;10992:67;11056:1;11045:9;11041:17;11032:6;10992:67;:::i;:::-;10852:214;;;;:::o;11072:116::-;11142:21;11157:5;11142:21;:::i;:::-;11135:5;11132:32;11122:60;;11178:1;11175;11168:12;11122:60;11072:116;:::o;11194:133::-;11237:5;11275:6;11262:20;11253:29;;11291:30;11315:5;11291:30;:::i;:::-;11194:133;;;;:::o;11333:468::-;11398:6;11406;11455:2;11443:9;11434:7;11430:23;11426:32;11423:119;;;11461:79;;:::i;:::-;11423:119;11581:1;11606:53;11651:7;11642:6;11631:9;11627:22;11606:53;:::i;:::-;11596:63;;11552:117;11708:2;11734:50;11776:7;11767:6;11756:9;11752:22;11734:50;:::i;:::-;11724:60;;11679:115;11333:468;;;;;:::o;11807:307::-;11868:4;11958:18;11950:6;11947:30;11944:56;;;11980:18;;:::i;:::-;11944:56;12018:29;12040:6;12018:29;:::i;:::-;12010:37;;12102:4;12096;12092:15;12084:23;;11807:307;;;:::o;12120:410::-;12197:5;12222:65;12238:48;12279:6;12238:48;:::i;:::-;12222:65;:::i;:::-;12213:74;;12310:6;12303:5;12296:21;12348:4;12341:5;12337:16;12386:3;12377:6;12372:3;12368:16;12365:25;12362:112;;;12393:79;;:::i;:::-;12362:112;12483:41;12517:6;12512:3;12507;12483:41;:::i;:::-;12203:327;12120:410;;;;;:::o;12549:338::-;12604:5;12653:3;12646:4;12638:6;12634:17;12630:27;12620:122;;12661:79;;:::i;:::-;12620:122;12778:6;12765:20;12803:78;12877:3;12869:6;12862:4;12854:6;12850:17;12803:78;:::i;:::-;12794:87;;12610:277;12549:338;;;;:::o;12893:943::-;12988:6;12996;13004;13012;13061:3;13049:9;13040:7;13036:23;13032:33;13029:120;;;13068:79;;:::i;:::-;13029:120;13188:1;13213:53;13258:7;13249:6;13238:9;13234:22;13213:53;:::i;:::-;13203:63;;13159:117;13315:2;13341:53;13386:7;13377:6;13366:9;13362:22;13341:53;:::i;:::-;13331:63;;13286:118;13443:2;13469:53;13514:7;13505:6;13494:9;13490:22;13469:53;:::i;:::-;13459:63;;13414:118;13599:2;13588:9;13584:18;13571:32;13630:18;13622:6;13619:30;13616:117;;;13652:79;;:::i;:::-;13616:117;13757:62;13811:7;13802:6;13791:9;13787:22;13757:62;:::i;:::-;13747:72;;13542:287;12893:943;;;;;;;:::o;13842:117::-;13951:1;13948;13941:12;13965:117;14074:1;14071;14064:12;14105:568;14178:8;14188:6;14238:3;14231:4;14223:6;14219:17;14215:27;14205:122;;14246:79;;:::i;:::-;14205:122;14359:6;14346:20;14336:30;;14389:18;14381:6;14378:30;14375:117;;;14411:79;;:::i;:::-;14375:117;14525:4;14517:6;14513:17;14501:29;;14579:3;14571:4;14563:6;14559:17;14549:8;14545:32;14542:41;14539:128;;;14586:79;;:::i;:::-;14539:128;14105:568;;;;;:::o;14679:700::-;14772:6;14780;14788;14837:2;14825:9;14816:7;14812:23;14808:32;14805:119;;;14843:79;;:::i;:::-;14805:119;14963:1;14988:51;15031:7;15022:6;15011:9;15007:22;14988:51;:::i;:::-;14978:61;;14934:115;15116:2;15105:9;15101:18;15088:32;15147:18;15139:6;15136:30;15133:117;;;15169:79;;:::i;:::-;15133:117;15282:80;15354:7;15345:6;15334:9;15330:22;15282:80;:::i;:::-;15264:98;;;;15059:313;14679:700;;;;;:::o;15385:115::-;15470:23;15487:5;15470:23;:::i;:::-;15465:3;15458:36;15385:115;;:::o;15506:218::-;15597:4;15635:2;15624:9;15620:18;15612:26;;15648:69;15714:1;15703:9;15699:17;15690:6;15648:69;:::i;:::-;15506:218;;;;:::o;15730:474::-;15798:6;15806;15855:2;15843:9;15834:7;15830:23;15826:32;15823:119;;;15861:79;;:::i;:::-;15823:119;15981:1;16006:53;16051:7;16042:6;16031:9;16027:22;16006:53;:::i;:::-;15996:63;;15952:117;16108:2;16134:53;16179:7;16170:6;16159:9;16155:22;16134:53;:::i;:::-;16124:63;;16079:118;15730:474;;;;;:::o;16210:182::-;16350:34;16346:1;16338:6;16334:14;16327:58;16210:182;:::o;16398:366::-;16540:3;16561:67;16625:2;16620:3;16561:67;:::i;:::-;16554:74;;16637:93;16726:3;16637:93;:::i;:::-;16755:2;16750:3;16746:12;16739:19;;16398:366;;;:::o;16770:419::-;16936:4;16974:2;16963:9;16959:18;16951:26;;17023:9;17017:4;17013:20;17009:1;16998:9;16994:17;16987:47;17051:131;17177:4;17051:131;:::i;:::-;17043:139;;16770:419;;;:::o;17195:180::-;17243:77;17240:1;17233:88;17340:4;17337:1;17330:15;17364:4;17361:1;17354:15;17381:320;17425:6;17462:1;17456:4;17452:12;17442:22;;17509:1;17503:4;17499:12;17530:18;17520:81;;17586:4;17578:6;17574:17;17564:27;;17520:81;17648:2;17640:6;17637:14;17617:18;17614:38;17611:84;;17667:18;;:::i;:::-;17611:84;17432:269;17381:320;;;:::o;17707:332::-;17828:4;17866:2;17855:9;17851:18;17843:26;;17879:71;17947:1;17936:9;17932:17;17923:6;17879:71;:::i;:::-;17960:72;18028:2;18017:9;18013:18;18004:6;17960:72;:::i;:::-;17707:332;;;;;:::o;18045:137::-;18099:5;18130:6;18124:13;18115:22;;18146:30;18170:5;18146:30;:::i;:::-;18045:137;;;;:::o;18188:345::-;18255:6;18304:2;18292:9;18283:7;18279:23;18275:32;18272:119;;;18310:79;;:::i;:::-;18272:119;18430:1;18455:61;18508:7;18499:6;18488:9;18484:22;18455:61;:::i;:::-;18445:71;;18401:125;18188:345;;;;:::o;18539:180::-;18587:77;18584:1;18577:88;18684:4;18681:1;18674:15;18708:4;18705:1;18698:15;18725:242;18764:3;18783:19;18800:1;18783:19;:::i;:::-;18778:24;;18816:19;18833:1;18816:19;:::i;:::-;18811:24;;18909:1;18901:6;18897:14;18894:1;18891:21;18888:47;;;18915:18;;:::i;:::-;18888:47;18959:1;18956;18952:9;18945:16;;18725:242;;;;:::o;18973:169::-;19113:21;19109:1;19101:6;19097:14;19090:45;18973:169;:::o;19148:366::-;19290:3;19311:67;19375:2;19370:3;19311:67;:::i;:::-;19304:74;;19387:93;19476:3;19387:93;:::i;:::-;19505:2;19500:3;19496:12;19489:19;;19148:366;;;:::o;19520:419::-;19686:4;19724:2;19713:9;19709:18;19701:26;;19773:9;19767:4;19763:20;19759:1;19748:9;19744:17;19737:47;19801:131;19927:4;19801:131;:::i;:::-;19793:139;;19520:419;;;:::o;19945:237::-;19983:3;20002:18;20018:1;20002:18;:::i;:::-;19997:23;;20034:18;20050:1;20034:18;:::i;:::-;20029:23;;20124:1;20118:4;20114:12;20111:1;20108:19;20105:45;;;20130:18;;:::i;:::-;20105:45;20174:1;20171;20167:9;20160:16;;19945:237;;;;:::o;20188:178::-;20328:30;20324:1;20316:6;20312:14;20305:54;20188:178;:::o;20372:366::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20372:366;;;:::o;20744:419::-;20910:4;20948:2;20937:9;20933:18;20925:26;;20997:9;20991:4;20987:20;20983:1;20972:9;20968:17;20961:47;21025:131;21151:4;21025:131;:::i;:::-;21017:139;;20744:419;;;:::o;21169:165::-;21309:17;21305:1;21297:6;21293:14;21286:41;21169:165;:::o;21340:366::-;21482:3;21503:67;21567:2;21562:3;21503:67;:::i;:::-;21496:74;;21579:93;21668:3;21579:93;:::i;:::-;21697:2;21692:3;21688:12;21681:19;;21340:366;;;:::o;21712:419::-;21878:4;21916:2;21905:9;21901:18;21893:26;;21965:9;21959:4;21955:20;21951:1;21940:9;21936:17;21929:47;21993:131;22119:4;21993:131;:::i;:::-;21985:139;;21712:419;;;:::o;22137:173::-;22277:25;22273:1;22265:6;22261:14;22254:49;22137:173;:::o;22316:366::-;22458:3;22479:67;22543:2;22538:3;22479:67;:::i;:::-;22472:74;;22555:93;22644:3;22555:93;:::i;:::-;22673:2;22668:3;22664:12;22657:19;;22316:366;;;:::o;22688:419::-;22854:4;22892:2;22881:9;22877:18;22869:26;;22941:9;22935:4;22931:20;22927:1;22916:9;22912:17;22905:47;22969:131;23095:4;22969:131;:::i;:::-;22961:139;;22688:419;;;:::o;23113:348::-;23153:7;23176:20;23194:1;23176:20;:::i;:::-;23171:25;;23210:20;23228:1;23210:20;:::i;:::-;23205:25;;23398:1;23330:66;23326:74;23323:1;23320:81;23315:1;23308:9;23301:17;23297:105;23294:131;;;23405:18;;:::i;:::-;23294:131;23453:1;23450;23446:9;23435:20;;23113:348;;;;:::o;23467:169::-;23607:21;23603:1;23595:6;23591:14;23584:45;23467:169;:::o;23642:366::-;23784:3;23805:67;23869:2;23864:3;23805:67;:::i;:::-;23798:74;;23881:93;23970:3;23881:93;:::i;:::-;23999:2;23994:3;23990:12;23983:19;;23642:366;;;:::o;24014:419::-;24180:4;24218:2;24207:9;24203:18;24195:26;;24267:9;24261:4;24257:20;24253:1;24242:9;24238:17;24231:47;24295:131;24421:4;24295:131;:::i;:::-;24287:139;;24014:419;;;:::o;24439:185::-;24477:4;24497:18;24513:1;24497:18;:::i;:::-;24492:23;;24529:18;24545:1;24529:18;:::i;:::-;24524:23;;24566:1;24563;24560:8;24557:34;;;24571:18;;:::i;:::-;24557:34;24616:1;24613;24609:9;24601:17;;24439:185;;;;:::o;24630:234::-;24770:34;24766:1;24758:6;24754:14;24747:58;24839:17;24834:2;24826:6;24822:15;24815:42;24630:234;:::o;24870:366::-;25012:3;25033:67;25097:2;25092:3;25033:67;:::i;:::-;25026:74;;25109:93;25198:3;25109:93;:::i;:::-;25227:2;25222:3;25218:12;25211:19;;24870:366;;;:::o;25242:419::-;25408:4;25446:2;25435:9;25431:18;25423:26;;25495:9;25489:4;25485:20;25481:1;25470:9;25466:17;25459:47;25523:131;25649:4;25523:131;:::i;:::-;25515:139;;25242:419;;;:::o;25667:148::-;25769:11;25806:3;25791:18;;25667:148;;;;:::o;25821:377::-;25927:3;25955:39;25988:5;25955:39;:::i;:::-;26010:89;26092:6;26087:3;26010:89;:::i;:::-;26003:96;;26108:52;26153:6;26148:3;26141:4;26134:5;26130:16;26108:52;:::i;:::-;26185:6;26180:3;26176:16;26169:23;;25931:267;25821:377;;;;:::o;26204:141::-;26253:4;26276:3;26268:11;;26299:3;26296:1;26289:14;26333:4;26330:1;26320:18;26312:26;;26204:141;;;:::o;26375:845::-;26478:3;26515:5;26509:12;26544:36;26570:9;26544:36;:::i;:::-;26596:89;26678:6;26673:3;26596:89;:::i;:::-;26589:96;;26716:1;26705:9;26701:17;26732:1;26727:137;;;;26878:1;26873:341;;;;26694:520;;26727:137;26811:4;26807:9;26796;26792:25;26787:3;26780:38;26847:6;26842:3;26838:16;26831:23;;26727:137;;26873:341;26940:38;26972:5;26940:38;:::i;:::-;27000:1;27014:154;27028:6;27025:1;27022:13;27014:154;;;27102:7;27096:14;27092:1;27087:3;27083:11;27076:35;27152:1;27143:7;27139:15;27128:26;;27050:4;27047:1;27043:12;27038:17;;27014:154;;;27197:6;27192:3;27188:16;27181:23;;26880:334;;26694:520;;26482:738;;26375:845;;;;:::o;27226:589::-;27451:3;27473:95;27564:3;27555:6;27473:95;:::i;:::-;27466:102;;27585:95;27676:3;27667:6;27585:95;:::i;:::-;27578:102;;27697:92;27785:3;27776:6;27697:92;:::i;:::-;27690:99;;27806:3;27799:10;;27226:589;;;;;;:::o;27821:305::-;27861:3;27880:20;27898:1;27880:20;:::i;:::-;27875:25;;27914:20;27932:1;27914:20;:::i;:::-;27909:25;;28068:1;28000:66;27996:74;27993:1;27990:81;27987:107;;;28074:18;;:::i;:::-;27987:107;28118:1;28115;28111:9;28104:16;;27821:305;;;;:::o;28132:180::-;28180:77;28177:1;28170:88;28277:4;28274:1;28267:15;28301:4;28298:1;28291:15;28318:233;28357:3;28380:24;28398:5;28380:24;:::i;:::-;28371:33;;28426:66;28419:5;28416:77;28413:103;;28496:18;;:::i;:::-;28413:103;28543:1;28536:5;28532:13;28525:20;;28318:233;;;:::o;28557:225::-;28697:34;28693:1;28685:6;28681:14;28674:58;28766:8;28761:2;28753:6;28749:15;28742:33;28557:225;:::o;28788:366::-;28930:3;28951:67;29015:2;29010:3;28951:67;:::i;:::-;28944:74;;29027:93;29116:3;29027:93;:::i;:::-;29145:2;29140:3;29136:12;29129:19;;28788:366;;;:::o;29160:419::-;29326:4;29364:2;29353:9;29349:18;29341:26;;29413:9;29407:4;29403:20;29399:1;29388:9;29384:17;29377:47;29441:131;29567:4;29441:131;:::i;:::-;29433:139;;29160:419;;;:::o;29585:180::-;29633:77;29630:1;29623:88;29730:4;29727:1;29720:15;29754:4;29751:1;29744:15;29771:185;29811:1;29828:20;29846:1;29828:20;:::i;:::-;29823:25;;29862:20;29880:1;29862:20;:::i;:::-;29857:25;;29901:1;29891:35;;29906:18;;:::i;:::-;29891:35;29948:1;29945;29941:9;29936:14;;29771:185;;;;:::o;29962:191::-;30002:4;30022:20;30040:1;30022:20;:::i;:::-;30017:25;;30056:20;30074:1;30056:20;:::i;:::-;30051:25;;30095:1;30092;30089:8;30086:34;;;30100:18;;:::i;:::-;30086:34;30145:1;30142;30138:9;30130:17;;29962:191;;;;:::o;30159:176::-;30191:1;30208:20;30226:1;30208:20;:::i;:::-;30203:25;;30242:20;30260:1;30242:20;:::i;:::-;30237:25;;30281:1;30271:35;;30286:18;;:::i;:::-;30271:35;30327:1;30324;30320:9;30315:14;;30159:176;;;;:::o;30341:98::-;30392:6;30426:5;30420:12;30410:22;;30341:98;;;:::o;30445:168::-;30528:11;30562:6;30557:3;30550:19;30602:4;30597:3;30593:14;30578:29;;30445:168;;;;:::o;30619:360::-;30705:3;30733:38;30765:5;30733:38;:::i;:::-;30787:70;30850:6;30845:3;30787:70;:::i;:::-;30780:77;;30866:52;30911:6;30906:3;30899:4;30892:5;30888:16;30866:52;:::i;:::-;30943:29;30965:6;30943:29;:::i;:::-;30938:3;30934:39;30927:46;;30709:270;30619:360;;;;:::o;30985:640::-;31180:4;31218:3;31207:9;31203:19;31195:27;;31232:71;31300:1;31289:9;31285:17;31276:6;31232:71;:::i;:::-;31313:72;31381:2;31370:9;31366:18;31357:6;31313:72;:::i;:::-;31395;31463:2;31452:9;31448:18;31439:6;31395:72;:::i;:::-;31514:9;31508:4;31504:20;31499:2;31488:9;31484:18;31477:48;31542:76;31613:4;31604:6;31542:76;:::i;:::-;31534:84;;30985:640;;;;;;;:::o;31631:141::-;31687:5;31718:6;31712:13;31703:22;;31734:32;31760:5;31734:32;:::i;:::-;31631:141;;;;:::o;31778:349::-;31847:6;31896:2;31884:9;31875:7;31871:23;31867:32;31864:119;;;31902:79;;:::i;:::-;31864:119;32022:1;32047:63;32102:7;32093:6;32082:9;32078:22;32047:63;:::i;:::-;32037:73;;31993:127;31778:349;;;;:::o

Swarm Source

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