ETH Price: $2,416.11 (+2.10%)

Token

Rich Cats (RCATS)
 

Overview

Max Total Supply

259 RCATS

Holders

81

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 RCATS
0xba77ad683caa7a0ebe2f133559a7dbc58632f60d
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:
RichCatsNFT

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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 contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
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 See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public 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);

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev 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);

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/finance/[email protected]

// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File contracts/RichCatsNFT.sol

pragma solidity ^0.8.12;





contract RichCatsNFT is Ownable, ERC721A, PaymentSplitter {

    using Strings for uint;

    enum Step {
        Before,
        WhitelistSale,
        PublicSale,
        SoldOut,
        Reveal
    }

    string public baseURI;

    bool public revealed = false;

    Step public sellingStep;

    uint private constant MAX_SUPPLY = 3333;
    uint private constant MAX_WHITELIST = 1100;
    uint private constant MAX_PUBLIC = 2150;
    uint private constant MAX_GIFT = 83;

    uint private constant WL_MINT_LIMIT = 15;

    uint public wlSalePrice = 0.05 ether;
    uint public publicSalePrice = 0.05 ether;

    bytes32 public merkleRoot;

    uint public saleStartTime = 1647550800;

    mapping(address => uint) public amountNFTsperWalletWhitelistSale;

    uint private teamLength;

    constructor(address[] memory _team, uint[] memory _teamShares, bytes32 _merkleRoot, string memory _baseURI) ERC721A("Rich Cats", "RCATS")
    PaymentSplitter(_team, _teamShares) {
        merkleRoot = _merkleRoot;
        baseURI = _baseURI;
        teamLength = _team.length;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract.");
        _;
    }

    function whitelistMint(address _account, uint _quantity, bytes32[] calldata _proof) external payable callerIsUser {
        uint price = wlSalePrice;
        require(price != 0, "Price is 0");
        require(currentTime() >= saleStartTime, "Whitelist Sale has not started yet");
        require(sellingStep == Step.WhitelistSale, "Whitelist sale is not activated");
        require(isWhiteListed(msg.sender, _proof), "Not whitelisted");
        require(amountNFTsperWalletWhitelistSale[msg.sender] + _quantity <= WL_MINT_LIMIT, "You can only get 15 NFTs on the Whitelist Sale");
        require(totalSupply() + _quantity <= MAX_WHITELIST, "Max supply exceeded");
        require(msg.value >= price * _quantity, "Not enought funds");
        amountNFTsperWalletWhitelistSale[msg.sender] += _quantity;
        _safeMint(_account, _quantity);
    }

    function publicSaleMint(address _account, uint _quantity) external payable callerIsUser {
        uint price = publicSalePrice;
        require(price != 0, "Price is 0");
        require(sellingStep == Step.PublicSale, "Public sale is not activated");
        require(totalSupply() + _quantity <= MAX_WHITELIST + MAX_PUBLIC + MAX_GIFT, "Max supply exceeded");
        require(msg.value >= price * _quantity, "Not enought funds");
        _safeMint(_account, _quantity);
    }

    function gift(address _to, uint _quantity) external onlyOwner {
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Reached max Supply");
        _safeMint(_to, _quantity);
    }

    function setSaleStartTime(uint _saleStartTime) external onlyOwner {
        saleStartTime = _saleStartTime;
    }

    function setBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function currentTime() internal view returns(uint) {
        return block.timestamp;
    }

    function setStep(uint _step) external onlyOwner {
        sellingStep = Step(_step);
    }

    function tokenURI(uint _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "URI query for nonexistent token");

        if (!revealed) {
            return string(abi.encodePacked(baseURI, "hidden.json"));
        }

        return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setReveal(bool _revealed) external onlyOwner {
        revealed = _revealed;
    }

    function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns(bool) {
        return _verify(leaf(_account), _proof);
    }

    function leaf(address _account) internal pure returns(bytes32) {
        return keccak256(abi.encodePacked(_account));
    }

    function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns(bool) {
        return MerkleProof.verify(_proof, merkleRoot, _leaf);
    }

    function releaseAll() external onlyOwner {
        for(uint i = 0 ; i < teamLength ; i++) {
            release(payable(payee(i)));
        }
    }

    receive() override external payable {
        revert('Only if you mint');
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_team","type":"address[]"},{"internalType":"uint256[]","name":"_teamShares","type":"uint256[]"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountNFTsperWalletWhitelistSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum RichCatsNFT.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleStartTime","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"}],"name":"setStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000601160006101000a81548160ff02191690831515021790555066b1a2bc2ec5000060125566b1a2bc2ec50000601355636233a1506015553480156200004a57600080fd5b506040516200670e3803806200670e833981810160405281019062000070919062000a5e565b83836040518060400160405280600981526020017f52696368204361747300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5243415453000000000000000000000000000000000000000000000000000000815250620000fe620000f26200027a60201b60201c565b6200028260201b60201c565b81600390805190602001906200011692919062000585565b5080600490805190602001906200012f92919062000585565b50620001406200034660201b60201c565b600181905550505080518251146200018f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001869062000bb4565b60405180910390fd5b6000825111620001d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001cd9062000c26565b60405180910390fd5b60005b825181101562000245576200022f838281518110620001fd57620001fc62000c48565b5b60200260200101518383815181106200021b576200021a62000c48565b5b60200260200101516200034b60201b60201c565b80806200023c9062000ca6565b915050620001d9565b5050508160148190555080601090805190602001906200026792919062000585565b5083516017819055505050505062000fa7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b59062000d6a565b60405180910390fd5b6000811162000404576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fb9062000ddc565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004809062000e74565b60405180910390fd5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060095462000540919062000e96565b6009819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200057992919062000f15565b60405180910390a15050565b828054620005939062000f71565b90600052602060002090601f016020900481019282620005b7576000855562000603565b82601f10620005d257805160ff191683800117855562000603565b8280016001018555821562000603579182015b8281111562000602578251825591602001919060010190620005e5565b5b50905062000612919062000616565b5090565b5b808211156200063157600081600090555060010162000617565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000699826200064e565b810181811067ffffffffffffffff82111715620006bb57620006ba6200065f565b5b80604052505050565b6000620006d062000635565b9050620006de82826200068e565b919050565b600067ffffffffffffffff8211156200070157620007006200065f565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007448262000717565b9050919050565b620007568162000737565b81146200076257600080fd5b50565b60008151905062000776816200074b565b92915050565b6000620007936200078d84620006e3565b620006c4565b90508083825260208201905060208402830185811115620007b957620007b862000712565b5b835b81811015620007e65780620007d1888262000765565b845260208401935050602081019050620007bb565b5050509392505050565b600082601f83011262000808576200080762000649565b5b81516200081a8482602086016200077c565b91505092915050565b600067ffffffffffffffff8211156200084157620008406200065f565b5b602082029050602081019050919050565b6000819050919050565b620008678162000852565b81146200087357600080fd5b50565b60008151905062000887816200085c565b92915050565b6000620008a46200089e8462000823565b620006c4565b90508083825260208201905060208402830185811115620008ca57620008c962000712565b5b835b81811015620008f75780620008e2888262000876565b845260208401935050602081019050620008cc565b5050509392505050565b600082601f83011262000919576200091862000649565b5b81516200092b8482602086016200088d565b91505092915050565b6000819050919050565b620009498162000934565b81146200095557600080fd5b50565b60008151905062000969816200093e565b92915050565b600080fd5b600067ffffffffffffffff8211156200099257620009916200065f565b5b6200099d826200064e565b9050602081019050919050565b60005b83811015620009ca578082015181840152602081019050620009ad565b83811115620009da576000848401525b50505050565b6000620009f7620009f18462000974565b620006c4565b90508281526020810184848401111562000a165762000a156200096f565b5b62000a23848285620009aa565b509392505050565b600082601f83011262000a435762000a4262000649565b5b815162000a55848260208601620009e0565b91505092915050565b6000806000806080858703121562000a7b5762000a7a6200063f565b5b600085015167ffffffffffffffff81111562000a9c5762000a9b62000644565b5b62000aaa87828801620007f0565b945050602085015167ffffffffffffffff81111562000ace5762000acd62000644565b5b62000adc8782880162000901565b935050604062000aef8782880162000958565b925050606085015167ffffffffffffffff81111562000b135762000b1262000644565b5b62000b218782880162000a2b565b91505092959194509250565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000b9c60328362000b2d565b915062000ba98262000b3e565b604082019050919050565b6000602082019050818103600083015262000bcf8162000b8d565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062000c0e601a8362000b2d565b915062000c1b8262000bd6565b602082019050919050565b6000602082019050818103600083015262000c418162000bff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000cb38262000852565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000ce95762000ce862000c77565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000d52602c8362000b2d565b915062000d5f8262000cf4565b604082019050919050565b6000602082019050818103600083015262000d858162000d43565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000dc4601d8362000b2d565b915062000dd18262000d8c565b602082019050919050565b6000602082019050818103600083015262000df78162000db5565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000e5c602b8362000b2d565b915062000e698262000dfe565b604082019050919050565b6000602082019050818103600083015262000e8f8162000e4d565b9050919050565b600062000ea38262000852565b915062000eb08362000852565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ee85762000ee762000c77565b5b828201905092915050565b62000efe8162000737565b82525050565b62000f0f8162000852565b82525050565b600060408201905062000f2c600083018562000ef3565b62000f3b602083018462000f04565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000f8a57607f821691505b6020821081141562000fa15762000fa062000f42565b5b50919050565b6157578062000fb76000396000f3fe6080604052600436106102605760003560e01c8063715018a611610144578063ac5ae11b116100b6578063ce7c2ac21161007a578063ce7c2ac214610920578063d79779b21461095d578063e33b7de31461099a578063e985e9c5146109c5578063f2fde38b14610a02578063f8dcbddb14610a2b576102a0565b8063ac5ae11b1461084a578063b88d4fde14610866578063c87b56dd1461088f578063cbccefb2146108cc578063cbce4c97146108f7576102a0565b806395d89b411161010857806395d89b41146107285780639852595c1461075357806399d13800146107905780639b6860c8146107cd578063a0bcfc7f146107f8578063a22cb46514610821576102a0565b8063715018a614610655578063734c66bd1461066c5780637cb64759146106975780638b83209b146106c05780638da5cb5b146106fd576102a0565b80633a98ef39116101dd57806351830227116101a15780635183022714610545578063525f8a5c146105705780635be7fde8146105995780636352211e146105b05780636c0360eb146105ed57806370a0823114610618576102a0565b80633a98ef391461046f578063406072a91461049a57806342842e0e146104d757806348b75044146105005780634b11faaf14610529576102a0565b80631916558711610224578063191655871461039e5780631cbaee2d146103c757806323b872dd146103f25780632a3f300c1461041b5780632eb4a7ab14610444576102a0565b806301ffc9a7146102a557806306fdde03146102e2578063081812fc1461030d578063095ea7b31461034a57806318160ddd14610373576102a0565b366102a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029790613c50565b60405180910390fd5b600080fd5b3480156102b157600080fd5b506102cc60048036038101906102c79190613cdc565b610a54565b6040516102d99190613d24565b60405180910390f35b3480156102ee57600080fd5b506102f7610b36565b6040516103049190613dc7565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613e1f565b610bc8565b6040516103419190613e8d565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613ed4565b610c44565b005b34801561037f57600080fd5b50610388610d4f565b6040516103959190613f23565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613f7c565b610d66565b005b3480156103d357600080fd5b506103dc610f11565b6040516103e99190613f23565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190613fa9565b610f17565b005b34801561042757600080fd5b50610442600480360381019061043d9190614028565b610f27565b005b34801561045057600080fd5b50610459610fc0565b604051610466919061406e565b60405180910390f35b34801561047b57600080fd5b50610484610fc6565b6040516104919190613f23565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc91906140c7565b610fd0565b6040516104ce9190613f23565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613fa9565b611057565b005b34801561050c57600080fd5b50610527600480360381019061052291906140c7565b611077565b005b610543600480360381019061053e919061416c565b611330565b005b34801561055157600080fd5b5061055a61168f565b6040516105679190613d24565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190613e1f565b6116a2565b005b3480156105a557600080fd5b506105ae611728565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613e1f565b6117d8565b6040516105e49190613e8d565b60405180910390f35b3480156105f957600080fd5b506106026117ee565b60405161060f9190613dc7565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a91906141e0565b61187c565b60405161064c9190613f23565b60405180910390f35b34801561066157600080fd5b5061066a61194c565b005b34801561067857600080fd5b506106816119d4565b60405161068e9190613f23565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190614239565b6119da565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613e1f565b611a60565b6040516106f49190613e8d565b60405180910390f35b34801561070957600080fd5b50610712611aa8565b60405161071f9190613e8d565b60405180910390f35b34801561073457600080fd5b5061073d611ad1565b60405161074a9190613dc7565b60405180910390f35b34801561075f57600080fd5b5061077a600480360381019061077591906141e0565b611b63565b6040516107879190613f23565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b291906141e0565b611bac565b6040516107c49190613f23565b60405180910390f35b3480156107d957600080fd5b506107e2611bc4565b6040516107ef9190613f23565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190614396565b611bca565b005b34801561082d57600080fd5b50610848600480360381019061084391906143df565b611c60565b005b610864600480360381019061085f9190613ed4565b611dd8565b005b34801561087257600080fd5b5061088d600480360381019061088891906144c0565b611fd4565b005b34801561089b57600080fd5b506108b660048036038101906108b19190613e1f565b612050565b6040516108c39190613dc7565b60405180910390f35b3480156108d857600080fd5b506108e1612109565b6040516108ee91906145ba565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613ed4565b61211c565b005b34801561092c57600080fd5b50610947600480360381019061094291906141e0565b6121fd565b6040516109549190613f23565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f91906145d5565b612246565b6040516109919190613f23565b60405180910390f35b3480156109a657600080fd5b506109af61228f565b6040516109bc9190613f23565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190614602565b612299565b6040516109f99190613d24565b60405180910390f35b348015610a0e57600080fd5b50610a296004803603810190610a2491906141e0565b61232d565b005b348015610a3757600080fd5b50610a526004803603810190610a4d9190613e1f565b612425565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2f5750610b2e826124e0565b5b9050919050565b606060038054610b4590614671565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7190614671565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b6000610bd38261254a565b610c09576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4f826117d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd6612598565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d085750610d0681610d01612598565b612299565b155b15610d3f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a8383836125a0565b505050565b6000610d59612652565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614715565b60405180910390fd5b6000610df261228f565b47610dfd9190614764565b90506000610e148383610e0f86611b63565b612657565b90506000811415610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e519061482c565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea99190614764565b9250508190555080600a6000828254610ec29190614764565b92505081905550610ed383826126c5565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f049291906148ab565b60405180910390a1505050565b60155481565b610f228383836127b9565b505050565b610f2f612598565b73ffffffffffffffffffffffffffffffffffffffff16610f4d611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90614920565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60145481565b6000600954905090565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61107283838360405180602001604052806000815250611fd4565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090614715565b60405180910390fd5b600061110483612246565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161113d9190613e8d565b602060405180830381865afa15801561115a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117e9190614955565b6111889190614764565b905060006111a0838361119b8787610fd0565b612657565b905060008114156111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd9061482c565b60405180910390fd5b80600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112729190614764565b9250508190555080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112c89190614764565b925050819055506112da848483612caa565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611322929190614982565b60405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611395906149f7565b60405180910390fd5b6000601254905060008114156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090614a63565b60405180910390fd5b6015546113f4612d30565b1015611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c90614af5565b60405180910390fd5b6001600481111561144957611448614543565b5b601160019054906101000a900460ff16600481111561146b5761146a614543565b5b146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614b61565b60405180910390fd5b6114b6338484612d38565b6114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614bcd565b60405180910390fd5b600f84601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115429190614764565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90614c5f565b60405180910390fd5b61044c8461158f610d4f565b6115999190614764565b11156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614ccb565b60405180910390fd5b83816115e69190614ceb565b341015611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614d91565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116779190614764565b925050819055506116888585612d96565b5050505050565b601160009054906101000a900460ff1681565b6116aa612598565b73ffffffffffffffffffffffffffffffffffffffff166116c8611aa8565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614920565b60405180910390fd5b8060158190555050565b611730612598565b73ffffffffffffffffffffffffffffffffffffffff1661174e611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614920565b60405180910390fd5b60005b6017548110156117d5576117c26117bd82611a60565b610d66565b80806117cd90614db1565b9150506117a7565b50565b60006117e382612db4565b600001519050919050565b601080546117fb90614671565b80601f016020809104026020016040519081016040528092919081815260200182805461182790614671565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611954612598565b73ffffffffffffffffffffffffffffffffffffffff16611972611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90614920565b60405180910390fd5b6119d26000613043565b565b60125481565b6119e2612598565b73ffffffffffffffffffffffffffffffffffffffff16611a00611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614920565b60405180910390fd5b8060148190555050565b6000600d8281548110611a7657611a75614dfa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611ae090614671565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0c90614671565b8015611b595780601f10611b2e57610100808354040283529160200191611b59565b820191906000526020600020905b815481529060010190602001808311611b3c57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60166020528060005260406000206000915090505481565b60135481565b611bd2612598565b73ffffffffffffffffffffffffffffffffffffffff16611bf0611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d90614920565b60405180910390fd5b8060109080519060200190611c5c929190613b0d565b5050565b611c68612598565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611cda612598565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d87612598565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcc9190613d24565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906149f7565b60405180910390fd5b600060135490506000811415611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890614a63565b60405180910390fd5b60026004811115611ea557611ea4614543565b5b601160019054906101000a900460ff166004811115611ec757611ec6614543565b5b14611f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe90614e75565b60405180910390fd5b605361086661044c611f199190614764565b611f239190614764565b82611f2c610d4f565b611f369190614764565b1115611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90614ccb565b60405180910390fd5b8181611f839190614ceb565b341015611fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbc90614d91565b60405180910390fd5b611fcf8383612d96565b505050565b611fdf8484846127b9565b611ffe8373ffffffffffffffffffffffffffffffffffffffff16613107565b801561201357506120118484848461312a565b155b1561204a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061205b8261254a565b61209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190614ee1565b60405180910390fd5b601160009054906101000a900460ff166120d65760106040516020016120c09190614fec565b6040516020818303038152906040529050612104565b60106120e18361327b565b6040516020016120f292919061508b565b60405160208183030381529060405290505b919050565b601160019054906101000a900460ff1681565b612124612598565b73ffffffffffffffffffffffffffffffffffffffff16612142611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614920565b60405180910390fd5b610d05816121a4610d4f565b6121ae9190614764565b11156121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e690615106565b60405180910390fd5b6121f98282612d96565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612335612598565b73ffffffffffffffffffffffffffffffffffffffff16612353611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090614920565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090615198565b60405180910390fd5b61242281613043565b50565b61242d612598565b73ffffffffffffffffffffffffffffffffffffffff1661244b611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614920565b60405180910390fd5b8060048111156124b4576124b3614543565b5b601160016101000a81548160ff021916908360048111156124d8576124d7614543565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612555612652565b11158015612564575060015482105b8015612591575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856126a89190614ceb565b6126b291906151e7565b6126bc9190615218565b90509392505050565b80471015612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff90615298565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161272e906152e9565b60006040518083038185875af1925050503d806000811461276b576040519150601f19603f3d011682016040523d82523d6000602084013e612770565b606091505b50509050806127b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ab90615370565b60405180910390fd5b505050565b60006127c482612db4565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127eb612598565b73ffffffffffffffffffffffffffffffffffffffff16148061281e575061281d8260000151612818612598565b612299565b5b80612863575061282c612598565b73ffffffffffffffffffffffffffffffffffffffff1661284b84610bc8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061289c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612905576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561296c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297985858560016133dc565b61298960008484600001516125a0565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c3a57600154811015612c395782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca385858560016133e2565b5050505050565b612d2b8363a9059cbb60e01b8484604051602401612cc9929190614982565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e8565b505050565b600042905090565b6000612d8d612d46856134af565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506134df565b90509392505050565b612db08282604051806020016040528060008152506134f6565b5050565b612dbc613b93565b600082905080612dca612652565b11158015612dd9575060015481105b1561300c576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161300a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eee57809250505061303e565b5b60011561300957818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461300457809250505061303e565b612eef565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613150612598565b8786866040518563ffffffff1660e01b815260040161317294939291906153e5565b6020604051808303816000875af19250505080156131ae57506040513d601f19601f820116820180604052508101906131ab9190615446565b60015b613228573d80600081146131de576040519150601f19603f3d011682016040523d82523d6000602084013e6131e3565b606091505b50600081511415613220576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156132c3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d7565b600082905060005b600082146132f55780806132de90614db1565b915050600a826132ee91906151e7565b91506132cb565b60008167ffffffffffffffff8111156133115761331061426b565b5b6040519080825280601f01601f1916602001820160405280156133435781602001600182028036833780820191505090505b5090505b600085146133d05760018261335c9190615218565b9150600a8561336b9190615473565b60306133779190614764565b60f81b81838151811061338d5761338c614dfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133c991906151e7565b9450613347565b8093505050505b919050565b50505050565b50505050565b600061344a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135089092919063ffffffff16565b90506000815111156134aa578080602001905181019061346a91906154b9565b6134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a090615558565b60405180910390fd5b5b505050565b6000816040516020016134c291906155c0565b604051602081830303815290604052805190602001209050919050565b60006134ee8260145485613520565b905092915050565b6135038383836001613537565b505050565b60606135178484600085613906565b90509392505050565b60008261352d8584613a1a565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135a5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156135e0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ed60008683876133dc565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156137b757506137b68773ffffffffffffffffffffffffffffffffffffffff16613107565b5b1561387d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461382c600088848060010195508861312a565b613862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156137bd57826001541461387857600080fd5b6138e9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561387e575b8160018190555050506138ff60008683876133e2565b5050505050565b60608247101561394b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139429061564d565b60405180910390fd5b61395485613107565b613993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398a906156b9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139bc919061570a565b60006040518083038185875af1925050503d80600081146139f9576040519150601f19603f3d011682016040523d82523d6000602084013e6139fe565b606091505b5091509150613a0e828286613a8f565b92505050949350505050565b60008082905060005b8451811015613a84576000858281518110613a4157613a40614dfa565b5b60200260200101519050808311613a6357613a5c8382613af6565b9250613a70565b613a6d8184613af6565b92505b508080613a7c90614db1565b915050613a23565b508091505092915050565b60608315613a9f57829050613aef565b600083511115613ab25782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae69190613dc7565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b828054613b1990614671565b90600052602060002090601f016020900481019282613b3b5760008555613b82565b82601f10613b5457805160ff1916838001178555613b82565b82800160010185558215613b82579182015b82811115613b81578251825591602001919060010190613b66565b5b509050613b8f9190613bd6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bef576000816000905550600101613bd7565b5090565b600082825260208201905092915050565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b6000613c3a601083613bf3565b9150613c4582613c04565b602082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cb981613c84565b8114613cc457600080fd5b50565b600081359050613cd681613cb0565b92915050565b600060208284031215613cf257613cf1613c7a565b5b6000613d0084828501613cc7565b91505092915050565b60008115159050919050565b613d1e81613d09565b82525050565b6000602082019050613d396000830184613d15565b92915050565b600081519050919050565b60005b83811015613d68578082015181840152602081019050613d4d565b83811115613d77576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d9982613d3f565b613da38185613bf3565b9350613db3818560208601613d4a565b613dbc81613d7d565b840191505092915050565b60006020820190508181036000830152613de18184613d8e565b905092915050565b6000819050919050565b613dfc81613de9565b8114613e0757600080fd5b50565b600081359050613e1981613df3565b92915050565b600060208284031215613e3557613e34613c7a565b5b6000613e4384828501613e0a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7782613e4c565b9050919050565b613e8781613e6c565b82525050565b6000602082019050613ea26000830184613e7e565b92915050565b613eb181613e6c565b8114613ebc57600080fd5b50565b600081359050613ece81613ea8565b92915050565b60008060408385031215613eeb57613eea613c7a565b5b6000613ef985828601613ebf565b9250506020613f0a85828601613e0a565b9150509250929050565b613f1d81613de9565b82525050565b6000602082019050613f386000830184613f14565b92915050565b6000613f4982613e4c565b9050919050565b613f5981613f3e565b8114613f6457600080fd5b50565b600081359050613f7681613f50565b92915050565b600060208284031215613f9257613f91613c7a565b5b6000613fa084828501613f67565b91505092915050565b600080600060608486031215613fc257613fc1613c7a565b5b6000613fd086828701613ebf565b9350506020613fe186828701613ebf565b9250506040613ff286828701613e0a565b9150509250925092565b61400581613d09565b811461401057600080fd5b50565b60008135905061402281613ffc565b92915050565b60006020828403121561403e5761403d613c7a565b5b600061404c84828501614013565b91505092915050565b6000819050919050565b61406881614055565b82525050565b6000602082019050614083600083018461405f565b92915050565b600061409482613e6c565b9050919050565b6140a481614089565b81146140af57600080fd5b50565b6000813590506140c18161409b565b92915050565b600080604083850312156140de576140dd613c7a565b5b60006140ec858286016140b2565b92505060206140fd85828601613ebf565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261412c5761412b614107565b5b8235905067ffffffffffffffff8111156141495761414861410c565b5b60208301915083602082028301111561416557614164614111565b5b9250929050565b6000806000806060858703121561418657614185613c7a565b5b600061419487828801613ebf565b94505060206141a587828801613e0a565b935050604085013567ffffffffffffffff8111156141c6576141c5613c7f565b5b6141d287828801614116565b925092505092959194509250565b6000602082840312156141f6576141f5613c7a565b5b600061420484828501613ebf565b91505092915050565b61421681614055565b811461422157600080fd5b50565b6000813590506142338161420d565b92915050565b60006020828403121561424f5761424e613c7a565b5b600061425d84828501614224565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142a382613d7d565b810181811067ffffffffffffffff821117156142c2576142c161426b565b5b80604052505050565b60006142d5613c70565b90506142e1828261429a565b919050565b600067ffffffffffffffff8211156143015761430061426b565b5b61430a82613d7d565b9050602081019050919050565b82818337600083830152505050565b6000614339614334846142e6565b6142cb565b90508281526020810184848401111561435557614354614266565b5b614360848285614317565b509392505050565b600082601f83011261437d5761437c614107565b5b813561438d848260208601614326565b91505092915050565b6000602082840312156143ac576143ab613c7a565b5b600082013567ffffffffffffffff8111156143ca576143c9613c7f565b5b6143d684828501614368565b91505092915050565b600080604083850312156143f6576143f5613c7a565b5b600061440485828601613ebf565b925050602061441585828601614013565b9150509250929050565b600067ffffffffffffffff82111561443a5761443961426b565b5b61444382613d7d565b9050602081019050919050565b600061446361445e8461441f565b6142cb565b90508281526020810184848401111561447f5761447e614266565b5b61448a848285614317565b509392505050565b600082601f8301126144a7576144a6614107565b5b81356144b7848260208601614450565b91505092915050565b600080600080608085870312156144da576144d9613c7a565b5b60006144e887828801613ebf565b94505060206144f987828801613ebf565b935050604061450a87828801613e0a565b925050606085013567ffffffffffffffff81111561452b5761452a613c7f565b5b61453787828801614492565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6005811061458357614582614543565b5b50565b600081905061459482614572565b919050565b60006145a482614586565b9050919050565b6145b481614599565b82525050565b60006020820190506145cf60008301846145ab565b92915050565b6000602082840312156145eb576145ea613c7a565b5b60006145f9848285016140b2565b91505092915050565b6000806040838503121561461957614618613c7a565b5b600061462785828601613ebf565b925050602061463885828601613ebf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468957607f821691505b6020821081141561469d5761469c614642565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006146ff602683613bf3565b915061470a826146a3565b604082019050919050565b6000602082019050818103600083015261472e816146f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061476f82613de9565b915061477a83613de9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147af576147ae614735565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614816602b83613bf3565b9150614821826147ba565b604082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b6000819050919050565b600061487161486c61486784613e4c565b61484c565b613e4c565b9050919050565b600061488382614856565b9050919050565b600061489582614878565b9050919050565b6148a58161488a565b82525050565b60006040820190506148c0600083018561489c565b6148cd6020830184613f14565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061490a602083613bf3565b9150614915826148d4565b602082019050919050565b60006020820190508181036000830152614939816148fd565b9050919050565b60008151905061494f81613df3565b92915050565b60006020828403121561496b5761496a613c7a565b5b600061497984828501614940565b91505092915050565b60006040820190506149976000830185613e7e565b6149a46020830184613f14565b9392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b60006149e1601f83613bf3565b91506149ec826149ab565b602082019050919050565b60006020820190508181036000830152614a10816149d4565b9050919050565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b6000614a4d600a83613bf3565b9150614a5882614a17565b602082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b7f57686974656c6973742053616c6520686173206e6f742073746172746564207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614adf602283613bf3565b9150614aea82614a83565b604082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b7f57686974656c6973742073616c65206973206e6f742061637469766174656400600082015250565b6000614b4b601f83613bf3565b9150614b5682614b15565b602082019050919050565b60006020820190508181036000830152614b7a81614b3e565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614bb7600f83613bf3565b9150614bc282614b81565b602082019050919050565b60006020820190508181036000830152614be681614baa565b9050919050565b7f596f752063616e206f6e6c7920676574203135204e465473206f6e207468652060008201527f57686974656c6973742053616c65000000000000000000000000000000000000602082015250565b6000614c49602e83613bf3565b9150614c5482614bed565b604082019050919050565b60006020820190508181036000830152614c7881614c3c565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614cb5601383613bf3565b9150614cc082614c7f565b602082019050919050565b60006020820190508181036000830152614ce481614ca8565b9050919050565b6000614cf682613de9565b9150614d0183613de9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3a57614d39614735565b5b828202905092915050565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b6000614d7b601183613bf3565b9150614d8682614d45565b602082019050919050565b60006020820190508181036000830152614daa81614d6e565b9050919050565b6000614dbc82613de9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614def57614dee614735565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b6000614e5f601c83613bf3565b9150614e6a82614e29565b602082019050919050565b60006020820190508181036000830152614e8e81614e52565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614ecb601f83613bf3565b9150614ed682614e95565b602082019050919050565b60006020820190508181036000830152614efa81614ebe565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614f2e81614671565b614f388186614f01565b94506001821660008114614f535760018114614f6457614f97565b60ff19831686528186019350614f97565b614f6d85614f0c565b60005b83811015614f8f57815481890152600182019150602081019050614f70565b838801955050505b50505092915050565b7f68696464656e2e6a736f6e000000000000000000000000000000000000000000600082015250565b6000614fd6600b83614f01565b9150614fe182614fa0565b600b82019050919050565b6000614ff88284614f21565b915061500382614fc9565b915081905092915050565b600061501982613d3f565b6150238185614f01565b9350615033818560208601613d4a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615075600583614f01565b91506150808261503f565b600582019050919050565b60006150978285614f21565b91506150a3828461500e565b91506150ae82615068565b91508190509392505050565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b60006150f0601283613bf3565b91506150fb826150ba565b602082019050919050565b6000602082019050818103600083015261511f816150e3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615182602683613bf3565b915061518d82615126565b604082019050919050565b600060208201905081810360008301526151b181615175565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151f282613de9565b91506151fd83613de9565b92508261520d5761520c6151b8565b5b828204905092915050565b600061522382613de9565b915061522e83613de9565b92508282101561524157615240614735565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615282601d83613bf3565b915061528d8261524c565b602082019050919050565b600060208201905081810360008301526152b181615275565b9050919050565b600081905092915050565b50565b60006152d36000836152b8565b91506152de826152c3565b600082019050919050565b60006152f4826152c6565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061535a603a83613bf3565b9150615365826152fe565b604082019050919050565b600060208201905081810360008301526153898161534d565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153b782615390565b6153c1818561539b565b93506153d1818560208601613d4a565b6153da81613d7d565b840191505092915050565b60006080820190506153fa6000830187613e7e565b6154076020830186613e7e565b6154146040830185613f14565b818103606083015261542681846153ac565b905095945050505050565b60008151905061544081613cb0565b92915050565b60006020828403121561545c5761545b613c7a565b5b600061546a84828501615431565b91505092915050565b600061547e82613de9565b915061548983613de9565b925082615499576154986151b8565b5b828206905092915050565b6000815190506154b381613ffc565b92915050565b6000602082840312156154cf576154ce613c7a565b5b60006154dd848285016154a4565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615542602a83613bf3565b915061554d826154e6565b604082019050919050565b6000602082019050818103600083015261557181615535565b9050919050565b60008160601b9050919050565b600061559082615578565b9050919050565b60006155a282615585565b9050919050565b6155ba6155b582613e6c565b615597565b82525050565b60006155cc82846155a9565b60148201915081905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615637602683613bf3565b9150615642826155db565b604082019050919050565b600060208201905081810360008301526156668161562a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006156a3601d83613bf3565b91506156ae8261566d565b602082019050919050565b600060208201905081810360008301526156d281615696565b9050919050565b60006156e482615390565b6156ee81856152b8565b93506156fe818560208601613d4a565b80840191505092915050565b600061571682846156d9565b91508190509291505056fea2646970667358221220da070ead08fa5fddcfea23dd87c889318ffd57193e6dcb68ae81b7bdce8ec0e464736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0d64b2877a0dd386837e7322bfa676e5549b2feb59383aa67f9690647efd50fdf00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000586fd0ad54c45b07f47e753860f96c2f30a4321d000000000000000000000000a11388f71328e734abb96486e6ab7ba8d2a195a40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d61487355377968646b4c756a68316334375961716d4d78756b58455036596739536653717866554367312f00000000000000000000

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063715018a611610144578063ac5ae11b116100b6578063ce7c2ac21161007a578063ce7c2ac214610920578063d79779b21461095d578063e33b7de31461099a578063e985e9c5146109c5578063f2fde38b14610a02578063f8dcbddb14610a2b576102a0565b8063ac5ae11b1461084a578063b88d4fde14610866578063c87b56dd1461088f578063cbccefb2146108cc578063cbce4c97146108f7576102a0565b806395d89b411161010857806395d89b41146107285780639852595c1461075357806399d13800146107905780639b6860c8146107cd578063a0bcfc7f146107f8578063a22cb46514610821576102a0565b8063715018a614610655578063734c66bd1461066c5780637cb64759146106975780638b83209b146106c05780638da5cb5b146106fd576102a0565b80633a98ef39116101dd57806351830227116101a15780635183022714610545578063525f8a5c146105705780635be7fde8146105995780636352211e146105b05780636c0360eb146105ed57806370a0823114610618576102a0565b80633a98ef391461046f578063406072a91461049a57806342842e0e146104d757806348b75044146105005780634b11faaf14610529576102a0565b80631916558711610224578063191655871461039e5780631cbaee2d146103c757806323b872dd146103f25780632a3f300c1461041b5780632eb4a7ab14610444576102a0565b806301ffc9a7146102a557806306fdde03146102e2578063081812fc1461030d578063095ea7b31461034a57806318160ddd14610373576102a0565b366102a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029790613c50565b60405180910390fd5b600080fd5b3480156102b157600080fd5b506102cc60048036038101906102c79190613cdc565b610a54565b6040516102d99190613d24565b60405180910390f35b3480156102ee57600080fd5b506102f7610b36565b6040516103049190613dc7565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613e1f565b610bc8565b6040516103419190613e8d565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190613ed4565b610c44565b005b34801561037f57600080fd5b50610388610d4f565b6040516103959190613f23565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613f7c565b610d66565b005b3480156103d357600080fd5b506103dc610f11565b6040516103e99190613f23565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190613fa9565b610f17565b005b34801561042757600080fd5b50610442600480360381019061043d9190614028565b610f27565b005b34801561045057600080fd5b50610459610fc0565b604051610466919061406e565b60405180910390f35b34801561047b57600080fd5b50610484610fc6565b6040516104919190613f23565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc91906140c7565b610fd0565b6040516104ce9190613f23565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613fa9565b611057565b005b34801561050c57600080fd5b50610527600480360381019061052291906140c7565b611077565b005b610543600480360381019061053e919061416c565b611330565b005b34801561055157600080fd5b5061055a61168f565b6040516105679190613d24565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190613e1f565b6116a2565b005b3480156105a557600080fd5b506105ae611728565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190613e1f565b6117d8565b6040516105e49190613e8d565b60405180910390f35b3480156105f957600080fd5b506106026117ee565b60405161060f9190613dc7565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a91906141e0565b61187c565b60405161064c9190613f23565b60405180910390f35b34801561066157600080fd5b5061066a61194c565b005b34801561067857600080fd5b506106816119d4565b60405161068e9190613f23565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190614239565b6119da565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613e1f565b611a60565b6040516106f49190613e8d565b60405180910390f35b34801561070957600080fd5b50610712611aa8565b60405161071f9190613e8d565b60405180910390f35b34801561073457600080fd5b5061073d611ad1565b60405161074a9190613dc7565b60405180910390f35b34801561075f57600080fd5b5061077a600480360381019061077591906141e0565b611b63565b6040516107879190613f23565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b291906141e0565b611bac565b6040516107c49190613f23565b60405180910390f35b3480156107d957600080fd5b506107e2611bc4565b6040516107ef9190613f23565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190614396565b611bca565b005b34801561082d57600080fd5b50610848600480360381019061084391906143df565b611c60565b005b610864600480360381019061085f9190613ed4565b611dd8565b005b34801561087257600080fd5b5061088d600480360381019061088891906144c0565b611fd4565b005b34801561089b57600080fd5b506108b660048036038101906108b19190613e1f565b612050565b6040516108c39190613dc7565b60405180910390f35b3480156108d857600080fd5b506108e1612109565b6040516108ee91906145ba565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613ed4565b61211c565b005b34801561092c57600080fd5b50610947600480360381019061094291906141e0565b6121fd565b6040516109549190613f23565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f91906145d5565b612246565b6040516109919190613f23565b60405180910390f35b3480156109a657600080fd5b506109af61228f565b6040516109bc9190613f23565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190614602565b612299565b6040516109f99190613d24565b60405180910390f35b348015610a0e57600080fd5b50610a296004803603810190610a2491906141e0565b61232d565b005b348015610a3757600080fd5b50610a526004803603810190610a4d9190613e1f565b612425565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2f5750610b2e826124e0565b5b9050919050565b606060038054610b4590614671565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7190614671565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b6000610bd38261254a565b610c09576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4f826117d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd6612598565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d085750610d0681610d01612598565b612299565b155b15610d3f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4a8383836125a0565b505050565b6000610d59612652565b6002546001540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614715565b60405180910390fd5b6000610df261228f565b47610dfd9190614764565b90506000610e148383610e0f86611b63565b612657565b90506000811415610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e519061482c565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea99190614764565b9250508190555080600a6000828254610ec29190614764565b92505081905550610ed383826126c5565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f049291906148ab565b60405180910390a1505050565b60155481565b610f228383836127b9565b505050565b610f2f612598565b73ffffffffffffffffffffffffffffffffffffffff16610f4d611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90614920565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60145481565b6000600954905090565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61107283838360405180602001604052806000815250611fd4565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090614715565b60405180910390fd5b600061110483612246565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161113d9190613e8d565b602060405180830381865afa15801561115a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117e9190614955565b6111889190614764565b905060006111a0838361119b8787610fd0565b612657565b905060008114156111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd9061482c565b60405180910390fd5b80600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112729190614764565b9250508190555080600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112c89190614764565b925050819055506112da848483612caa565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611322929190614982565b60405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611395906149f7565b60405180910390fd5b6000601254905060008114156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090614a63565b60405180910390fd5b6015546113f4612d30565b1015611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c90614af5565b60405180910390fd5b6001600481111561144957611448614543565b5b601160019054906101000a900460ff16600481111561146b5761146a614543565b5b146114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614b61565b60405180910390fd5b6114b6338484612d38565b6114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614bcd565b60405180910390fd5b600f84601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115429190614764565b1115611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90614c5f565b60405180910390fd5b61044c8461158f610d4f565b6115999190614764565b11156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614ccb565b60405180910390fd5b83816115e69190614ceb565b341015611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614d91565b60405180910390fd5b83601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116779190614764565b925050819055506116888585612d96565b5050505050565b601160009054906101000a900460ff1681565b6116aa612598565b73ffffffffffffffffffffffffffffffffffffffff166116c8611aa8565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614920565b60405180910390fd5b8060158190555050565b611730612598565b73ffffffffffffffffffffffffffffffffffffffff1661174e611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614920565b60405180910390fd5b60005b6017548110156117d5576117c26117bd82611a60565b610d66565b80806117cd90614db1565b9150506117a7565b50565b60006117e382612db4565b600001519050919050565b601080546117fb90614671565b80601f016020809104026020016040519081016040528092919081815260200182805461182790614671565b80156118745780601f1061184957610100808354040283529160200191611874565b820191906000526020600020905b81548152906001019060200180831161185757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611954612598565b73ffffffffffffffffffffffffffffffffffffffff16611972611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90614920565b60405180910390fd5b6119d26000613043565b565b60125481565b6119e2612598565b73ffffffffffffffffffffffffffffffffffffffff16611a00611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614920565b60405180910390fd5b8060148190555050565b6000600d8281548110611a7657611a75614dfa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611ae090614671565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0c90614671565b8015611b595780601f10611b2e57610100808354040283529160200191611b59565b820191906000526020600020905b815481529060010190602001808311611b3c57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60166020528060005260406000206000915090505481565b60135481565b611bd2612598565b73ffffffffffffffffffffffffffffffffffffffff16611bf0611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d90614920565b60405180910390fd5b8060109080519060200190611c5c929190613b0d565b5050565b611c68612598565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611cda612598565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d87612598565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dcc9190613d24565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906149f7565b60405180910390fd5b600060135490506000811415611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890614a63565b60405180910390fd5b60026004811115611ea557611ea4614543565b5b601160019054906101000a900460ff166004811115611ec757611ec6614543565b5b14611f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe90614e75565b60405180910390fd5b605361086661044c611f199190614764565b611f239190614764565b82611f2c610d4f565b611f369190614764565b1115611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90614ccb565b60405180910390fd5b8181611f839190614ceb565b341015611fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbc90614d91565b60405180910390fd5b611fcf8383612d96565b505050565b611fdf8484846127b9565b611ffe8373ffffffffffffffffffffffffffffffffffffffff16613107565b801561201357506120118484848461312a565b155b1561204a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061205b8261254a565b61209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190614ee1565b60405180910390fd5b601160009054906101000a900460ff166120d65760106040516020016120c09190614fec565b6040516020818303038152906040529050612104565b60106120e18361327b565b6040516020016120f292919061508b565b60405160208183030381529060405290505b919050565b601160019054906101000a900460ff1681565b612124612598565b73ffffffffffffffffffffffffffffffffffffffff16612142611aa8565b73ffffffffffffffffffffffffffffffffffffffff1614612198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218f90614920565b60405180910390fd5b610d05816121a4610d4f565b6121ae9190614764565b11156121ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e690615106565b60405180910390fd5b6121f98282612d96565b5050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612335612598565b73ffffffffffffffffffffffffffffffffffffffff16612353611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a090614920565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090615198565b60405180910390fd5b61242281613043565b50565b61242d612598565b73ffffffffffffffffffffffffffffffffffffffff1661244b611aa8565b73ffffffffffffffffffffffffffffffffffffffff16146124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614920565b60405180910390fd5b8060048111156124b4576124b3614543565b5b601160016101000a81548160ff021916908360048111156124d8576124d7614543565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612555612652565b11158015612564575060015482105b8015612591575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856126a89190614ceb565b6126b291906151e7565b6126bc9190615218565b90509392505050565b80471015612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff90615298565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161272e906152e9565b60006040518083038185875af1925050503d806000811461276b576040519150601f19603f3d011682016040523d82523d6000602084013e612770565b606091505b50509050806127b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ab90615370565b60405180910390fd5b505050565b60006127c482612db4565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127eb612598565b73ffffffffffffffffffffffffffffffffffffffff16148061281e575061281d8260000151612818612598565b612299565b5b80612863575061282c612598565b73ffffffffffffffffffffffffffffffffffffffff1661284b84610bc8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061289c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612905576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561296c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297985858560016133dc565b61298960008484600001516125a0565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c3a57600154811015612c395782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca385858560016133e2565b5050505050565b612d2b8363a9059cbb60e01b8484604051602401612cc9929190614982565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e8565b505050565b600042905090565b6000612d8d612d46856134af565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506134df565b90509392505050565b612db08282604051806020016040528060008152506134f6565b5050565b612dbc613b93565b600082905080612dca612652565b11158015612dd9575060015481105b1561300c576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161300a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eee57809250505061303e565b5b60011561300957818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461300457809250505061303e565b612eef565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613150612598565b8786866040518563ffffffff1660e01b815260040161317294939291906153e5565b6020604051808303816000875af19250505080156131ae57506040513d601f19601f820116820180604052508101906131ab9190615446565b60015b613228573d80600081146131de576040519150601f19603f3d011682016040523d82523d6000602084013e6131e3565b606091505b50600081511415613220576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156132c3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d7565b600082905060005b600082146132f55780806132de90614db1565b915050600a826132ee91906151e7565b91506132cb565b60008167ffffffffffffffff8111156133115761331061426b565b5b6040519080825280601f01601f1916602001820160405280156133435781602001600182028036833780820191505090505b5090505b600085146133d05760018261335c9190615218565b9150600a8561336b9190615473565b60306133779190614764565b60f81b81838151811061338d5761338c614dfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133c991906151e7565b9450613347565b8093505050505b919050565b50505050565b50505050565b600061344a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135089092919063ffffffff16565b90506000815111156134aa578080602001905181019061346a91906154b9565b6134a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a090615558565b60405180910390fd5b5b505050565b6000816040516020016134c291906155c0565b604051602081830303815290604052805190602001209050919050565b60006134ee8260145485613520565b905092915050565b6135038383836001613537565b505050565b60606135178484600085613906565b90509392505050565b60008261352d8584613a1a565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135a5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156135e0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ed60008683876133dc565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156137b757506137b68773ffffffffffffffffffffffffffffffffffffffff16613107565b5b1561387d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461382c600088848060010195508861312a565b613862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156137bd57826001541461387857600080fd5b6138e9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561387e575b8160018190555050506138ff60008683876133e2565b5050505050565b60608247101561394b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139429061564d565b60405180910390fd5b61395485613107565b613993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398a906156b9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139bc919061570a565b60006040518083038185875af1925050503d80600081146139f9576040519150601f19603f3d011682016040523d82523d6000602084013e6139fe565b606091505b5091509150613a0e828286613a8f565b92505050949350505050565b60008082905060005b8451811015613a84576000858281518110613a4157613a40614dfa565b5b60200260200101519050808311613a6357613a5c8382613af6565b9250613a70565b613a6d8184613af6565b92505b508080613a7c90614db1565b915050613a23565b508091505092915050565b60608315613a9f57829050613aef565b600083511115613ab25782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae69190613dc7565b60405180910390fd5b9392505050565b600082600052816020526040600020905092915050565b828054613b1990614671565b90600052602060002090601f016020900481019282613b3b5760008555613b82565b82601f10613b5457805160ff1916838001178555613b82565b82800160010185558215613b82579182015b82811115613b81578251825591602001919060010190613b66565b5b509050613b8f9190613bd6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bef576000816000905550600101613bd7565b5090565b600082825260208201905092915050565b7f4f6e6c7920696620796f75206d696e7400000000000000000000000000000000600082015250565b6000613c3a601083613bf3565b9150613c4582613c04565b602082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cb981613c84565b8114613cc457600080fd5b50565b600081359050613cd681613cb0565b92915050565b600060208284031215613cf257613cf1613c7a565b5b6000613d0084828501613cc7565b91505092915050565b60008115159050919050565b613d1e81613d09565b82525050565b6000602082019050613d396000830184613d15565b92915050565b600081519050919050565b60005b83811015613d68578082015181840152602081019050613d4d565b83811115613d77576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d9982613d3f565b613da38185613bf3565b9350613db3818560208601613d4a565b613dbc81613d7d565b840191505092915050565b60006020820190508181036000830152613de18184613d8e565b905092915050565b6000819050919050565b613dfc81613de9565b8114613e0757600080fd5b50565b600081359050613e1981613df3565b92915050565b600060208284031215613e3557613e34613c7a565b5b6000613e4384828501613e0a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7782613e4c565b9050919050565b613e8781613e6c565b82525050565b6000602082019050613ea26000830184613e7e565b92915050565b613eb181613e6c565b8114613ebc57600080fd5b50565b600081359050613ece81613ea8565b92915050565b60008060408385031215613eeb57613eea613c7a565b5b6000613ef985828601613ebf565b9250506020613f0a85828601613e0a565b9150509250929050565b613f1d81613de9565b82525050565b6000602082019050613f386000830184613f14565b92915050565b6000613f4982613e4c565b9050919050565b613f5981613f3e565b8114613f6457600080fd5b50565b600081359050613f7681613f50565b92915050565b600060208284031215613f9257613f91613c7a565b5b6000613fa084828501613f67565b91505092915050565b600080600060608486031215613fc257613fc1613c7a565b5b6000613fd086828701613ebf565b9350506020613fe186828701613ebf565b9250506040613ff286828701613e0a565b9150509250925092565b61400581613d09565b811461401057600080fd5b50565b60008135905061402281613ffc565b92915050565b60006020828403121561403e5761403d613c7a565b5b600061404c84828501614013565b91505092915050565b6000819050919050565b61406881614055565b82525050565b6000602082019050614083600083018461405f565b92915050565b600061409482613e6c565b9050919050565b6140a481614089565b81146140af57600080fd5b50565b6000813590506140c18161409b565b92915050565b600080604083850312156140de576140dd613c7a565b5b60006140ec858286016140b2565b92505060206140fd85828601613ebf565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261412c5761412b614107565b5b8235905067ffffffffffffffff8111156141495761414861410c565b5b60208301915083602082028301111561416557614164614111565b5b9250929050565b6000806000806060858703121561418657614185613c7a565b5b600061419487828801613ebf565b94505060206141a587828801613e0a565b935050604085013567ffffffffffffffff8111156141c6576141c5613c7f565b5b6141d287828801614116565b925092505092959194509250565b6000602082840312156141f6576141f5613c7a565b5b600061420484828501613ebf565b91505092915050565b61421681614055565b811461422157600080fd5b50565b6000813590506142338161420d565b92915050565b60006020828403121561424f5761424e613c7a565b5b600061425d84828501614224565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142a382613d7d565b810181811067ffffffffffffffff821117156142c2576142c161426b565b5b80604052505050565b60006142d5613c70565b90506142e1828261429a565b919050565b600067ffffffffffffffff8211156143015761430061426b565b5b61430a82613d7d565b9050602081019050919050565b82818337600083830152505050565b6000614339614334846142e6565b6142cb565b90508281526020810184848401111561435557614354614266565b5b614360848285614317565b509392505050565b600082601f83011261437d5761437c614107565b5b813561438d848260208601614326565b91505092915050565b6000602082840312156143ac576143ab613c7a565b5b600082013567ffffffffffffffff8111156143ca576143c9613c7f565b5b6143d684828501614368565b91505092915050565b600080604083850312156143f6576143f5613c7a565b5b600061440485828601613ebf565b925050602061441585828601614013565b9150509250929050565b600067ffffffffffffffff82111561443a5761443961426b565b5b61444382613d7d565b9050602081019050919050565b600061446361445e8461441f565b6142cb565b90508281526020810184848401111561447f5761447e614266565b5b61448a848285614317565b509392505050565b600082601f8301126144a7576144a6614107565b5b81356144b7848260208601614450565b91505092915050565b600080600080608085870312156144da576144d9613c7a565b5b60006144e887828801613ebf565b94505060206144f987828801613ebf565b935050604061450a87828801613e0a565b925050606085013567ffffffffffffffff81111561452b5761452a613c7f565b5b61453787828801614492565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6005811061458357614582614543565b5b50565b600081905061459482614572565b919050565b60006145a482614586565b9050919050565b6145b481614599565b82525050565b60006020820190506145cf60008301846145ab565b92915050565b6000602082840312156145eb576145ea613c7a565b5b60006145f9848285016140b2565b91505092915050565b6000806040838503121561461957614618613c7a565b5b600061462785828601613ebf565b925050602061463885828601613ebf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468957607f821691505b6020821081141561469d5761469c614642565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006146ff602683613bf3565b915061470a826146a3565b604082019050919050565b6000602082019050818103600083015261472e816146f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061476f82613de9565b915061477a83613de9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147af576147ae614735565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614816602b83613bf3565b9150614821826147ba565b604082019050919050565b6000602082019050818103600083015261484581614809565b9050919050565b6000819050919050565b600061487161486c61486784613e4c565b61484c565b613e4c565b9050919050565b600061488382614856565b9050919050565b600061489582614878565b9050919050565b6148a58161488a565b82525050565b60006040820190506148c0600083018561489c565b6148cd6020830184613f14565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061490a602083613bf3565b9150614915826148d4565b602082019050919050565b60006020820190508181036000830152614939816148fd565b9050919050565b60008151905061494f81613df3565b92915050565b60006020828403121561496b5761496a613c7a565b5b600061497984828501614940565b91505092915050565b60006040820190506149976000830185613e7e565b6149a46020830184613f14565b9392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b60006149e1601f83613bf3565b91506149ec826149ab565b602082019050919050565b60006020820190508181036000830152614a10816149d4565b9050919050565b7f5072696365206973203000000000000000000000000000000000000000000000600082015250565b6000614a4d600a83613bf3565b9150614a5882614a17565b602082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b7f57686974656c6973742053616c6520686173206e6f742073746172746564207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b6000614adf602283613bf3565b9150614aea82614a83565b604082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b7f57686974656c6973742073616c65206973206e6f742061637469766174656400600082015250565b6000614b4b601f83613bf3565b9150614b5682614b15565b602082019050919050565b60006020820190508181036000830152614b7a81614b3e565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000614bb7600f83613bf3565b9150614bc282614b81565b602082019050919050565b60006020820190508181036000830152614be681614baa565b9050919050565b7f596f752063616e206f6e6c7920676574203135204e465473206f6e207468652060008201527f57686974656c6973742053616c65000000000000000000000000000000000000602082015250565b6000614c49602e83613bf3565b9150614c5482614bed565b604082019050919050565b60006020820190508181036000830152614c7881614c3c565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614cb5601383613bf3565b9150614cc082614c7f565b602082019050919050565b60006020820190508181036000830152614ce481614ca8565b9050919050565b6000614cf682613de9565b9150614d0183613de9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3a57614d39614735565b5b828202905092915050565b7f4e6f7420656e6f756768742066756e6473000000000000000000000000000000600082015250565b6000614d7b601183613bf3565b9150614d8682614d45565b602082019050919050565b60006020820190508181036000830152614daa81614d6e565b9050919050565b6000614dbc82613de9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614def57614dee614735565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5075626c69632073616c65206973206e6f742061637469766174656400000000600082015250565b6000614e5f601c83613bf3565b9150614e6a82614e29565b602082019050919050565b60006020820190508181036000830152614e8e81614e52565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614ecb601f83613bf3565b9150614ed682614e95565b602082019050919050565b60006020820190508181036000830152614efa81614ebe565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614f2e81614671565b614f388186614f01565b94506001821660008114614f535760018114614f6457614f97565b60ff19831686528186019350614f97565b614f6d85614f0c565b60005b83811015614f8f57815481890152600182019150602081019050614f70565b838801955050505b50505092915050565b7f68696464656e2e6a736f6e000000000000000000000000000000000000000000600082015250565b6000614fd6600b83614f01565b9150614fe182614fa0565b600b82019050919050565b6000614ff88284614f21565b915061500382614fc9565b915081905092915050565b600061501982613d3f565b6150238185614f01565b9350615033818560208601613d4a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615075600583614f01565b91506150808261503f565b600582019050919050565b60006150978285614f21565b91506150a3828461500e565b91506150ae82615068565b91508190509392505050565b7f52656163686564206d617820537570706c790000000000000000000000000000600082015250565b60006150f0601283613bf3565b91506150fb826150ba565b602082019050919050565b6000602082019050818103600083015261511f816150e3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615182602683613bf3565b915061518d82615126565b604082019050919050565b600060208201905081810360008301526151b181615175565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151f282613de9565b91506151fd83613de9565b92508261520d5761520c6151b8565b5b828204905092915050565b600061522382613de9565b915061522e83613de9565b92508282101561524157615240614735565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615282601d83613bf3565b915061528d8261524c565b602082019050919050565b600060208201905081810360008301526152b181615275565b9050919050565b600081905092915050565b50565b60006152d36000836152b8565b91506152de826152c3565b600082019050919050565b60006152f4826152c6565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061535a603a83613bf3565b9150615365826152fe565b604082019050919050565b600060208201905081810360008301526153898161534d565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153b782615390565b6153c1818561539b565b93506153d1818560208601613d4a565b6153da81613d7d565b840191505092915050565b60006080820190506153fa6000830187613e7e565b6154076020830186613e7e565b6154146040830185613f14565b818103606083015261542681846153ac565b905095945050505050565b60008151905061544081613cb0565b92915050565b60006020828403121561545c5761545b613c7a565b5b600061546a84828501615431565b91505092915050565b600061547e82613de9565b915061548983613de9565b925082615499576154986151b8565b5b828206905092915050565b6000815190506154b381613ffc565b92915050565b6000602082840312156154cf576154ce613c7a565b5b60006154dd848285016154a4565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615542602a83613bf3565b915061554d826154e6565b604082019050919050565b6000602082019050818103600083015261557181615535565b9050919050565b60008160601b9050919050565b600061559082615578565b9050919050565b60006155a282615585565b9050919050565b6155ba6155b582613e6c565b615597565b82525050565b60006155cc82846155a9565b60148201915081905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615637602683613bf3565b9150615642826155db565b604082019050919050565b600060208201905081810360008301526156668161562a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006156a3601d83613bf3565b91506156ae8261566d565b602082019050919050565b600060208201905081810360008301526156d281615696565b9050919050565b60006156e482615390565b6156ee81856152b8565b93506156fe818560208601613d4a565b80840191505092915050565b600061571682846156d9565b91508190509291505056fea2646970667358221220da070ead08fa5fddcfea23dd87c889318ffd57193e6dcb68ae81b7bdce8ec0e464736f6c634300080c0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0d64b2877a0dd386837e7322bfa676e5549b2feb59383aa67f9690647efd50fdf00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000586fd0ad54c45b07f47e753860f96c2f30a4321d000000000000000000000000a11388f71328e734abb96486e6ab7ba8d2a195a40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d61487355377968646b4c756a68316334375961716d4d78756b58455036596739536653717866554367312f00000000000000000000

-----Decoded View---------------
Arg [0] : _team (address[]): 0x586fd0Ad54c45B07f47E753860f96c2F30a4321d,0xA11388f71328e734AbB96486e6Ab7Ba8D2A195a4
Arg [1] : _teamShares (uint256[]): 50,50
Arg [2] : _merkleRoot (bytes32): 0xd64b2877a0dd386837e7322bfa676e5549b2feb59383aa67f9690647efd50fdf
Arg [3] : _baseURI (string): ipfs://QmTMaHsU7yhdkLujh1c47YaqmMxukXEP6Yg9SfSqxfUCg1/

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : d64b2877a0dd386837e7322bfa676e5549b2feb59383aa67f9690647efd50fdf
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 000000000000000000000000586fd0ad54c45b07f47e753860f96c2f30a4321d
Arg [6] : 000000000000000000000000a11388f71328e734abb96486e6ab7ba8d2a195a4
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [11] : 697066733a2f2f516d544d61487355377968646b4c756a68316334375961716d
Arg [12] : 4d78756b58455036596739536653717866554367312f00000000000000000000


Deployed Bytecode Sourcemap

63129:4520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67612:26;;;;;;;;;;:::i;:::-;;;;;;;;63129:4520;;;;25709:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29026:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30529:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30092:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24958:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60481:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63808:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31394:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66846:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63774:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58826:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59955:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31635:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61315:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64385:857;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63379:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65935:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67406:151;;;;;;;;;;;;;:::i;:::-;;28834:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63349:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26078:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45353:103;;;;;;;;;;;;;:::i;:::-;;63682:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66732:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60181:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44702:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29195:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59677:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63855:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63725:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66058:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30805:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65250:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31891:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66366:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63416:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65740:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59473:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59263:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59011:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31163:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45611:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66266:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25709:305;25811:4;25863:25;25848:40;;;:11;:40;;;;:105;;;;25920:33;25905:48;;;:11;:48;;;;25848:105;:158;;;;25970:36;25994:11;25970:23;:36::i;:::-;25848:158;25828:178;;25709:305;;;:::o;29026:100::-;29080:13;29113:5;29106:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29026:100;:::o;30529:204::-;30597:7;30622:16;30630:7;30622;:16::i;:::-;30617:64;;30647:34;;;;;;;;;;;;;;30617:64;30701:15;:24;30717:7;30701:24;;;;;;;;;;;;;;;;;;;;;30694:31;;30529:204;;;:::o;30092:371::-;30165:13;30181:24;30197:7;30181:15;:24::i;:::-;30165:40;;30226:5;30220:11;;:2;:11;;;30216:48;;;30240:24;;;;;;;;;;;;;;30216:48;30297:5;30281:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30307:37;30324:5;30331:12;:10;:12::i;:::-;30307:16;:37::i;:::-;30306:38;30281:63;30277:138;;;30368:35;;;;;;;;;;;;;;30277:138;30427:28;30436:2;30440:7;30449:5;30427:8;:28::i;:::-;30154:309;30092:371;;:::o;24958:303::-;25002:7;25227:15;:13;:15::i;:::-;25212:12;;25196:13;;:28;:46;25189:53;;24958:303;:::o;60481:566::-;60576:1;60557:7;:16;60565:7;60557:16;;;;;;;;;;;;;;;;:20;60549:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60633:21;60681:15;:13;:15::i;:::-;60657:21;:39;;;;:::i;:::-;60633:63;;60707:15;60725:58;60741:7;60750:13;60765:17;60774:7;60765:8;:17::i;:::-;60725:15;:58::i;:::-;60707:76;;60815:1;60804:7;:12;;60796:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60899:7;60877:9;:18;60887:7;60877:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;60935:7;60917:14;;:25;;;;;;;:::i;:::-;;;;;;;;60955:35;60973:7;60982;60955:17;:35::i;:::-;61006:33;61022:7;61031;61006:33;;;;;;;:::i;:::-;;;;;;;;60538:509;;60481:566;:::o;63808:38::-;;;;:::o;31394:170::-;31528:28;31538:4;31544:2;31548:7;31528:9;:28::i;:::-;31394:170;;;:::o;66846:93::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66922:9:::1;66911:8;;:20;;;;;;;;;;;;;;;;;;66846:93:::0;:::o;63774:25::-;;;;:::o;58826:91::-;58870:7;58897:12;;58890:19;;58826:91;:::o;59955:135::-;60025:7;60052:14;:21;60067:5;60052:21;;;;;;;;;;;;;;;:30;60074:7;60052:30;;;;;;;;;;;;;;;;60045:37;;59955:135;;;;:::o;31635:185::-;31773:39;31790:4;31796:2;31800:7;31773:39;;;;;;;;;;;;:16;:39::i;:::-;31635:185;;;:::o;61315:641::-;61416:1;61397:7;:16;61405:7;61397:16;;;;;;;;;;;;;;;;:20;61389:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61473:21;61530:20;61544:5;61530:13;:20::i;:::-;61497:5;:15;;;61521:4;61497:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;61473:77;;61561:15;61579:65;61595:7;61604:13;61619:24;61628:5;61635:7;61619:8;:24::i;:::-;61579:15;:65::i;:::-;61561:83;;61676:1;61665:7;:12;;61657:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61772:7;61738:14;:21;61753:5;61738:21;;;;;;;;;;;;;;;:30;61760:7;61738:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;61820:7;61790:19;:26;61810:5;61790:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;61840:47;61863:5;61870:7;61879;61840:22;:47::i;:::-;61924:5;61903:45;;;61931:7;61940;61903:45;;;;;;;:::i;:::-;;;;;;;;61378:578;;61315:641;;:::o;64385:857::-;64311:10;64298:23;;:9;:23;;;64290:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64510:10:::1;64523:11;;64510:24;;64562:1;64553:5;:10;;64545:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;64614:13;;64597;:11;:13::i;:::-;:30;;64589:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64700:18;64685:33;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;64677:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64773:33;64787:10;64799:6;;64773:13;:33::i;:::-;64765:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63671:2;64892:9;64845:32;:44;64878:10;64845:44;;;;;;;;;;;;;;;;:56;;;;:::i;:::-;:73;;64837:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;63532:4;65004:9;64988:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;;64980:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;65094:9;65086:5;:17;;;;:::i;:::-;65073:9;:30;;65065:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65184:9;65136:32;:44;65169:10;65136:44;;;;;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;;;;;;;65204:30;65214:8;65224:9;65204;:30::i;:::-;64499:743;64385:857:::0;;;;:::o;63379:28::-;;;;;;;;;;;;;:::o;65935:115::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66028:14:::1;66012:13;:30;;;;65935:115:::0;:::o;67406:151::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67462:6:::1;67458:92;67479:10;;67475:1;:14;67458:92;;;67512:26;67528:8;67534:1;67528:5;:8::i;:::-;67512:7;:26::i;:::-;67492:3;;;;;:::i;:::-;;;;67458:92;;;;67406:151::o:0;28834:125::-;28898:7;28925:21;28938:7;28925:12;:21::i;:::-;:26;;;28918:33;;28834:125;;;:::o;63349:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26078:206::-;26142:7;26183:1;26166:19;;:5;:19;;;26162:60;;;26194:28;;;;;;;;;;;;;;26162:60;26248:12;:19;26261:5;26248:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26240:36;;26233:43;;26078:206;;;:::o;45353:103::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45418:30:::1;45445:1;45418:18;:30::i;:::-;45353:103::o:0;63682:36::-;;;;:::o;66732:106::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66819:11:::1;66806:10;:24;;;;66732:106:::0;:::o;60181:100::-;60232:7;60259;60267:5;60259:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60252:21;;60181:100;;;:::o;44702:87::-;44748:7;44775:6;;;;;;;;;;;44768:13;;44702:87;:::o;29195:104::-;29251:13;29284:7;29277:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29195:104;:::o;59677:109::-;59733:7;59760:9;:18;59770:7;59760:18;;;;;;;;;;;;;;;;59753:25;;59677:109;;;:::o;63855:64::-;;;;;;;;;;;;;;;;;:::o;63725:40::-;;;;:::o;66058:100::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66142:8:::1;66132:7;:18;;;;;;;;;;;;:::i;:::-;;66058:100:::0;:::o;30805:287::-;30916:12;:10;:12::i;:::-;30904:24;;:8;:24;;;30900:54;;;30937:17;;;;;;;;;;;;;;30900:54;31012:8;30967:18;:32;30986:12;:10;:12::i;:::-;30967:32;;;;;;;;;;;;;;;:42;31000:8;30967:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31065:8;31036:48;;31051:12;:10;:12::i;:::-;31036:48;;;31075:8;31036:48;;;;;;:::i;:::-;;;;;;;;30805:287;;:::o;65250:482::-;64311:10;64298:23;;:9;:23;;;64290:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65349:10:::1;65362:15;;65349:28;;65405:1;65396:5;:10;;65388:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;65455:15;65440:30;;;;;;;;:::i;:::-;;:11;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;65432:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;63622:2;63578:4;63532;65551:26;;;;:::i;:::-;:37;;;;:::i;:::-;65538:9;65522:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:66;;65514:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;65652:9;65644:5;:17;;;;:::i;:::-;65631:9;:30;;65623:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65694:30;65704:8;65714:9;65694;:30::i;:::-;65338:394;65250:482:::0;;:::o;31891:369::-;32058:28;32068:4;32074:2;32078:7;32058:9;:28::i;:::-;32101:15;:2;:13;;;:15::i;:::-;:76;;;;;32121:56;32152:4;32158:2;32162:7;32171:5;32121:30;:56::i;:::-;32120:57;32101:76;32097:156;;;32201:40;;;;;;;;;;;;;;32097:156;31891:369;;;;:::o;66366:358::-;66437:13;66471:17;66479:8;66471:7;:17::i;:::-;66463:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66542:8;;;;;;;;;;;66537:97;;66598:7;66581:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;66567:55;;;;66537:97;66677:7;66686:19;:8;:17;:19::i;:::-;66660:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66646:70;;66366:358;;;;:::o;63416:23::-;;;;;;;;;;;;;:::o;65740:187::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63483:4:::1;65837:9;65821:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;65813:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;65894:25;65904:3;65909:9;65894;:25::i;:::-;65740:187:::0;;:::o;59473:105::-;59527:7;59554;:16;59562:7;59554:16;;;;;;;;;;;;;;;;59547:23;;59473:105;;;:::o;59263:119::-;59321:7;59348:19;:26;59368:5;59348:26;;;;;;;;;;;;;;;;59341:33;;59263:119;;;:::o;59011:95::-;59057:7;59084:14;;59077:21;;59011:95;:::o;31163:164::-;31260:4;31284:18;:25;31303:5;31284:25;;;;;;;;;;;;;;;:35;31310:8;31284:35;;;;;;;;;;;;;;;;;;;;;;;;;31277:42;;31163:164;;;;:::o;45611:201::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45720:1:::1;45700:22;;:8;:22;;;;45692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45776:28;45795:8;45776:18;:28::i;:::-;45611:201:::0;:::o;66266:92::-;44933:12;:10;:12::i;:::-;44922:23;;:7;:5;:7::i;:::-;:23;;;44914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66344:5:::1;66339:11;;;;;;;;:::i;:::-;;66325;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;66266:92:::0;:::o;21165:157::-;21250:4;21289:25;21274:40;;;:11;:40;;;;21267:47;;21165:157;;;:::o;32515:187::-;32572:4;32615:7;32596:15;:13;:15::i;:::-;:26;;:53;;;;;32636:13;;32626:7;:23;32596:53;:98;;;;;32667:11;:20;32679:7;32667:20;;;;;;;;;;;:27;;;;;;;;;;;;32666:28;32596:98;32589:105;;32515:187;;;:::o;17952:98::-;18005:7;18032:10;18025:17;;17952:98;:::o;40650:196::-;40792:2;40765:15;:24;40781:7;40765:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40830:7;40826:2;40810:28;;40819:5;40810:28;;;;;;;;;;;;40650:196;;;:::o;24682:92::-;24738:7;24682:92;:::o;62134:248::-;62280:7;62359:15;62344:12;;62324:7;:16;62332:7;62324:16;;;;;;;;;;;;;;;;62308:13;:32;;;;:::i;:::-;62307:49;;;;:::i;:::-;:67;;;;:::i;:::-;62300:74;;62134:248;;;;;:::o;11258:317::-;11373:6;11348:21;:31;;11340:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11427:12;11445:9;:14;;11467:6;11445:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11426:52;;;11497:7;11489:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;11329:246;11258:317;;:::o;35628:2113::-;35743:35;35781:21;35794:7;35781:12;:21::i;:::-;35743:59;;35815:22;35857:13;:18;;;35841:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35892:50;35909:13;:18;;;35929:12;:10;:12::i;:::-;35892:16;:50::i;:::-;35841:101;:154;;;;35983:12;:10;:12::i;:::-;35959:36;;:20;35971:7;35959:11;:20::i;:::-;:36;;;35841:154;35815:181;;36014:17;36009:66;;36040:35;;;;;;;;;;;;;;36009:66;36112:4;36090:26;;:13;:18;;;:26;;;36086:67;;36125:28;;;;;;;;;;;;;;36086:67;36182:1;36168:16;;:2;:16;;;36164:52;;;36193:23;;;;;;;;;;;;;;36164:52;36229:43;36251:4;36257:2;36261:7;36270:1;36229:21;:43::i;:::-;36337:49;36354:1;36358:7;36367:13;:18;;;36337:8;:49::i;:::-;36712:1;36682:12;:18;36695:4;36682:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36756:1;36728:12;:16;36741:2;36728:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36802:2;36774:11;:20;36786:7;36774:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36864:15;36819:11;:20;36831:7;36819:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37132:19;37164:1;37154:7;:11;37132:33;;37225:1;37184:43;;:11;:24;37196:11;37184:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37180:445;;;37409:13;;37395:11;:27;37391:219;;;37479:13;:18;;;37447:11;:24;37459:11;37447:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37562:13;:28;;;37520:11;:24;37532:11;37520:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37391:219;37180:445;36657:979;37672:7;37668:2;37653:27;;37662:4;37653:27;;;;;;;;;;;;37691:42;37712:4;37718:2;37722:7;37731:1;37691:20;:42::i;:::-;35732:2009;;35628:2113;;;:::o;52151:211::-;52268:86;52288:5;52318:23;;;52343:2;52347:5;52295:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52268:19;:86::i;:::-;52151:211;;;:::o;66166:92::-;66211:4;66235:15;66228:22;;66166:92;:::o;66947:153::-;67037:4;67061:31;67069:14;67074:8;67069:4;:14::i;:::-;67085:6;;67061:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:31::i;:::-;67054:38;;66947:153;;;;;:::o;32710:104::-;32779:27;32789:2;32793:8;32779:27;;;;;;;;;;;;:9;:27::i;:::-;32710:104;;:::o;27663:1109::-;27725:21;;:::i;:::-;27759:12;27774:7;27759:22;;27842:4;27823:15;:13;:15::i;:::-;:23;;:47;;;;;27857:13;;27850:4;:20;27823:47;27819:886;;;27891:31;27925:11;:17;27937:4;27925:17;;;;;;;;;;;27891:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27966:9;:16;;;27961:729;;28037:1;28011:28;;:9;:14;;;:28;;;28007:101;;28075:9;28068:16;;;;;;28007:101;28410:261;28417:4;28410:261;;;28450:6;;;;;;;;28495:11;:17;28507:4;28495:17;;;;;;;;;;;28483:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28569:1;28543:28;;:9;:14;;;:28;;;28539:109;;28611:9;28604:16;;;;;;28539:109;28410:261;;;27961:729;27872:833;27819:886;28733:31;;;;;;;;;;;;;;27663:1109;;;;:::o;45972:191::-;46046:16;46065:6;;;;;;;;;;;46046:25;;46091:8;46082:6;;:17;;;;;;;;;;;;;;;;;;46146:8;46115:40;;46136:8;46115:40;;;;;;;;;;;;46035:128;45972:191;:::o;9997:326::-;10057:4;10314:1;10292:7;:19;;;:23;10285:30;;9997:326;;;:::o;41338:667::-;41501:4;41538:2;41522:36;;;41559:12;:10;:12::i;:::-;41573:4;41579:7;41588:5;41522:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41518:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41773:1;41756:6;:13;:18;41752:235;;;41802:40;;;;;;;;;;;;;;41752:235;41945:6;41939:13;41930:6;41926:2;41922:15;41915:38;41518:480;41651:45;;;41641:55;;;:6;:55;;;;41634:62;;;41338:667;;;;;;:::o;18537:723::-;18593:13;18823:1;18814:5;:10;18810:53;;;18841:10;;;;;;;;;;;;;;;;;;;;;18810:53;18873:12;18888:5;18873:20;;18904:14;18929:78;18944:1;18936:4;:9;18929:78;;18962:8;;;;;:::i;:::-;;;;18993:2;18985:10;;;;;:::i;:::-;;;18929:78;;;19017:19;19049:6;19039:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19017:39;;19067:154;19083:1;19074:5;:10;19067:154;;19111:1;19101:11;;;;;:::i;:::-;;;19178:2;19170:5;:10;;;;:::i;:::-;19157:2;:24;;;;:::i;:::-;19144:39;;19127:6;19134;19127:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19207:2;19198:11;;;;;:::i;:::-;;;19067:154;;;19245:6;19231:21;;;;;18537:723;;;;:::o;42653:159::-;;;;;:::o;43471:158::-;;;;;:::o;54724:716::-;55148:23;55174:69;55202:4;55174:69;;;;;;;;;;;;;;;;;55182:5;55174:27;;;;:69;;;;;:::i;:::-;55148:95;;55278:1;55258:10;:17;:21;55254:179;;;55355:10;55344:30;;;;;;;;;;;;:::i;:::-;55336:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55254:179;54794:646;54724:716;;:::o;67108:126::-;67162:7;67216:8;67199:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;67189:37;;;;;;67182:44;;67108:126;;;:::o;67242:156::-;67321:4;67345:45;67364:6;67372:10;;67384:5;67345:18;:45::i;:::-;67338:52;;67242:156;;;;:::o;33177:163::-;33300:32;33306:2;33310:8;33320:5;33327:4;33300:5;:32::i;:::-;33177:163;;;:::o;12742:229::-;12879:12;12911:52;12933:6;12941:4;12947:1;12950:12;12911:21;:52::i;:::-;12904:59;;12742:229;;;;;:::o;47099:190::-;47224:4;47277;47248:25;47261:5;47268:4;47248:12;:25::i;:::-;:33;47241:40;;47099:190;;;;;:::o;33599:1775::-;33738:20;33761:13;;33738:36;;33803:1;33789:16;;:2;:16;;;33785:48;;;33814:19;;;;;;;;;;;;;;33785:48;33860:1;33848:8;:13;33844:44;;;33870:18;;;;;;;;;;;;;;33844:44;33901:61;33931:1;33935:2;33939:12;33953:8;33901:21;:61::i;:::-;34274:8;34239:12;:16;34252:2;34239:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34338:8;34298:12;:16;34311:2;34298:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34397:2;34364:11;:25;34376:12;34364:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34464:15;34414:11;:25;34426:12;34414:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34497:20;34520:12;34497:35;;34547:11;34576:8;34561:12;:23;34547:37;;34605:4;:23;;;;;34613:15;:2;:13;;;:15::i;:::-;34605:23;34601:641;;;34649:314;34705:12;34701:2;34680:38;;34697:1;34680:38;;;;;;;;;;;;34746:69;34785:1;34789:2;34793:14;;;;;;34809:5;34746:30;:69::i;:::-;34741:174;;34851:40;;;;;;;;;;;;;;34741:174;34958:3;34942:12;:19;;34649:314;;35044:12;35027:13;;:29;35023:43;;35058:8;;;35023:43;34601:641;;;35107:120;35163:14;;;;;;35159:2;35138:40;;35155:1;35138:40;;;;;;;;;;;;35222:3;35206:12;:19;;35107:120;;34601:641;35272:12;35256:13;:28;;;;34214:1082;;35306:60;35335:1;35339:2;35343:12;35357:8;35306:20;:60::i;:::-;33727:1647;33599:1775;;;;:::o;13862:510::-;14032:12;14090:5;14065:21;:30;;14057:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;14157:18;14168:6;14157:10;:18::i;:::-;14149:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14223:12;14237:23;14264:6;:11;;14283:5;14290:4;14264:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14222:73;;;;14313:51;14330:7;14339:10;14351:12;14313:16;:51::i;:::-;14306:58;;;;13862:510;;;;;;:::o;47651:675::-;47734:7;47754:20;47777:4;47754:27;;47797:9;47792:497;47816:5;:12;47812:1;:16;47792:497;;;47850:20;47873:5;47879:1;47873:8;;;;;;;;:::i;:::-;;;;;;;;47850:31;;47916:12;47900;:28;47896:382;;48043:42;48058:12;48072;48043:14;:42::i;:::-;48028:57;;47896:382;;;48220:42;48235:12;48249;48220:14;:42::i;:::-;48205:57;;47896:382;47835:454;47830:3;;;;;:::i;:::-;;;;47792:497;;;;48306:12;48299:19;;;47651:675;;;;:::o;16548:712::-;16698:12;16727:7;16723:530;;;16758:10;16751:17;;;;16723:530;16892:1;16872:10;:17;:21;16868:374;;;17070:10;17064:17;17131:15;17118:10;17114:2;17110:19;17103:44;16868:374;17213:12;17206:20;;;;;;;;;;;:::i;:::-;;;;;;;;16548:712;;;;;;:::o;48334:224::-;48402:13;48465:1;48459:4;48452:15;48494:1;48488:4;48481:15;48535:4;48529;48519:21;48510:30;;48334:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:166::-;322:18;318:1;310:6;306:14;299:42;182:166;:::o;354:366::-;496:3;517:67;581:2;576:3;517:67;:::i;:::-;510:74;;593:93;682:3;593:93;:::i;:::-;711:2;706:3;702:12;695:19;;354:366;;;:::o;726:419::-;892:4;930:2;919:9;915:18;907:26;;979:9;973:4;969:20;965:1;954:9;950:17;943:47;1007:131;1133:4;1007:131;:::i;:::-;999:139;;726:419;;;:::o;1151:75::-;1184:6;1217:2;1211:9;1201:19;;1151:75;:::o;1232:117::-;1341:1;1338;1331:12;1355:117;1464:1;1461;1454:12;1478:149;1514:7;1554:66;1547:5;1543:78;1532:89;;1478:149;;;:::o;1633:120::-;1705:23;1722:5;1705:23;:::i;:::-;1698:5;1695:34;1685:62;;1743:1;1740;1733:12;1685:62;1633:120;:::o;1759:137::-;1804:5;1842:6;1829:20;1820:29;;1858:32;1884:5;1858:32;:::i;:::-;1759:137;;;;:::o;1902:327::-;1960:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:52;2204:7;2195:6;2184:9;2180:22;2160:52;:::i;:::-;2150:62;;2106:116;1902:327;;;;:::o;2235:90::-;2269:7;2312:5;2305:13;2298:21;2287:32;;2235:90;;;:::o;2331:109::-;2412:21;2427:5;2412:21;:::i;:::-;2407:3;2400:34;2331:109;;:::o;2446:210::-;2533:4;2571:2;2560:9;2556:18;2548:26;;2584:65;2646:1;2635:9;2631:17;2622:6;2584:65;:::i;:::-;2446:210;;;;:::o;2662:99::-;2714:6;2748:5;2742:12;2732:22;;2662:99;;;:::o;2767:307::-;2835:1;2845:113;2859:6;2856:1;2853:13;2845:113;;;2944:1;2939:3;2935:11;2929:18;2925:1;2920:3;2916:11;2909:39;2881:2;2878:1;2874:10;2869:15;;2845:113;;;2976:6;2973:1;2970:13;2967:101;;;3056:1;3047:6;3042:3;3038:16;3031:27;2967:101;2816:258;2767:307;;;:::o;3080:102::-;3121:6;3172:2;3168:7;3163:2;3156:5;3152:14;3148:28;3138:38;;3080:102;;;:::o;3188:364::-;3276:3;3304:39;3337:5;3304:39;:::i;:::-;3359:71;3423:6;3418:3;3359:71;:::i;:::-;3352:78;;3439:52;3484:6;3479:3;3472:4;3465:5;3461:16;3439:52;:::i;:::-;3516:29;3538:6;3516:29;:::i;:::-;3511:3;3507:39;3500:46;;3280:272;3188:364;;;;:::o;3558:313::-;3671:4;3709:2;3698:9;3694:18;3686:26;;3758:9;3752:4;3748:20;3744:1;3733:9;3729:17;3722:47;3786:78;3859:4;3850:6;3786:78;:::i;:::-;3778:86;;3558:313;;;;:::o;3877:77::-;3914:7;3943:5;3932:16;;3877:77;;;:::o;3960:122::-;4033:24;4051:5;4033:24;:::i;:::-;4026:5;4023:35;4013:63;;4072:1;4069;4062:12;4013:63;3960:122;:::o;4088:139::-;4134:5;4172:6;4159:20;4150:29;;4188:33;4215:5;4188:33;:::i;:::-;4088:139;;;;:::o;4233:329::-;4292:6;4341:2;4329:9;4320:7;4316:23;4312:32;4309:119;;;4347:79;;:::i;:::-;4309:119;4467:1;4492:53;4537:7;4528:6;4517:9;4513:22;4492:53;:::i;:::-;4482:63;;4438:117;4233:329;;;;:::o;4568:126::-;4605:7;4645:42;4638:5;4634:54;4623:65;;4568:126;;;:::o;4700:96::-;4737:7;4766:24;4784:5;4766:24;:::i;:::-;4755:35;;4700:96;;;:::o;4802:118::-;4889:24;4907:5;4889:24;:::i;:::-;4884:3;4877:37;4802:118;;:::o;4926:222::-;5019:4;5057:2;5046:9;5042:18;5034:26;;5070:71;5138:1;5127:9;5123:17;5114:6;5070:71;:::i;:::-;4926:222;;;;:::o;5154:122::-;5227:24;5245:5;5227:24;:::i;:::-;5220:5;5217:35;5207:63;;5266:1;5263;5256:12;5207:63;5154:122;:::o;5282:139::-;5328:5;5366:6;5353:20;5344:29;;5382:33;5409:5;5382:33;:::i;:::-;5282:139;;;;:::o;5427:474::-;5495:6;5503;5552:2;5540:9;5531:7;5527:23;5523:32;5520:119;;;5558:79;;:::i;:::-;5520:119;5678:1;5703:53;5748:7;5739:6;5728:9;5724:22;5703:53;:::i;:::-;5693:63;;5649:117;5805:2;5831:53;5876:7;5867:6;5856:9;5852:22;5831:53;:::i;:::-;5821:63;;5776:118;5427:474;;;;;:::o;5907:118::-;5994:24;6012:5;5994:24;:::i;:::-;5989:3;5982:37;5907:118;;:::o;6031:222::-;6124:4;6162:2;6151:9;6147:18;6139:26;;6175:71;6243:1;6232:9;6228:17;6219:6;6175:71;:::i;:::-;6031:222;;;;:::o;6259:104::-;6304:7;6333:24;6351:5;6333:24;:::i;:::-;6322:35;;6259:104;;;:::o;6369:138::-;6450:32;6476:5;6450:32;:::i;:::-;6443:5;6440:43;6430:71;;6497:1;6494;6487:12;6430:71;6369:138;:::o;6513:155::-;6567:5;6605:6;6592:20;6583:29;;6621:41;6656:5;6621:41;:::i;:::-;6513:155;;;;:::o;6674:345::-;6741:6;6790:2;6778:9;6769:7;6765:23;6761:32;6758:119;;;6796:79;;:::i;:::-;6758:119;6916:1;6941:61;6994:7;6985:6;6974:9;6970:22;6941:61;:::i;:::-;6931:71;;6887:125;6674:345;;;;:::o;7025:619::-;7102:6;7110;7118;7167:2;7155:9;7146:7;7142:23;7138:32;7135:119;;;7173:79;;:::i;:::-;7135:119;7293:1;7318:53;7363:7;7354:6;7343:9;7339:22;7318:53;:::i;:::-;7308:63;;7264:117;7420:2;7446:53;7491:7;7482:6;7471:9;7467:22;7446:53;:::i;:::-;7436:63;;7391:118;7548:2;7574:53;7619:7;7610:6;7599:9;7595:22;7574:53;:::i;:::-;7564:63;;7519:118;7025:619;;;;;:::o;7650:116::-;7720:21;7735:5;7720:21;:::i;:::-;7713:5;7710:32;7700:60;;7756:1;7753;7746:12;7700:60;7650:116;:::o;7772:133::-;7815:5;7853:6;7840:20;7831:29;;7869:30;7893:5;7869:30;:::i;:::-;7772:133;;;;:::o;7911:323::-;7967:6;8016:2;8004:9;7995:7;7991:23;7987:32;7984:119;;;8022:79;;:::i;:::-;7984:119;8142:1;8167:50;8209:7;8200:6;8189:9;8185:22;8167:50;:::i;:::-;8157:60;;8113:114;7911:323;;;;:::o;8240:77::-;8277:7;8306:5;8295:16;;8240:77;;;:::o;8323:118::-;8410:24;8428:5;8410:24;:::i;:::-;8405:3;8398:37;8323:118;;:::o;8447:222::-;8540:4;8578:2;8567:9;8563:18;8555:26;;8591:71;8659:1;8648:9;8644:17;8635:6;8591:71;:::i;:::-;8447:222;;;;:::o;8675:111::-;8727:7;8756:24;8774:5;8756:24;:::i;:::-;8745:35;;8675:111;;;:::o;8792:152::-;8880:39;8913:5;8880:39;:::i;:::-;8873:5;8870:50;8860:78;;8934:1;8931;8924:12;8860:78;8792:152;:::o;8950:169::-;9011:5;9049:6;9036:20;9027:29;;9065:48;9107:5;9065:48;:::i;:::-;8950:169;;;;:::o;9125:504::-;9208:6;9216;9265:2;9253:9;9244:7;9240:23;9236:32;9233:119;;;9271:79;;:::i;:::-;9233:119;9391:1;9416:68;9476:7;9467:6;9456:9;9452:22;9416:68;:::i;:::-;9406:78;;9362:132;9533:2;9559:53;9604:7;9595:6;9584:9;9580:22;9559:53;:::i;:::-;9549:63;;9504:118;9125:504;;;;;:::o;9635:117::-;9744:1;9741;9734:12;9758:117;9867:1;9864;9857:12;9881:117;9990:1;9987;9980:12;10021:568;10094:8;10104:6;10154:3;10147:4;10139:6;10135:17;10131:27;10121:122;;10162:79;;:::i;:::-;10121:122;10275:6;10262:20;10252:30;;10305:18;10297:6;10294:30;10291:117;;;10327:79;;:::i;:::-;10291:117;10441:4;10433:6;10429:17;10417:29;;10495:3;10487:4;10479:6;10475:17;10465:8;10461:32;10458:41;10455:128;;;10502:79;;:::i;:::-;10455:128;10021:568;;;;;:::o;10595:849::-;10699:6;10707;10715;10723;10772:2;10760:9;10751:7;10747:23;10743:32;10740:119;;;10778:79;;:::i;:::-;10740:119;10898:1;10923:53;10968:7;10959:6;10948:9;10944:22;10923:53;:::i;:::-;10913:63;;10869:117;11025:2;11051:53;11096:7;11087:6;11076:9;11072:22;11051:53;:::i;:::-;11041:63;;10996:118;11181:2;11170:9;11166:18;11153:32;11212:18;11204:6;11201:30;11198:117;;;11234:79;;:::i;:::-;11198:117;11347:80;11419:7;11410:6;11399:9;11395:22;11347:80;:::i;:::-;11329:98;;;;11124:313;10595:849;;;;;;;:::o;11450:329::-;11509:6;11558:2;11546:9;11537:7;11533:23;11529:32;11526:119;;;11564:79;;:::i;:::-;11526:119;11684:1;11709:53;11754:7;11745:6;11734:9;11730:22;11709:53;:::i;:::-;11699:63;;11655:117;11450:329;;;;:::o;11785:122::-;11858:24;11876:5;11858:24;:::i;:::-;11851:5;11848:35;11838:63;;11897:1;11894;11887:12;11838:63;11785:122;:::o;11913:139::-;11959:5;11997:6;11984:20;11975:29;;12013:33;12040:5;12013:33;:::i;:::-;11913:139;;;;:::o;12058:329::-;12117:6;12166:2;12154:9;12145:7;12141:23;12137:32;12134:119;;;12172:79;;:::i;:::-;12134:119;12292:1;12317:53;12362:7;12353:6;12342:9;12338:22;12317:53;:::i;:::-;12307:63;;12263:117;12058:329;;;;:::o;12393:117::-;12502:1;12499;12492:12;12516:180;12564:77;12561:1;12554:88;12661:4;12658:1;12651:15;12685:4;12682:1;12675:15;12702:281;12785:27;12807:4;12785:27;:::i;:::-;12777:6;12773:40;12915:6;12903:10;12900:22;12879:18;12867:10;12864:34;12861:62;12858:88;;;12926:18;;:::i;:::-;12858:88;12966:10;12962:2;12955:22;12745:238;12702:281;;:::o;12989:129::-;13023:6;13050:20;;:::i;:::-;13040:30;;13079:33;13107:4;13099:6;13079:33;:::i;:::-;12989:129;;;:::o;13124:308::-;13186:4;13276:18;13268:6;13265:30;13262:56;;;13298:18;;:::i;:::-;13262:56;13336:29;13358:6;13336:29;:::i;:::-;13328:37;;13420:4;13414;13410:15;13402:23;;13124:308;;;:::o;13438:154::-;13522:6;13517:3;13512;13499:30;13584:1;13575:6;13570:3;13566:16;13559:27;13438:154;;;:::o;13598:412::-;13676:5;13701:66;13717:49;13759:6;13717:49;:::i;:::-;13701:66;:::i;:::-;13692:75;;13790:6;13783:5;13776:21;13828:4;13821:5;13817:16;13866:3;13857:6;13852:3;13848:16;13845:25;13842:112;;;13873:79;;:::i;:::-;13842:112;13963:41;13997:6;13992:3;13987;13963:41;:::i;:::-;13682:328;13598:412;;;;;:::o;14030:340::-;14086:5;14135:3;14128:4;14120:6;14116:17;14112:27;14102:122;;14143:79;;:::i;:::-;14102:122;14260:6;14247:20;14285:79;14360:3;14352:6;14345:4;14337:6;14333:17;14285:79;:::i;:::-;14276:88;;14092:278;14030:340;;;;:::o;14376:509::-;14445:6;14494:2;14482:9;14473:7;14469:23;14465:32;14462:119;;;14500:79;;:::i;:::-;14462:119;14648:1;14637:9;14633:17;14620:31;14678:18;14670:6;14667:30;14664:117;;;14700:79;;:::i;:::-;14664:117;14805:63;14860:7;14851:6;14840:9;14836:22;14805:63;:::i;:::-;14795:73;;14591:287;14376:509;;;;:::o;14891:468::-;14956:6;14964;15013:2;15001:9;14992:7;14988:23;14984:32;14981:119;;;15019:79;;:::i;:::-;14981:119;15139:1;15164:53;15209:7;15200:6;15189:9;15185:22;15164:53;:::i;:::-;15154:63;;15110:117;15266:2;15292:50;15334:7;15325:6;15314:9;15310:22;15292:50;:::i;:::-;15282:60;;15237:115;14891:468;;;;;:::o;15365:307::-;15426:4;15516:18;15508:6;15505:30;15502:56;;;15538:18;;:::i;:::-;15502:56;15576:29;15598:6;15576:29;:::i;:::-;15568:37;;15660:4;15654;15650:15;15642:23;;15365:307;;;:::o;15678:410::-;15755:5;15780:65;15796:48;15837:6;15796:48;:::i;:::-;15780:65;:::i;:::-;15771:74;;15868:6;15861:5;15854:21;15906:4;15899:5;15895:16;15944:3;15935:6;15930:3;15926:16;15923:25;15920:112;;;15951:79;;:::i;:::-;15920:112;16041:41;16075:6;16070:3;16065;16041:41;:::i;:::-;15761:327;15678:410;;;;;:::o;16107:338::-;16162:5;16211:3;16204:4;16196:6;16192:17;16188:27;16178:122;;16219:79;;:::i;:::-;16178:122;16336:6;16323:20;16361:78;16435:3;16427:6;16420:4;16412:6;16408:17;16361:78;:::i;:::-;16352:87;;16168:277;16107:338;;;;:::o;16451:943::-;16546:6;16554;16562;16570;16619:3;16607:9;16598:7;16594:23;16590:33;16587:120;;;16626:79;;:::i;:::-;16587:120;16746:1;16771:53;16816:7;16807:6;16796:9;16792:22;16771:53;:::i;:::-;16761:63;;16717:117;16873:2;16899:53;16944:7;16935:6;16924:9;16920:22;16899:53;:::i;:::-;16889:63;;16844:118;17001:2;17027:53;17072:7;17063:6;17052:9;17048:22;17027:53;:::i;:::-;17017:63;;16972:118;17157:2;17146:9;17142:18;17129:32;17188:18;17180:6;17177:30;17174:117;;;17210:79;;:::i;:::-;17174:117;17315:62;17369:7;17360:6;17349:9;17345:22;17315:62;:::i;:::-;17305:72;;17100:287;16451:943;;;;;;;:::o;17400:180::-;17448:77;17445:1;17438:88;17545:4;17542:1;17535:15;17569:4;17566:1;17559:15;17586:114;17668:1;17661:5;17658:12;17648:46;;17674:18;;:::i;:::-;17648:46;17586:114;:::o;17706:129::-;17752:7;17781:5;17770:16;;17787:42;17823:5;17787:42;:::i;:::-;17706:129;;;:::o;17841:::-;17898:9;17931:33;17958:5;17931:33;:::i;:::-;17918:46;;17841:129;;;:::o;17976:145::-;18070:44;18108:5;18070:44;:::i;:::-;18065:3;18058:57;17976:145;;:::o;18127:236::-;18227:4;18265:2;18254:9;18250:18;18242:26;;18278:78;18353:1;18342:9;18338:17;18329:6;18278:78;:::i;:::-;18127:236;;;;:::o;18369:359::-;18443:6;18492:2;18480:9;18471:7;18467:23;18463:32;18460:119;;;18498:79;;:::i;:::-;18460:119;18618:1;18643:68;18703:7;18694:6;18683:9;18679:22;18643:68;:::i;:::-;18633:78;;18589:132;18369:359;;;;:::o;18734:474::-;18802:6;18810;18859:2;18847:9;18838:7;18834:23;18830:32;18827:119;;;18865:79;;:::i;:::-;18827:119;18985:1;19010:53;19055:7;19046:6;19035:9;19031:22;19010:53;:::i;:::-;19000:63;;18956:117;19112:2;19138:53;19183:7;19174:6;19163:9;19159:22;19138:53;:::i;:::-;19128:63;;19083:118;18734:474;;;;;:::o;19214:180::-;19262:77;19259:1;19252:88;19359:4;19356:1;19349:15;19383:4;19380:1;19373:15;19400:320;19444:6;19481:1;19475:4;19471:12;19461:22;;19528:1;19522:4;19518:12;19549:18;19539:81;;19605:4;19597:6;19593:17;19583:27;;19539:81;19667:2;19659:6;19656:14;19636:18;19633:38;19630:84;;;19686:18;;:::i;:::-;19630:84;19451:269;19400:320;;;:::o;19726:225::-;19866:34;19862:1;19854:6;19850:14;19843:58;19935:8;19930:2;19922:6;19918:15;19911:33;19726:225;:::o;19957:366::-;20099:3;20120:67;20184:2;20179:3;20120:67;:::i;:::-;20113:74;;20196:93;20285:3;20196:93;:::i;:::-;20314:2;20309:3;20305:12;20298:19;;19957:366;;;:::o;20329:419::-;20495:4;20533:2;20522:9;20518:18;20510:26;;20582:9;20576:4;20572:20;20568:1;20557:9;20553:17;20546:47;20610:131;20736:4;20610:131;:::i;:::-;20602:139;;20329:419;;;:::o;20754:180::-;20802:77;20799:1;20792:88;20899:4;20896:1;20889:15;20923:4;20920:1;20913:15;20940:305;20980:3;20999:20;21017:1;20999:20;:::i;:::-;20994:25;;21033:20;21051:1;21033:20;:::i;:::-;21028:25;;21187:1;21119:66;21115:74;21112:1;21109:81;21106:107;;;21193:18;;:::i;:::-;21106:107;21237:1;21234;21230:9;21223:16;;20940:305;;;;:::o;21251:230::-;21391:34;21387:1;21379:6;21375:14;21368:58;21460:13;21455:2;21447:6;21443:15;21436:38;21251:230;:::o;21487:366::-;21629:3;21650:67;21714:2;21709:3;21650:67;:::i;:::-;21643:74;;21726:93;21815:3;21726:93;:::i;:::-;21844:2;21839:3;21835:12;21828:19;;21487:366;;;:::o;21859:419::-;22025:4;22063:2;22052:9;22048:18;22040:26;;22112:9;22106:4;22102:20;22098:1;22087:9;22083:17;22076:47;22140:131;22266:4;22140:131;:::i;:::-;22132:139;;21859:419;;;:::o;22284:60::-;22312:3;22333:5;22326:12;;22284:60;;;:::o;22350:142::-;22400:9;22433:53;22451:34;22460:24;22478:5;22460:24;:::i;:::-;22451:34;:::i;:::-;22433:53;:::i;:::-;22420:66;;22350:142;;;:::o;22498:126::-;22548:9;22581:37;22612:5;22581:37;:::i;:::-;22568:50;;22498:126;;;:::o;22630:134::-;22688:9;22721:37;22752:5;22721:37;:::i;:::-;22708:50;;22630:134;;;:::o;22770:147::-;22865:45;22904:5;22865:45;:::i;:::-;22860:3;22853:58;22770:147;;:::o;22923:348::-;23052:4;23090:2;23079:9;23075:18;23067:26;;23103:79;23179:1;23168:9;23164:17;23155:6;23103:79;:::i;:::-;23192:72;23260:2;23249:9;23245:18;23236:6;23192:72;:::i;:::-;22923:348;;;;;:::o;23277:182::-;23417:34;23413:1;23405:6;23401:14;23394:58;23277:182;:::o;23465:366::-;23607:3;23628:67;23692:2;23687:3;23628:67;:::i;:::-;23621:74;;23704:93;23793:3;23704:93;:::i;:::-;23822:2;23817:3;23813:12;23806:19;;23465:366;;;:::o;23837:419::-;24003:4;24041:2;24030:9;24026:18;24018:26;;24090:9;24084:4;24080:20;24076:1;24065:9;24061:17;24054:47;24118:131;24244:4;24118:131;:::i;:::-;24110:139;;23837:419;;;:::o;24262:143::-;24319:5;24350:6;24344:13;24335:22;;24366:33;24393:5;24366:33;:::i;:::-;24262:143;;;;:::o;24411:351::-;24481:6;24530:2;24518:9;24509:7;24505:23;24501:32;24498:119;;;24536:79;;:::i;:::-;24498:119;24656:1;24681:64;24737:7;24728:6;24717:9;24713:22;24681:64;:::i;:::-;24671:74;;24627:128;24411:351;;;;:::o;24768:332::-;24889:4;24927:2;24916:9;24912:18;24904:26;;24940:71;25008:1;24997:9;24993:17;24984:6;24940:71;:::i;:::-;25021:72;25089:2;25078:9;25074:18;25065:6;25021:72;:::i;:::-;24768:332;;;;;:::o;25106:181::-;25246:33;25242:1;25234:6;25230:14;25223:57;25106:181;:::o;25293:366::-;25435:3;25456:67;25520:2;25515:3;25456:67;:::i;:::-;25449:74;;25532:93;25621:3;25532:93;:::i;:::-;25650:2;25645:3;25641:12;25634:19;;25293:366;;;:::o;25665:419::-;25831:4;25869:2;25858:9;25854:18;25846:26;;25918:9;25912:4;25908:20;25904:1;25893:9;25889:17;25882:47;25946:131;26072:4;25946:131;:::i;:::-;25938:139;;25665:419;;;:::o;26090:160::-;26230:12;26226:1;26218:6;26214:14;26207:36;26090:160;:::o;26256:366::-;26398:3;26419:67;26483:2;26478:3;26419:67;:::i;:::-;26412:74;;26495:93;26584:3;26495:93;:::i;:::-;26613:2;26608:3;26604:12;26597:19;;26256:366;;;:::o;26628:419::-;26794:4;26832:2;26821:9;26817:18;26809:26;;26881:9;26875:4;26871:20;26867:1;26856:9;26852:17;26845:47;26909:131;27035:4;26909:131;:::i;:::-;26901:139;;26628:419;;;:::o;27053:221::-;27193:34;27189:1;27181:6;27177:14;27170:58;27262:4;27257:2;27249:6;27245:15;27238:29;27053:221;:::o;27280:366::-;27422:3;27443:67;27507:2;27502:3;27443:67;:::i;:::-;27436:74;;27519:93;27608:3;27519:93;:::i;:::-;27637:2;27632:3;27628:12;27621:19;;27280:366;;;:::o;27652:419::-;27818:4;27856:2;27845:9;27841:18;27833:26;;27905:9;27899:4;27895:20;27891:1;27880:9;27876:17;27869:47;27933:131;28059:4;27933:131;:::i;:::-;27925:139;;27652:419;;;:::o;28077:181::-;28217:33;28213:1;28205:6;28201:14;28194:57;28077:181;:::o;28264:366::-;28406:3;28427:67;28491:2;28486:3;28427:67;:::i;:::-;28420:74;;28503:93;28592:3;28503:93;:::i;:::-;28621:2;28616:3;28612:12;28605:19;;28264:366;;;:::o;28636:419::-;28802:4;28840:2;28829:9;28825:18;28817:26;;28889:9;28883:4;28879:20;28875:1;28864:9;28860:17;28853:47;28917:131;29043:4;28917:131;:::i;:::-;28909:139;;28636:419;;;:::o;29061:165::-;29201:17;29197:1;29189:6;29185:14;29178:41;29061:165;:::o;29232:366::-;29374:3;29395:67;29459:2;29454:3;29395:67;:::i;:::-;29388:74;;29471:93;29560:3;29471:93;:::i;:::-;29589:2;29584:3;29580:12;29573:19;;29232:366;;;:::o;29604:419::-;29770:4;29808:2;29797:9;29793:18;29785:26;;29857:9;29851:4;29847:20;29843:1;29832:9;29828:17;29821:47;29885:131;30011:4;29885:131;:::i;:::-;29877:139;;29604:419;;;:::o;30029:233::-;30169:34;30165:1;30157:6;30153:14;30146:58;30238:16;30233:2;30225:6;30221:15;30214:41;30029:233;:::o;30268:366::-;30410:3;30431:67;30495:2;30490:3;30431:67;:::i;:::-;30424:74;;30507:93;30596:3;30507:93;:::i;:::-;30625:2;30620:3;30616:12;30609:19;;30268:366;;;:::o;30640:419::-;30806:4;30844:2;30833:9;30829:18;30821:26;;30893:9;30887:4;30883:20;30879:1;30868:9;30864:17;30857:47;30921:131;31047:4;30921:131;:::i;:::-;30913:139;;30640:419;;;:::o;31065:169::-;31205:21;31201:1;31193:6;31189:14;31182:45;31065:169;:::o;31240:366::-;31382:3;31403:67;31467:2;31462:3;31403:67;:::i;:::-;31396:74;;31479:93;31568:3;31479:93;:::i;:::-;31597:2;31592:3;31588:12;31581:19;;31240:366;;;:::o;31612:419::-;31778:4;31816:2;31805:9;31801:18;31793:26;;31865:9;31859:4;31855:20;31851:1;31840:9;31836:17;31829:47;31893:131;32019:4;31893:131;:::i;:::-;31885:139;;31612:419;;;:::o;32037:348::-;32077:7;32100:20;32118:1;32100:20;:::i;:::-;32095:25;;32134:20;32152:1;32134:20;:::i;:::-;32129:25;;32322:1;32254:66;32250:74;32247:1;32244:81;32239:1;32232:9;32225:17;32221:105;32218:131;;;32329:18;;:::i;:::-;32218:131;32377:1;32374;32370:9;32359:20;;32037:348;;;;:::o;32391:167::-;32531:19;32527:1;32519:6;32515:14;32508:43;32391:167;:::o;32564:366::-;32706:3;32727:67;32791:2;32786:3;32727:67;:::i;:::-;32720:74;;32803:93;32892:3;32803:93;:::i;:::-;32921:2;32916:3;32912:12;32905:19;;32564:366;;;:::o;32936:419::-;33102:4;33140:2;33129:9;33125:18;33117:26;;33189:9;33183:4;33179:20;33175:1;33164:9;33160:17;33153:47;33217:131;33343:4;33217:131;:::i;:::-;33209:139;;32936:419;;;:::o;33361:233::-;33400:3;33423:24;33441:5;33423:24;:::i;:::-;33414:33;;33469:66;33462:5;33459:77;33456:103;;;33539:18;;:::i;:::-;33456:103;33586:1;33579:5;33575:13;33568:20;;33361:233;;;:::o;33600:180::-;33648:77;33645:1;33638:88;33745:4;33742:1;33735:15;33769:4;33766:1;33759:15;33786:178;33926:30;33922:1;33914:6;33910:14;33903:54;33786:178;:::o;33970:366::-;34112:3;34133:67;34197:2;34192:3;34133:67;:::i;:::-;34126:74;;34209:93;34298:3;34209:93;:::i;:::-;34327:2;34322:3;34318:12;34311:19;;33970:366;;;:::o;34342:419::-;34508:4;34546:2;34535:9;34531:18;34523:26;;34595:9;34589:4;34585:20;34581:1;34570:9;34566:17;34559:47;34623:131;34749:4;34623:131;:::i;:::-;34615:139;;34342:419;;;:::o;34767:181::-;34907:33;34903:1;34895:6;34891:14;34884:57;34767:181;:::o;34954:366::-;35096:3;35117:67;35181:2;35176:3;35117:67;:::i;:::-;35110:74;;35193:93;35282:3;35193:93;:::i;:::-;35311:2;35306:3;35302:12;35295:19;;34954:366;;;:::o;35326:419::-;35492:4;35530:2;35519:9;35515:18;35507:26;;35579:9;35573:4;35569:20;35565:1;35554:9;35550:17;35543:47;35607:131;35733:4;35607:131;:::i;:::-;35599:139;;35326:419;;;:::o;35751:148::-;35853:11;35890:3;35875:18;;35751:148;;;;:::o;35905:141::-;35954:4;35977:3;35969:11;;36000:3;35997:1;35990:14;36034:4;36031:1;36021:18;36013:26;;35905:141;;;:::o;36076:845::-;36179:3;36216:5;36210:12;36245:36;36271:9;36245:36;:::i;:::-;36297:89;36379:6;36374:3;36297:89;:::i;:::-;36290:96;;36417:1;36406:9;36402:17;36433:1;36428:137;;;;36579:1;36574:341;;;;36395:520;;36428:137;36512:4;36508:9;36497;36493:25;36488:3;36481:38;36548:6;36543:3;36539:16;36532:23;;36428:137;;36574:341;36641:38;36673:5;36641:38;:::i;:::-;36701:1;36715:154;36729:6;36726:1;36723:13;36715:154;;;36803:7;36797:14;36793:1;36788:3;36784:11;36777:35;36853:1;36844:7;36840:15;36829:26;;36751:4;36748:1;36744:12;36739:17;;36715:154;;;36898:6;36893:3;36889:16;36882:23;;36581:334;;36395:520;;36183:738;;36076:845;;;;:::o;36927:161::-;37067:13;37063:1;37055:6;37051:14;37044:37;36927:161;:::o;37094:402::-;37254:3;37275:85;37357:2;37352:3;37275:85;:::i;:::-;37268:92;;37369:93;37458:3;37369:93;:::i;:::-;37487:2;37482:3;37478:12;37471:19;;37094:402;;;:::o;37502:535::-;37732:3;37754:92;37842:3;37833:6;37754:92;:::i;:::-;37747:99;;37863:148;38007:3;37863:148;:::i;:::-;37856:155;;38028:3;38021:10;;37502:535;;;;:::o;38043:377::-;38149:3;38177:39;38210:5;38177:39;:::i;:::-;38232:89;38314:6;38309:3;38232:89;:::i;:::-;38225:96;;38330:52;38375:6;38370:3;38363:4;38356:5;38352:16;38330:52;:::i;:::-;38407:6;38402:3;38398:16;38391:23;;38153:267;38043:377;;;;:::o;38426:155::-;38566:7;38562:1;38554:6;38550:14;38543:31;38426:155;:::o;38587:400::-;38747:3;38768:84;38850:1;38845:3;38768:84;:::i;:::-;38761:91;;38861:93;38950:3;38861:93;:::i;:::-;38979:1;38974:3;38970:11;38963:18;;38587:400;;;:::o;38993:695::-;39271:3;39293:92;39381:3;39372:6;39293:92;:::i;:::-;39286:99;;39402:95;39493:3;39484:6;39402:95;:::i;:::-;39395:102;;39514:148;39658:3;39514:148;:::i;:::-;39507:155;;39679:3;39672:10;;38993:695;;;;;:::o;39694:168::-;39834:20;39830:1;39822:6;39818:14;39811:44;39694:168;:::o;39868:366::-;40010:3;40031:67;40095:2;40090:3;40031:67;:::i;:::-;40024:74;;40107:93;40196:3;40107:93;:::i;:::-;40225:2;40220:3;40216:12;40209:19;;39868:366;;;:::o;40240:419::-;40406:4;40444:2;40433:9;40429:18;40421:26;;40493:9;40487:4;40483:20;40479:1;40468:9;40464:17;40457:47;40521:131;40647:4;40521:131;:::i;:::-;40513:139;;40240:419;;;:::o;40665:225::-;40805:34;40801:1;40793:6;40789:14;40782:58;40874:8;40869:2;40861:6;40857:15;40850:33;40665:225;:::o;40896:366::-;41038:3;41059:67;41123:2;41118:3;41059:67;:::i;:::-;41052:74;;41135:93;41224:3;41135:93;:::i;:::-;41253:2;41248:3;41244:12;41237:19;;40896:366;;;:::o;41268:419::-;41434:4;41472:2;41461:9;41457:18;41449:26;;41521:9;41515:4;41511:20;41507:1;41496:9;41492:17;41485:47;41549:131;41675:4;41549:131;:::i;:::-;41541:139;;41268:419;;;:::o;41693:180::-;41741:77;41738:1;41731:88;41838:4;41835:1;41828:15;41862:4;41859:1;41852:15;41879:185;41919:1;41936:20;41954:1;41936:20;:::i;:::-;41931:25;;41970:20;41988:1;41970:20;:::i;:::-;41965:25;;42009:1;41999:35;;42014:18;;:::i;:::-;41999:35;42056:1;42053;42049:9;42044:14;;41879:185;;;;:::o;42070:191::-;42110:4;42130:20;42148:1;42130:20;:::i;:::-;42125:25;;42164:20;42182:1;42164:20;:::i;:::-;42159:25;;42203:1;42200;42197:8;42194:34;;;42208:18;;:::i;:::-;42194:34;42253:1;42250;42246:9;42238:17;;42070:191;;;;:::o;42267:179::-;42407:31;42403:1;42395:6;42391:14;42384:55;42267:179;:::o;42452:366::-;42594:3;42615:67;42679:2;42674:3;42615:67;:::i;:::-;42608:74;;42691:93;42780:3;42691:93;:::i;:::-;42809:2;42804:3;42800:12;42793:19;;42452:366;;;:::o;42824:419::-;42990:4;43028:2;43017:9;43013:18;43005:26;;43077:9;43071:4;43067:20;43063:1;43052:9;43048:17;43041:47;43105:131;43231:4;43105:131;:::i;:::-;43097:139;;42824:419;;;:::o;43249:147::-;43350:11;43387:3;43372:18;;43249:147;;;;:::o;43402:114::-;;:::o;43522:398::-;43681:3;43702:83;43783:1;43778:3;43702:83;:::i;:::-;43695:90;;43794:93;43883:3;43794:93;:::i;:::-;43912:1;43907:3;43903:11;43896:18;;43522:398;;;:::o;43926:379::-;44110:3;44132:147;44275:3;44132:147;:::i;:::-;44125:154;;44296:3;44289:10;;43926:379;;;:::o;44311:245::-;44451:34;44447:1;44439:6;44435:14;44428:58;44520:28;44515:2;44507:6;44503:15;44496:53;44311:245;:::o;44562:366::-;44704:3;44725:67;44789:2;44784:3;44725:67;:::i;:::-;44718:74;;44801:93;44890:3;44801:93;:::i;:::-;44919:2;44914:3;44910:12;44903:19;;44562:366;;;:::o;44934:419::-;45100:4;45138:2;45127:9;45123:18;45115:26;;45187:9;45181:4;45177:20;45173:1;45162:9;45158:17;45151:47;45215:131;45341:4;45215:131;:::i;:::-;45207:139;;44934:419;;;:::o;45359:98::-;45410:6;45444:5;45438:12;45428:22;;45359:98;;;:::o;45463:168::-;45546:11;45580:6;45575:3;45568:19;45620:4;45615:3;45611:14;45596:29;;45463:168;;;;:::o;45637:360::-;45723:3;45751:38;45783:5;45751:38;:::i;:::-;45805:70;45868:6;45863:3;45805:70;:::i;:::-;45798:77;;45884:52;45929:6;45924:3;45917:4;45910:5;45906:16;45884:52;:::i;:::-;45961:29;45983:6;45961:29;:::i;:::-;45956:3;45952:39;45945:46;;45727:270;45637:360;;;;:::o;46003:640::-;46198:4;46236:3;46225:9;46221:19;46213:27;;46250:71;46318:1;46307:9;46303:17;46294:6;46250:71;:::i;:::-;46331:72;46399:2;46388:9;46384:18;46375:6;46331:72;:::i;:::-;46413;46481:2;46470:9;46466:18;46457:6;46413:72;:::i;:::-;46532:9;46526:4;46522:20;46517:2;46506:9;46502:18;46495:48;46560:76;46631:4;46622:6;46560:76;:::i;:::-;46552:84;;46003:640;;;;;;;:::o;46649:141::-;46705:5;46736:6;46730:13;46721:22;;46752:32;46778:5;46752:32;:::i;:::-;46649:141;;;;:::o;46796:349::-;46865:6;46914:2;46902:9;46893:7;46889:23;46885:32;46882:119;;;46920:79;;:::i;:::-;46882:119;47040:1;47065:63;47120:7;47111:6;47100:9;47096:22;47065:63;:::i;:::-;47055:73;;47011:127;46796:349;;;;:::o;47151:176::-;47183:1;47200:20;47218:1;47200:20;:::i;:::-;47195:25;;47234:20;47252:1;47234:20;:::i;:::-;47229:25;;47273:1;47263:35;;47278:18;;:::i;:::-;47263:35;47319:1;47316;47312:9;47307:14;;47151:176;;;;:::o;47333:137::-;47387:5;47418:6;47412:13;47403:22;;47434:30;47458:5;47434:30;:::i;:::-;47333:137;;;;:::o;47476:345::-;47543:6;47592:2;47580:9;47571:7;47567:23;47563:32;47560:119;;;47598:79;;:::i;:::-;47560:119;47718:1;47743:61;47796:7;47787:6;47776:9;47772:22;47743:61;:::i;:::-;47733:71;;47689:125;47476:345;;;;:::o;47827:229::-;47967:34;47963:1;47955:6;47951:14;47944:58;48036:12;48031:2;48023:6;48019:15;48012:37;47827:229;:::o;48062:366::-;48204:3;48225:67;48289:2;48284:3;48225:67;:::i;:::-;48218:74;;48301:93;48390:3;48301:93;:::i;:::-;48419:2;48414:3;48410:12;48403:19;;48062:366;;;:::o;48434:419::-;48600:4;48638:2;48627:9;48623:18;48615:26;;48687:9;48681:4;48677:20;48673:1;48662:9;48658:17;48651:47;48715:131;48841:4;48715:131;:::i;:::-;48707:139;;48434:419;;;:::o;48859:94::-;48892:8;48940:5;48936:2;48932:14;48911:35;;48859:94;;;:::o;48959:::-;48998:7;49027:20;49041:5;49027:20;:::i;:::-;49016:31;;48959:94;;;:::o;49059:100::-;49098:7;49127:26;49147:5;49127:26;:::i;:::-;49116:37;;49059:100;;;:::o;49165:157::-;49270:45;49290:24;49308:5;49290:24;:::i;:::-;49270:45;:::i;:::-;49265:3;49258:58;49165:157;;:::o;49328:256::-;49440:3;49455:75;49526:3;49517:6;49455:75;:::i;:::-;49555:2;49550:3;49546:12;49539:19;;49575:3;49568:10;;49328:256;;;;:::o;49590:225::-;49730:34;49726:1;49718:6;49714:14;49707:58;49799:8;49794:2;49786:6;49782:15;49775:33;49590:225;:::o;49821:366::-;49963:3;49984:67;50048:2;50043:3;49984:67;:::i;:::-;49977:74;;50060:93;50149:3;50060:93;:::i;:::-;50178:2;50173:3;50169:12;50162:19;;49821:366;;;:::o;50193:419::-;50359:4;50397:2;50386:9;50382:18;50374:26;;50446:9;50440:4;50436:20;50432:1;50421:9;50417:17;50410:47;50474:131;50600:4;50474:131;:::i;:::-;50466:139;;50193:419;;;:::o;50618:179::-;50758:31;50754:1;50746:6;50742:14;50735:55;50618:179;:::o;50803:366::-;50945:3;50966:67;51030:2;51025:3;50966:67;:::i;:::-;50959:74;;51042:93;51131:3;51042:93;:::i;:::-;51160:2;51155:3;51151:12;51144:19;;50803:366;;;:::o;51175:419::-;51341:4;51379:2;51368:9;51364:18;51356:26;;51428:9;51422:4;51418:20;51414:1;51403:9;51399:17;51392:47;51456:131;51582:4;51456:131;:::i;:::-;51448:139;;51175:419;;;:::o;51600:373::-;51704:3;51732:38;51764:5;51732:38;:::i;:::-;51786:88;51867:6;51862:3;51786:88;:::i;:::-;51779:95;;51883:52;51928:6;51923:3;51916:4;51909:5;51905:16;51883:52;:::i;:::-;51960:6;51955:3;51951:16;51944:23;;51708:265;51600:373;;;;:::o;51979:271::-;52109:3;52131:93;52220:3;52211:6;52131:93;:::i;:::-;52124:100;;52241:3;52234:10;;51979:271;;;;:::o

Swarm Source

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