ETH Price: $3,457.85 (+0.10%)
Gas: 4 Gwei

Token

cMyZombiez (ZOMBIE)
 

Overview

Max Total Supply

155 ZOMBIE

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sacro.eth
Balance
2 ZOMBIE
0xbf05cca381a8ad0177fb967341d040c6fa980335
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
ZombieCats

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-15
*/

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);
}

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

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

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

// 
/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

// 
/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// 
/**
 * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        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);
}

// 
interface IMiece is IERC20 {
    function burnFrom(address account, uint256 amount) external;
    function getTokensStaked(address staker) external returns (uint256[] memory);
}

// 
library ZombieCatsLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    struct Trait {
        string traitName;
        string traitType;
        string pixels;
        uint256 pixelCount;
    }

    /// @dev Convert an id to its tier
    function _tier(uint16 id) external pure returns (uint16) {
        if (id == 0) return 0;
        return ((id - 1) / 4 );
    }

    /**
     * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier.
     * @param _randinput The input from 0 - 10000 to use for rarity gen.
     * @param _rarityTier The tier to use.
     */
    function rarityGen(uint256 _randinput, uint8 _rarityTier, uint16[][8] storage TIERS)
        external
        view
        returns (string memory)
    {
        uint16 currentLowerBound = 0;
        for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) {
            uint16 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return toString(i);
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        revert();
    }



    /**
     * @dev Helper function to reduce pixel size within contract
     */
    function letterToNumber(string memory _inputLetter, string[] memory LETTERS)
        public
        pure
        returns (uint8)
    {
        for (uint8 i = 0; i < LETTERS.length; i++) {
            if (
                keccak256(abi.encodePacked((LETTERS[i]))) ==
                keccak256(abi.encodePacked((_inputLetter)))
            ) return (i + 1);
        }
        revert();
    }

   /**
     * @dev Hash to metadata function
     */
    function hashToMetadata(string memory _hash, mapping(uint256 => Trait[]) storage traitTypes,
        uint8 health, 
        uint8 accuracy, 
        uint8 defense, 
        uint16 level, 
        uint16 meowModifier
    )
        public
        view
        returns (string memory)
    {
        string memory metadataString;

        for (uint8 i = 0; i < 9; i++) { //9
            uint8 thisTraitIndex = parseInt(
                substring(_hash, i, i + 1)
            );

            metadataString = string(
                abi.encodePacked(
                    metadataString,
                    '{"trait_type":"',
                    traitTypes[i][thisTraitIndex].traitType,
                    '","value":"',
                    traitTypes[i][thisTraitIndex].traitName,
                    '"},'
                )
            );

            // if (i != 8)
            //     metadataString = string(abi.encodePacked(metadataString, ","));
        }
        metadataString = string(
            abi.encodePacked(
                metadataString,
                '{"display_type":"number","trait_type":"Health","value":',toString(health),'},',
                '{"display_type":"number","trait_type":"Accuracy","value":',toString(accuracy),'},',
                '{"display_type":"number","trait_type":"Defense","value":',toString(defense),'},',
                '{"trait_type": "level", "value":',toString(level),'},',
                '{"display_type": "boost_number", "trait_type": "Stats total", "value":',toString(meowModifier),'}'
            )
        );

        return string(abi.encodePacked("[", metadataString, "]"));
    }


    /**
     * @dev Returns the SVG and metadata for a token Id
     * @param _tokenId The tokenId to return the SVG and metadata for.
     */
    function tokenURIData(uint256 _tokenId, string memory tokenHash, mapping(uint256 => Trait[]) storage traitTypes, string[] memory LETTERS,
            uint8 health, 
            uint8 accuracy, 
            uint8 defense, 
            uint16 level, 
            uint16 meowModifier
    )
        external
        view        
        returns (string memory)
    {

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "cmyZombieKatz #',
                                    toString(_tokenId),
                                    '", "description": "cmyZombieKatz is a collection of 5,444 unique zombies. All the metadata and images stored 100% on-chain.", "image": "data:image/svg+xml;base64,',
                                    encode(
                                        bytes(hashToSVG(tokenHash,traitTypes,LETTERS))
                                    ),
                                    '","attributes":',
                                    hashToMetadata(tokenHash,traitTypes,
                                        health, 
                                        accuracy, 
                                        defense, 
                                        level, 
                                        meowModifier
                                    ),
                                    "}"
                                )
                            )
                        )
                    )
                )
            );
    }

  /**
     * @dev Hash to SVG function
     */
    function hashToSVG(string memory _hash, mapping(uint256 => Trait[]) storage traitTypes, string[] memory LETTERS)
        public
        view
        returns (string memory)
    {
        string memory svgString;
        bool[24][24] memory placedPixels;

        for (uint8 i = 0; i < 9; i++) { 
            uint8 thisTraitIndex = parseInt(
                substring(_hash, i, i + 1)
            );

            for (
                uint16 j = 0;
                j < traitTypes[i][thisTraitIndex].pixelCount; // <
                j++
            ) {
                string memory thisPixel = substring(
                    traitTypes[i][thisTraitIndex].pixels,
                    j * 4,
                    j * 4 + 4
                );

                uint8 x = letterToNumber(
                    substring(thisPixel, 0, 1), LETTERS
                );
                uint8 y = letterToNumber(
                    substring(thisPixel, 1, 2), LETTERS
                );

                if (placedPixels[x][y]) continue;

                svgString = string(
                    abi.encodePacked(
                        svgString,
                        "<rect class='c",
                        substring(thisPixel, 2, 4),
                        "' x='",
                        toString(x),
                        "' y='",
                        toString(y),
                        "'/>"
                    )
                );

                placedPixels[x][y] = true;
            }
        }

        svgString = string(
            abi.encodePacked(
                '<svg id="z" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 24 24"> ',
                svgString,
                "<style>rect{width:1px;height:1px;}#z{shape-rendering: crispedges;}.c00{fill:#6f8342}.c01{fill:#778d45}.c02{fill:#f6767b}.c03{fill:#859e4a}.c04{fill:#c13b12}.c05{fill:#cb696c}.c06{fill:#534d0e}.c07{fill:#474939}.c08{fill:#5c614a}.c09{fill:#989752}.c10{fill:#72775c}.c11{fill:#ff0043}.c12{fill:#c74249}.c13{fill:#aa343a}.c14{fill:#dd4313}.c15{fill:#a09300}.c16{fill:#00791a}.c17{fill:#009a1a}.c18{fill:#00ee00}.c19{fill:#00b300}.c20{fill:#9e1174}.c21{fill:#a0d900}.c22{fill:#303030}.c23{fill:#1a1a1a}.c24{fill:#262626}.c25{fill:#3b0346}.c26{fill:#363737}.c27{fill:#2c2c2c}.c28{fill:#1c1c1c}.c29{fill:#6a9cc5}.c30{fill:#9fd2fc}.c31{fill:#ffffff}.c32{fill:#b05514}.c33{fill:#000000}.c34{fill:#0f0f0f}.c35{fill:#e3e3e3}.c36{fill:#f7f7f7}.c37{fill:#ededed}.c38{fill:#008391}.c39{fill:#733e39}.c40{fill:#c5c5db}.c41{fill:#a75b5e}.c42{fill:#877c00}.c43{fill:#938700}.c44{fill:#f1f1f1}.c45{fill:#007480}.c46{fill:#007b87}.c47{fill:#6b6b6b}.c48{fill:#80155e}.c49{fill:#92186d}</style></svg>"
            )
        );

        return svgString;
    }    


    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// 
/*

     ___  ___       ______                _     _      _   __      _       
     |  \/  |      |___  /               | |   (_)    | | / /     | |      
  ___| .  . |_   _    / /  ___  _ __ ___ | |__  _  ___| |/ /  __ _| |_ ____
 / __| |\/| | | | |  / /  / _ \| '_ ` _ \| '_ \| |/ _ \    \ / _` | __|_  /
| (__| |  | | |_| |./ /__| (_) | | | | | | |_) | |  __/ |\  \ (_| | |_ / / 
 \___\_|  |_/\__, |\_____/\___/|_| |_| |_|_.__/|_|\___\_| \_/\__,_|\__/___|
              __/ |                                                        
             |___/                                                         

*/
contract ZombieCats is ERC721Enumerable {

    using ZombieCatsLibrary for uint8;

    struct Trait {
        string traitName;
        string traitType;
        string pixels;
        uint256 pixelCount;
    }
   
    mapping(uint256 => ZombieCatsLibrary.Trait[]) public traitTypes;
    mapping(string => bool) hashToMinted;
    mapping(uint256 => string) internal tokenIdToHash;

    struct LootPool { 
        uint8  minLevel; uint8  minLootTier; uint16  cost;   uint16 total;
        uint16 tier_1;   uint16 tier_2;      uint16 tier_3; uint16 tier_4;
    }

    uint256 public constant  cooldown = 10 minutes;  
    mapping (uint256 => ZombieKat)      public zombiekatz;
    mapping (uint256 => Action)   public activities;
    mapping (Places  => LootPool) public lootPools;

    //Mapping of staker to zombies
    mapping(address => uint256[]) internal stakerToTokenIds;

    event ActionMade(address owner, uint256 id, uint256 timestamp, uint8 activity);
    

    uint256 MAX_SUPPLY = 5444; 

    uint256 SEED_NONCE = 0;
    
    string[] LETTERS = [
        "a",
        "b",
        "c",
        "d",
        "e",
        "f",
        "g",
        "h",
        "i",
        "j",
        "k",
        "l",
        "m",
        "n",
        "o",
        "p",
        "q",
        "r",
        "s",
        "t",
        "u",
        "v",
        "w",
        "x",
        "y",
        "z"
    ];

    uint16[][8] MUTATED_TIERS;

    address mieceAddress;
    address graveyardAddress;
    address _owner;

    constructor() ERC721("cMyZombiez", "ZOMBIE") {
        _owner = msg.sender;

        MUTATED_TIERS[0] = [100, 400, 500, 700, 900, 1100, 1300, 1600, 1600, 1800]; // 10
        MUTATED_TIERS[1] = [100, 300, 800, 1000, 1500, 2800, 3500]; // 7
        MUTATED_TIERS[2] = [50, 150, 200, 300, 1250, 1750, 2800, 3500]; // 8
        MUTATED_TIERS[3] = [50, 200, 250, 1500, 2000, 2500, 3500]; // 7
        MUTATED_TIERS[4] = [50, 100, 400, 450, 500, 700, 1800, 2000, 2000, 2000];        
        MUTATED_TIERS[5] = [750, 750, 750, 1000, 1000, 1000, 1250, 1500, 2000]; // 9
        MUTATED_TIERS[6] = [1428, 1428, 1428, 1429, 1429, 1429, 1429]; // 7
        MUTATED_TIERS[7] = [20, 70, 721, 1000, 1155, 1200, 1300, 1434, 1541, 1559]; // 10

    }

    modifier ownerOfZombieKat(uint256 id) { 
        require(ownerOf(id) == msg.sender || activities[id].owner == msg.sender /*, "not your zombiekat"*/); // FIXME: Check if ownerOf(id) works properly
        _;
    }

    bytes32 internal entropySauce;

    modifier noCheaters() {
        require(!ZombieCatsLibrary.isContract(msg.sender),"nocontract");
        // We'll use the last caller hash to add entropy to next caller
        entropySauce = keccak256(abi.encodePacked(msg.sender, block.coinbase));
        _;
    }

    /*///////////////////////////////////////////////////////////////
                QUESTING AND LOOT POOLS
    //////////////////////////////////////////////////////////////*/

    uint256 public constant  startingTime = 1635721200; 

    struct ZombieKat { uint8 health; uint8 accuracy; uint8 defense; uint16 level; uint16 meowModifier; uint32 lvlProgress; }

    enum   Actions { UNSTAKED, TRAINING } 
    struct Action  { address owner; uint88 timestamp; Actions action; }

    // These are all the places you can go search for loot
    enum Places { 
        TRAINING_IN_HELL, CEMETERY_ROAD_TRIP, INK_FACTORY_ROBBERY, TIME_TRAVEL, SECRETS_OF_PYRAMIDS, MAGIC_TRIP, 
        TREASURE_ISLAND, GOTHAM, FIND_ELON_ON_MARS, KATZ_GODS 
    }   

    function initialize() public onlyOwner {


        // Training in Hell
        // Time Travel: Back to the 80s
        // Gotham
        // Secrets of the Pyramids (edited)
        // Cemetery Road Trip
        // Ink Factory Robbery
        // Treasure Island
        // Magic Trip
        // Find Elon on Mars
        // Katz Gods

        // Here's whats available in each place
        LootPool memory q1 = LootPool({ minLevel: 1,  minLootTier:  3, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q2 = LootPool({ minLevel: 15, minLootTier: 18, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q3 = LootPool({ minLevel: 30, minLootTier: 48, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q4 = LootPool({ minLevel: 45, minLootTier: 73, cost:   0, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q5 = LootPool({ minLevel:  8, minLootTier: 13, cost:  25, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q6 = LootPool({ minLevel: 15, minLootTier: 28, cost:  50, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q7 = LootPool({ minLevel: 20, minLootTier: 43, cost:  75, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q8 = LootPool({ minLevel: 30, minLootTier: 63, cost: 100, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory q9 = LootPool({ minLevel: 45, minLootTier: 88, cost: 150, total: 1000, tier_1: 800,  tier_2: 150,  tier_3: 50,  tier_4:   0 });
        LootPool memory zombiekatGods  = LootPool({ minLevel: 52, minLootTier: 100, cost: 300, total:   10, tier_1:    0, tier_2:    0, tier_3:   0, tier_4:   0 });

        lootPools[Places.TRAINING_IN_HELL]          = q1;
        lootPools[Places.TIME_TRAVEL]               = q2;
        lootPools[Places.GOTHAM]                    = q3;
        lootPools[Places.SECRETS_OF_PYRAMIDS]       = q4;
        lootPools[Places.CEMETERY_ROAD_TRIP]        = q5;
        lootPools[Places.INK_FACTORY_ROBBERY]       = q6;
        lootPools[Places.TREASURE_ISLAND]           = q7;
        lootPools[Places.MAGIC_TRIP]                = q8;
        lootPools[Places.FIND_ELON_ON_MARS]         = q9;
        lootPools[Places.KATZ_GODS]                 = zombiekatGods;

    }

    function _doAction(uint256 id, address zombiekatOwner, Actions action_) internal {
        Action memory action = activities[id];
        
        require(action.action != action_
        // , "already doing that"
        );

        // Picking the largest value between block.timestamp, action.timestamp and startingTime

        uint88 timestamp = uint88(block.timestamp > action.timestamp ? block.timestamp : action.timestamp);
        
        // This will be triggered first, since the first action in the list is UNSTAKED which have 0, so
        // when this struct initialized, the default value of action.action is 0 which is UNSTAKED,
        // so it will get staked.  

        if (action.action == Actions.UNSTAKED) {
            _transfer(zombiekatOwner, address(this), id);
            stakerToTokenIds[zombiekatOwner].push(id);
        }
        else {
            if (block.timestamp > action.timestamp) _claim(id);
            timestamp = timestamp > action.timestamp ? timestamp : action.timestamp;
        }

        address owner_ = action_ == Actions.UNSTAKED ? address(0) : zombiekatOwner;        
        if (action_ == Actions.UNSTAKED) {
            _transfer(address(this), zombiekatOwner, id);
            removeTokenIdFromStaker(zombiekatOwner, id);
        }

        activities[id] = Action({owner: owner_, action: action_,timestamp: timestamp});
        emit ActionMade(zombiekatOwner, id, block.timestamp, uint8(action_));
    }
    
    function doAction(uint256 id, Actions action_) public ownerOfZombieKat(id) noCheaters {
       _doAction(id, msg.sender, action_);
    }

    function doActionWithManyZombieKatz(uint256[] calldata ids, Actions action_) external {
        for (uint256 index = 0; index < ids.length; index++) {
            doAction(ids[index], action_);
        }
    }

    function _claim(uint256 id) internal noCheaters {
        // ZombieKat memory zombiekat = zombiekatz[id];
        Action memory action = activities[id];

        if(block.timestamp <= action.timestamp) return;

        uint256 timeDiff = uint256(block.timestamp - action.timestamp);

        if (action.action == Actions.TRAINING) {
            uint256 progress = timeDiff * 3000 / 1 days;
            zombiekatz[id].lvlProgress = uint16(progress % 1000);
            zombiekatz[id].level      += uint16(progress / 1000);
        }

        activities[id].timestamp = uint88(block.timestamp);
    }

    function claim(uint256[] calldata ids) external {
        for (uint256 index = 0; index < ids.length; index++) {
            _claim(ids[index]);
        }
    }

    function _randomize(uint256 rand, string memory val, uint256 spicy) public pure returns (uint256) {
        return uint256(keccak256(abi.encode(rand, val, spicy)));
    }

    function _rand() public view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.difficulty, block.timestamp, entropySauce)));        
    }

    function _getItemFromPool(LootPool memory pool, uint256 rand) internal returns (LootPool memory, uint8 item) {
        uint draw = rand % pool.total--; 

        if (draw > pool.tier_1 + pool.tier_2 + pool.tier_3 && pool.tier_4-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 3) * 4);     
            return (pool, item);
        }

        if (draw > pool.tier_1 + pool.tier_2 && pool.tier_3-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 2) * 4);
            return (pool, item);
        }

        if (draw > pool.tier_1 && pool.tier_2-- > 0) {
            item = uint8((draw % 4 + 1) + (pool.minLootTier + 1) * 4);
            return (pool, item);
        }

        if (pool.tier_1-- > 0) {
            item = uint8((draw % 4 + 1) + pool.minLootTier * 4);
            return (pool, item); 
        }
        
    }

    function quest(uint256 id, Places place, bool tryHealth, bool tryAccuracy, bool tryDefense) public ownerOfZombieKat(id) noCheaters {
        require(block.timestamp >= uint256(activities[id].timestamp) /*, "on cooldown" */);
        require(place != Places.KATZ_GODS
        //  "You can't pillage the ZombieKat God"
        );

        if(activities[id].timestamp < block.timestamp) _claim(id); 

        uint256 rand_ = _rand();
  
        LootPool memory pool = lootPools[place];
        require(zombiekatz[id].level >= uint16(pool.minLevel)
        // , "below minimum level"
        );

        if (pool.cost > 0) {
            require(block.timestamp - startingTime > 14 days); // FIXME: maybe just remove
            IMiece(mieceAddress).burnFrom(msg.sender, uint256(pool.cost) * 1 ether);
        } 

        uint8 item;
        if (tryHealth) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"HEALTH", id));
            if (item != 0 ) zombiekatz[id].health = item;
        }
        if (tryAccuracy) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"ACCURACY", id));
            if (item != 0 ) zombiekatz[id].accuracy = item;
        }
        if (tryDefense) {
            ( pool, item ) = _getItemFromPool(pool, _randomize(rand_,"DEFENSE", id));
            if (item != 0 ) zombiekatz[id].defense = item;
        }

        if (uint(place) > 1) lootPools[place] = pool;

        ZombieKat memory zombiekat = zombiekatz[id];
        uint16 meowModifier_ = ZombieCatsLibrary._tier(zombiekat.health) + ZombieCatsLibrary._tier(zombiekat.accuracy) + ZombieCatsLibrary._tier(zombiekat.defense);

        zombiekatz[id].meowModifier = meowModifier_;

        activities[id].timestamp = uint88(block.timestamp + cooldown);
    } 

    function update(uint256 id) public ownerOfZombieKat(id) noCheaters {
        require(ZombieCatsLibrary._tier(zombiekatz[id].accuracy) < 10);
        require(block.timestamp - startingTime >= 14 days);
        
        LootPool memory pool = lootPools[Places.KATZ_GODS];
        require(zombiekatz[id].level >= pool.minLevel);

        IMiece(mieceAddress).burnFrom(msg.sender, uint256(pool.cost) * 1 ether);

        _claim(id); 

        uint8 item = uint8(lootPools[Places.KATZ_GODS].total--);
        zombiekatz[id].meowModifier = 30;
        zombiekatz[id].health = zombiekatz[id].accuracy = zombiekatz[id].defense = item + 40;
    }

    function getTokensStaked(address staker)
        public
        view
        returns (uint256[] memory)
    {
        return stakerToTokenIds[staker];
    }

    function remove(address staker, uint256 index) internal {
        if (index >= stakerToTokenIds[staker].length) return;

        for (uint256 i = index; i < stakerToTokenIds[staker].length - 1; i++) {
            stakerToTokenIds[staker][i] = stakerToTokenIds[staker][i + 1];
        }
        stakerToTokenIds[staker].pop();
    }

    function removeTokenIdFromStaker(address staker, uint256 tokenId) internal {
        for (uint256 i = 0; i < stakerToTokenIds[staker].length; i++) {
            if (stakerToTokenIds[staker][i] == tokenId) {
                //This is the tokenId to remove;
                remove(staker, i);
            }
        }
    }


    /*
  __  __ _     _   _             ___             _   _             
 |  \/  (_)_ _| |_(_)_ _  __ _  | __|  _ _ _  __| |_(_)___ _ _  ___
 | |\/| | | ' \  _| | ' \/ _` | | _| || | ' \/ _|  _| / _ \ ' \(_-<
 |_|  |_|_|_||_\__|_|_||_\__, | |_| \_,_|_||_\__|\__|_\___/_||_/__/
                         |___/                                     
   */

    /**
     * @dev Generates a 9 digit hash from a tokenId, address, and random number.
     * @param _t The token id to be used within the hash.
     * @param _a The address to be used within the hash.
     * @param _c The custom nonce to be used within the hash.
     */
    function mutatedHash(string memory originalHash,
        uint256 _t,
        address _a,
        uint256 _c
    ) internal returns (string memory) {
        require(_c < 10);
       
        string memory currentHash = "0";

        for (uint8 i = 0; i < 8; i++) {            

            SEED_NONCE++;
            uint16 _randinput_keeper = uint16(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            block.timestamp,
                            block.difficulty,
                            _t,
                            _a,
                            _c,
                            SEED_NONCE
                        )
                    )
                ) % 100
            );


            // If we keep the trait
            if ( _randinput_keeper > 30 ) {
                currentHash = string(
                abi.encodePacked(
                    currentHash, 
                    ZombieCatsLibrary.substring(originalHash, i, i+1)
                )
                );
            } else {
                // If a new trait will be there 

                SEED_NONCE++;

                uint16 _randinput = uint16(
                    uint256(
                        _randomize(_rand(),currentHash, SEED_NONCE)
                    ) % 10000
                );
                
                currentHash = string(
                    abi.encodePacked(
                        currentHash, 
                        ZombieCatsLibrary.rarityGen(_randinput, i, MUTATED_TIERS)
                    )
                );
            }
        }

        if (hashToMinted[currentHash]) return mutatedHash(originalHash,_t, _a, _c + 1);

        return currentHash;
    }

    /**
     * @dev Mint internal, this is to avoid code duplication.
     */
    function mintInternal(address _account, string memory _hash) internal {
        uint256 rand = _rand();

        uint256 _totalSupply = totalSupply();        
       
        uint256 thisTokenId = _totalSupply;

        tokenIdToHash[thisTokenId] = _hash;

        hashToMinted[tokenIdToHash[thisTokenId]] = true;

        // QUESTS 

        (uint8 health,uint8 accuracy,uint8 defense) = (0,0,0);
        
        {

            // Helpers to get Percentages
            uint256 eightyPct     = type(uint16).max / 100 * 80;
            uint256 nineFivePct   = type(uint16).max / 100 * 95;

            // Getting Random traits
            uint16 randHelm = uint16(_randomize(rand, "HEALTH", thisTokenId));
                    health     = uint8(randHelm < eightyPct ? 0 : randHelm % 4 + 5);

            uint16 randOffhand = uint16(_randomize(rand, "ACCURACY", thisTokenId));
                    defense     = uint8(randOffhand < eightyPct ? 0 : randOffhand % 4 + 5);

            uint16 randMainhand = uint16(_randomize(rand, "DEFENSE", thisTokenId));
                    accuracy     = uint8(randMainhand < nineFivePct ? randMainhand % 4 + 1: randMainhand % 4 + 5);
        }

        _mint(_account, thisTokenId);

        uint16 meowModifier = ZombieCatsLibrary._tier(health) + ZombieCatsLibrary._tier(accuracy) + ZombieCatsLibrary._tier(defense);
        zombiekatz[uint256(thisTokenId)] = ZombieKat({health: health, accuracy: accuracy, defense: defense, level: 0, lvlProgress: 0, meowModifier:meowModifier});
    }

    /**
     * @dev Mints a zombie. Only the Graveyard contract can call this function.
     */    
    function mintZombie(address _account, string memory _hash) public {
        require(msg.sender == graveyardAddress);

        // In the Graveyard contract, the Katz head stored in the hash in position 1 
        // while the character in the ZombieKatz contract is stored in position 8        
        // so we swap the traits. 

        // We let the graveyard contract to mint whatever is the total supply, just in case 
        // to avoid a situation of zombies stucked in a grave, since you need to claim your zombie
        // before unstake a grave digging zombie. 
                
        mintInternal(_account, 
            string(
                abi.encodePacked(
                    "0",                                       // not burnt
                    ZombieCatsLibrary.substring(_hash, 8, 9),  // grave 
                    ZombieCatsLibrary.substring(_hash, 2, 8),  // rest
                    ZombieCatsLibrary.substring(_hash, 1, 2)   // hand
                )
            )
        );        
    }

    /**
     * @dev Developers will mint zombies for themselves.
     * @param _times How many zombie will be minted
     */      
    function mintReserve(uint256 _times) public onlyOwner {
        for(uint256 i=0; i< _times; i++){
            uint256 _totalSupply = totalSupply();
            require(_totalSupply < 50);
            // FIXME: hash 
            mintInternal(msg.sender,  mutatedHash("011111111",_totalSupply, msg.sender, 0) );
        }        
    }

    /**
     * @dev Mutates a zombie.
     * @param _tokenId The token to burn.
     */
    
    function mutateZombie(uint256 _tokenId) public ownerOfZombieKat(_tokenId) noCheaters {
        // require(ownerOf(_tokenId) == msg.sender
        // //, "You must own this zombie to mutate"
        // );

        IMiece(mieceAddress).burnFrom(msg.sender, 30 ether);

        tokenIdToHash[_tokenId] =  mutatedHash(_tokenIdToHash(_tokenId), _tokenId, msg.sender, 0); 
        
        hashToMinted[tokenIdToHash[_tokenId]] = true;

    }

    /*
 ____     ___   ____  ___        _____  __ __  ____     __ ______  ____  ___   ____   _____
|    \   /  _] /    ||   \      |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|  D  ) /  [_ |  o  ||    \     |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|    / |    _]|     ||  D  |    |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|    \ |   [_ |  _  ||     |    |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|  .  \|     ||  |  ||     |    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
|__|\_||_____||__|__||_____|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                           
*/


    /**
     * @dev Returns the SVG and metadata for a token Id
     * @param _tokenId The tokenId to return the SVG and metadata for.
     */

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId));

        ZombieKat memory zombiekat = zombiekatz[_tokenId];

        string memory tokenHash = _tokenIdToHash(_tokenId);
        return
            ZombieCatsLibrary.tokenURIData(
                _tokenId,
                tokenHash,
                traitTypes,
                LETTERS,
                zombiekat.health, 
                zombiekat.accuracy, 
                zombiekat.defense, 
                zombiekat.level, 
                zombiekat.meowModifier
            );
    }

    /**
     * @dev Returns a hash for a given tokenId
     * @param _tokenId The tokenId to return the hash for.
     */
    function _tokenIdToHash(uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        string memory tokenHash = tokenIdToHash[_tokenId];

        //If this is a burned token, override the previous hash
        if (ownerOf(_tokenId) == 0x000000000000000000000000000000000000dEaD) {
            tokenHash = string(
                abi.encodePacked(
                    "1",
                    ZombieCatsLibrary.substring(tokenHash, 1, 9)
                )
            );
        }

        return tokenHash;
    }

    /**
     * @dev Returns the wallet of a given wallet. Mainly for ease for frontend devs.
     * @param _wallet The wallet to get the tokens of.
     */
    function walletOfOwner(address _wallet)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_wallet);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_wallet, i);
        }
        return tokensId;
    }

    /**
     * @dev Add a trait type
     * @param _traitTypeIndex The trait type index
     * @param traits Array of traits to add
     */

    function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                ZombieCatsLibrary.Trait(
                    traits[i].traitName,
                    traits[i].traitType,
                    traits[i].pixels,
                    traits[i].pixelCount
                )
            );
        }

        return;
    }
     
    /**
     * @dev Sets the miece, cats and zombie contract addresses
     * @param _mieceAddress The miece address
     * @param _graveyardAddress The graveyards address
     */
    function setContractAddresses(
        address _mieceAddress,
        address _graveyardAddress
    ) public onlyOwner {
        mieceAddress = _mieceAddress;
        graveyardAddress = _graveyardAddress;
        return;
    }

    /**
     * @dev Modifier to only allow owner to call functions
     */
    modifier onlyOwner() {
        require(_owner == msg.sender);
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"activity","type":"uint8"}],"name":"ActionMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_rand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rand","type":"uint256"},{"internalType":"string","name":"val","type":"string"},{"internalType":"uint256","name":"spicy","type":"uint256"}],"name":"_randomize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activities","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint88","name":"timestamp","type":"uint88"},{"internalType":"enum ZombieCats.Actions","name":"action","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct ZombieCats.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum ZombieCats.Actions","name":"action_","type":"uint8"}],"name":"doAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum ZombieCats.Actions","name":"action_","type":"uint8"}],"name":"doActionWithManyZombieKatz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokensStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","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":[{"internalType":"enum ZombieCats.Places","name":"","type":"uint8"}],"name":"lootPools","outputs":[{"internalType":"uint8","name":"minLevel","type":"uint8"},{"internalType":"uint8","name":"minLootTier","type":"uint8"},{"internalType":"uint16","name":"cost","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint16","name":"tier_1","type":"uint16"},{"internalType":"uint16","name":"tier_2","type":"uint16"},{"internalType":"uint16","name":"tier_3","type":"uint16"},{"internalType":"uint16","name":"tier_4","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_hash","type":"string"}],"name":"mintZombie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mutateZombie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"id","type":"uint256"},{"internalType":"enum ZombieCats.Places","name":"place","type":"uint8"},{"internalType":"bool","name":"tryHealth","type":"bool"},{"internalType":"bool","name":"tryAccuracy","type":"bool"},{"internalType":"bool","name":"tryDefense","type":"bool"}],"name":"quest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mieceAddress","type":"address"},{"internalType":"address","name":"_graveyardAddress","type":"address"}],"name":"setContractAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingTime","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","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":"uint256","name":"id","type":"uint256"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"zombiekatz","outputs":[{"internalType":"uint8","name":"health","type":"uint8"},{"internalType":"uint8","name":"accuracy","type":"uint8"},{"internalType":"uint8","name":"defense","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint16","name":"meowModifier","type":"uint16"},{"internalType":"uint32","name":"lvlProgress","type":"uint32"}],"stateMutability":"view","type":"function"}]

611544601155600060125560016103c0818152606160f81b6103e0526080908152610400828152603160f91b6104205260a052610440828152606360f81b6104605260c052610480828152601960fa1b6104a05260e0526104c0828152606560f81b6104e05261010052610500828152603360f91b6105205261012052610540828152606760f81b6105605261014052610580828152600d60fb1b6105a052610160526105c0828152606960f81b6105e05261018052610600828152603560f91b610620526101a052610640828152606b60f81b610660526101c052610680828152601b60fa1b6106a0526101e0526106c0828152606d60f81b6106e05261020052610700828152603760f91b6107205261022052610740828152606f60f81b6107605261024052610780828152600760fc1b6107a052610260526107c0828152607160f81b6107e05261028052610800828152603960f91b610820526102a052610840828152607360f81b610860526102c052610880828152601d60fa1b6108a0526102e0526108c0828152607560f81b6108e05261030052610900828152603b60f91b6109205261032052610940828152607760f81b6109605261034052610980828152600f60fb1b6109a052610360526109c0828152607960f81b6109e05261038052610a40604052610a00918252603d60f91b610a20526103a0919091526200021190601390601a62000583565b503480156200021f57600080fd5b50604080518082018252600a81526931a6bcad37b6b134b2bd60b11b6020808301918252835180850190945260068452655a4f4d42494560d01b9084015281519192916200027091600091620005e7565b50805162000286906001906020840190620005e7565b5050601e80546001600160a01b031916331790555060408051610140810182526064815261019060208201526101f4918101919091526102bc6060820152610384608082015261044c60a082015261051460c082015261064060e082018190526101008201526107086101208201526200030590601490600a62000672565b506040805160e0810182526064815261012c6020820152610320918101919091526103e860608201526105dc6080820152610af060a0820152610dac60c08201526200035690601590600762000672565b506040805161010081018252603281526096602082015260c89181019190915261012c60608201526104e260808201526106d660a0820152610af060c0820152610dac60e0820152620003ae90601690600862000672565b506040805160e0810182526032815260c8602082015260fa918101919091526105dc60608201526107d060808201526109c460a0820152610dac60c0820152620003fd90601790600762000672565b5060408051610140810182526032815260646020820152610190918101919091526101c260608201526101f460808201526102bc60a082015261070860c08201526107d060e0820181905261010082018190526101208201526200046690601890600a62000672565b5060408051610120810182526102ee80825260208201819052918101919091526103e8606082018190526080820181905260a08201526104e260c08201526105dc60e08201526107d0610100820152620004c590601990600962000672565b506040805160e0810182526105948082526020820181905291810191909152610595606082018190526080820181905260a0820181905260c08201526200051190601a90600762000672565b50604080516101408101825260148152604660208201526102d1918101919091526103e8606082015261048360808201526104b060a082015261051460c082015261059a60e08201526106056101008201526106176101208201526200057c90601b90600a62000672565b50620007d7565b828054828255906000526020600020908101928215620005d5579160200282015b82811115620005d55782518051620005c4918491602090910190620005e7565b5091602001919060010190620005a4565b50620005e39291506200071d565b5090565b828054620005f5906200079a565b90600052602060002090601f01602090048101928262000619576000855562000664565b82601f106200063457805160ff191683800117855562000664565b8280016001018555821562000664579182015b828111156200066457825182559160200191906001019062000647565b50620005e39291506200073e565b82805482825590600052602060002090600f01601090048101928215620006645791602002820160005b83821115620006de57835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200069c565b80156200070e5782816101000a81549061ffff0219169055600201602081600101049283019260010302620006de565b5050620005e39291506200073e565b80821115620005e357600062000734828262000755565b506001016200071d565b5b80821115620005e357600081556001016200073f565b50805462000763906200079a565b6000825580601f1062000777575062000797565b601f0160209004906000526020600020908101906200079791906200073e565b50565b600281046001821680620007af57607f821691505b60208210811415620007d157634e487b7160e01b600052602260045260246000fd5b50919050565b615f1380620007e76000396000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80636ba4c13811610130578063a06ca511116100b8578063c87b56dd1161007c578063c87b56dd146104ed578063cd931e4014610500578063d93dfe8814610513578063e985e9c514610526578063f906751b1461053957610231565b8063a06ca5111461047c578063a22cb4651461048f578063b7c72c34146104a2578063b88d4fde146104b5578063bd9d6f2b146104c857610231565b80638129fc1c116100ff5780638129fc1c1461042a57806382ab890a146104325780638592b7781461044557806395d89b411461044d578063962b2df21461045557610231565b80636ba4c138146103e957806370a08231146103fc57806376f0d51a1461040f578063787a08a61461042257610231565b80632f745c59116101be57806347fdf3271161018257806347fdf3271461038a5780634f6ccce71461039d57806352eb7796146103b05780635b4c3546146103c35780636352211e146103d657610231565b80632f745c59146103195780632fb098d21461032c57806339518b5e1461034f57806342842e0e14610357578063438b63001461036a57610231565b8063095ea7b311610205578063095ea7b3146102a75780630d1657e8146102bc57806318160ddd146102de57806323b872dd146102f35780632cc844761461030657610231565b80625ea3071461023657806301ffc9a71461025f57806306fdde031461027f578063081812fc14610287575b600080fd5b610249610244366004614ffc565b61054c565b604051610256919061555e565b60405180910390f35b61027261026d366004614f1e565b610645565b6040516102569190615553565b61024961066a565b61029a610295366004614ffc565b6106fc565b6040516102569190615431565b6102ba6102b5366004614e63565b610748565b005b6102cf6102ca366004614ffc565b6107e0565b604051610256939291906154c4565b6102e6610818565b6040516102569190615a32565b6102ba610301366004614d3a565b61081e565b6102ba610314366004614e17565b610856565b6102e6610327366004614e63565b6108c2565b61033f61033a366004615212565b610914565b6040516102569493929190615571565b6102e6610af9565b6102ba610365366004614d3a565b610b01565b61037d610378366004614cee565b610b1c565b604051610256919061550f565b6102ba610398366004614ecc565b610bda565b6102e66103ab366004614ffc565b610c2d565b61037d6103be366004614cee565b610c88565b6102e66103d13660046151c4565b610cf4565b61029a6103e4366004614ffc565b610d2b565b6102ba6103f7366004614e8c565b610d60565b6102e661040a366004614cee565b610dac565b6102ba61041d366004615145565b610df0565b6102e6610e8e565b6102ba610e94565b6102ba610440366004614ffc565b61208f565b6102e6612406565b610249612441565b610468610463366004614f56565b612450565b604051610256989796959493929190615ba0565b6102ba61048a366004615167565b6124ae565b6102ba61049d366004614dee565b612c86565b6102ba6104b0366004614ffc565b612d54565b6102ba6104c3366004614d75565b612ed1565b6104db6104d6366004614ffc565b612f0a565b60405161025696959493929190615be8565b6102496104fb366004614ffc565b612f58565b6102ba61050e366004614d08565b6130a0565b6102ba610521366004615014565b6130e5565b610272610534366004614d08565b61326c565b6102ba610547366004614ffc565b61329a565b6000818152600c602052604081208054606092919061056a90615dda565b80601f016020809104026020016040519081016040528092919081815260200182805461059690615dda565b80156105e35780601f106105b8576101008083540402835291602001916105e3565b820191906000526020600020905b8154815290600101906020018083116105c657829003601f168201915b505050505090506105f383610d2b565b6001600160a01b031661dead6001600160a01b0316141561063d5761061b816001600961331f565b60405160200161062b91906153d2565b60405160208183030381529060405290505b90505b919050565b60006001600160e01b0319821663780e9d6360e01b148061063d575061063d82613416565b60606000805461067990615dda565b80601f01602080910402602001604051908101604052809291908181526020018280546106a590615dda565b80156106f25780601f106106c7576101008083540402835291602001916106f2565b820191906000526020600020905b8154815290600101906020018083116106d557829003601f168201915b5050505050905090565b600061070782613456565b61072c5760405162461bcd60e51b81526004016107239061587c565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061075382610d2b565b9050806001600160a01b0316836001600160a01b031614156107875760405162461bcd60e51b815260040161072390615935565b806001600160a01b0316610799613473565b6001600160a01b031614806107b557506107b581610534613473565b6107d15760405162461bcd60e51b815260040161072390615757565b6107db8383613477565b505050565b600e602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60085490565b61082f610829613473565b826134e5565b61084b5760405162461bcd60e51b815260040161072390615976565b6107db838383613562565b601d546001600160a01b0316331461086d57600080fd5b6108be8261087e836008600961331f565b61088b846002600861331f565b610898856001600261331f565b6040516020016108aa9392919061537c565b60405160208183030381529060405261368f565b5050565b60006108cd83610dac565b82106108eb5760405162461bcd60e51b8152600401610723906155bc565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a602052816000526040600020818154811061093057600080fd5b90600052602060002090600402016000915091505080600001805461095490615dda565b80601f016020809104026020016040519081016040528092919081815260200182805461098090615dda565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050908060010180546109e290615dda565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90615dda565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b505050505090806002018054610a7090615dda565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615dda565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b5050505050908060030154905084565b63617f1ff081565b6107db83838360405180602001604052806000815250612ed1565b60606000610b2983610dac565b905060008167ffffffffffffffff811115610b5457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50905060005b82811015610bd257610b9585826108c2565b828281518110610bb557634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610bca81615e15565b915050610b83565b509392505050565b60005b82811015610c2757610c15848483818110610c0857634e487b7160e01b600052603260045260246000fd5b9050602002013583610df0565b80610c1f81615e15565b915050610bdd565b50505050565b6000610c37610818565b8210610c555760405162461bcd60e51b8152600401610723906159c7565b60088281548110610c7657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6001600160a01b038116600090815260106020908152604091829020805483518184028101840190945280845260609392830182828015610ce857602002820191906000526020600020905b815481526020019060010190808311610cd4575b50505050509050919050565b6000838383604051602001610d0b93929190615b69565b60408051601f198184030181529190528051602090910120949350505050565b6000818152600260205260408120546001600160a01b03168061063d5760405162461bcd60e51b8152600401610723906157fe565b60005b818110156107db57610d9a838383818110610d8e57634e487b7160e01b600052603260045260246000fd5b90506020020135613b0f565b80610da481615e15565b915050610d63565b60006001600160a01b038216610dd45760405162461bcd60e51b8152600401610723906157b4565b506001600160a01b031660009081526003602052604090205490565b8133610dfb82610d2b565b6001600160a01b03161480610e2657506000818152600e60205260409020546001600160a01b031633145b610e2f57600080fd5b610e3833613d32565b15610e555760405162461bcd60e51b815260040161072390615911565b3341604051602001610e6892919061526e565b60408051601f198184030181529190528051602090910120601f556107db833384613d38565b61025881565b601e546001600160a01b03163314610eab57600080fd5b6000604051806101000160405280600160ff168152602001600360ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001601260ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601e60ff168152602001603060ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280602d60ff168152602001604960ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600860ff168152602001600d60ff168152602001601961ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001601c60ff168152602001603261ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601460ff168152602001602b60ff168152602001604b61ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601e60ff168152602001603f60ff168152602001606461ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280602d60ff168152602001605860ff168152602001609661ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280603460ff168152602001606460ff16815260200161012c61ffff168152602001600a61ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815250905089600f60008060098111156112cb57634e487b7160e01b600052602160045260246000fd5b60098111156112ea57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505088600f60006003600981111561143557634e487b7160e01b600052602160045260246000fd5b600981111561145457634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505087600f60006007600981111561159f57634e487b7160e01b600052602160045260246000fd5b60098111156115be57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505086600f60006004600981111561170957634e487b7160e01b600052602160045260246000fd5b600981111561172857634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505085600f60006001600981111561187357634e487b7160e01b600052602160045260246000fd5b600981111561189257634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505084600f6000600260098111156119dd57634e487b7160e01b600052602160045260246000fd5b60098111156119fc57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505083600f600060066009811115611b4757634e487b7160e01b600052602160045260246000fd5b6009811115611b6657634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505082600f600060056009811115611cb157634e487b7160e01b600052602160045260246000fd5b6009811115611cd057634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505081600f600060086009811115611e1b57634e487b7160e01b600052602160045260246000fd5b6009811115611e3a57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505080600f6000600980811115611f8457634e487b7160e01b600052602160045260246000fd5b6009811115611fa357634e487b7160e01b600052602160045260246000fd5b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff1990981660ff9586161761ff00191661010095909716949094029590951763ffff000019166201000061ffff938416021765ffff000000001916640100000000918316919091021767ffff0000000000001916600160301b948216949094029390931761ffff60401b1916600160401b918416919091021761ffff60501b1916600160501b948316949094029390931761ffff60601b1916600160601b919092160217905550505050505050505050565b803361209a82610d2b565b6001600160a01b031614806120c557506000818152600e60205260409020546001600160a01b031633145b6120ce57600080fd5b6120d733613d32565b156120f45760405162461bcd60e51b815260040161072390615911565b334160405160200161210792919061526e565b60408051808303601f190181528282528051602091820120601f556000858152600d9091522054631d9ffc1d60e31b8252600a9173d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e89161216c91610100900460ff1690600401615b92565b60206040518083038186803b15801561218457600080fd5b505af4158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc9190614fda565b61ffff16106121ca57600080fd5b621275006121dc63617f1ff042615d79565b10156121e757600080fd5b6040805161010080820183527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760395460ff8082168085529282041660208085019190915261ffff620100008304811685870152640100000000830481166060860152600160301b830481166080860152600160401b8304811660a0860152600160501b8304811660c0860152600160601b909204821660e08501526000878152600d90915293909320549192630100000090920490911610156122a857600080fd5b601c5460408201516001600160a01b03909116906379cc67909033906122da9061ffff16670de0b6b3a7640000615d31565b6040518363ffffffff1660e01b81526004016122f7929190615482565b600060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b5050505061233283613b0f565b60096000908152600f6020527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398054640100000000900461ffff1690600461237983615dbc565b82546101009290920a61ffff8181021990931691909216919091021790556000858152600d60205260409020805466ffff00000000001916651e000000000017905590506123c8816028615cad565b6000948552600d6020526040909420805462ff000019166201000060ff9096169586021761ff00191661010086021760ff1916909417909355505050565b600033424442601f54604051602001612423959493929190615290565b6040516020818303038152906040528051906020012060001c905090565b60606001805461067990615dda565b600f6020526000908152604090205460ff8082169161010081049091169061ffff6201000082048116916401000000008104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b90041688565b84336124b982610d2b565b6001600160a01b031614806124e457506000818152600e60205260409020546001600160a01b031633145b6124ed57600080fd5b6124f633613d32565b156125135760405162461bcd60e51b815260040161072390615911565b334160405160200161252692919061526e565b60408051808303601f190181529181528151602092830120601f556000888152600e909252902054600160a01b90046001600160581b031642101561256a57600080fd5b600985600981111561258c57634e487b7160e01b600052602160045260246000fd5b141561259757600080fd5b6000868152600e602052604090205442600160a01b9091046001600160581b031610156125c7576125c786613b0f565b60006125d1612406565b90506000600f60008860098111156125f957634e487b7160e01b600052602160045260246000fd5b600981111561261857634e487b7160e01b600052602160045260246000fd5b81526020808201929092526040908101600090812082516101008082018552915460ff808216808452938204168287015261ffff620100008204811683870152640100000000820481166060840152600160301b820481166080840152600160401b8204811660a0840152600160501b8204811660c0840152600160601b909104811660e08301528d8452600d9095529290912054919350630100000090910490911610156126c657600080fd5b604081015161ffff161561277257621275006126e663617f1ff042615d79565b116126f057600080fd5b601c5460408201516001600160a01b03909116906379cc67909033906127229061ffff16670de0b6b3a7640000615d31565b6040518363ffffffff1660e01b815260040161273f929190615482565b600060405180830381600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050505b600086156127d6576127ac826127a785604051806040016040528060068152602001650908a8298a8960d31b8152508d610cf4565b6140ab565b909250905060ff8116156127d6576000898152600d60205260409020805460ff191660ff83161790555b851561283a5761280b826127a78560405180604001604052806008815260200167414343555241435960c01b8152508d610cf4565b909250905060ff81161561283a576000898152600d60205260409020805461ff00191661010060ff8416021790555b841561289f5761286e826127a78560405180604001604052806007815260200166444546454e534560c81b8152508d610cf4565b909250905060ff81161561289f576000898152600d60205260409020805462ff000019166201000060ff8416021790555b60018860098111156128c157634e487b7160e01b600052602160045260246000fd5b11156129ec5781600f60008a60098111156128ec57634e487b7160e01b600052602160045260246000fd5b600981111561290b57634e487b7160e01b600052602160045260246000fd5b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff1990981660ff9586161761ff00191661010095909716949094029590951763ffff000019166201000061ffff938416021765ffff000000001916640100000000918316919091021767ffff0000000000001916600160301b948216949094029390931761ffff60401b1916600160401b918416919091021761ffff60501b1916600160501b948316949094029390931761ffff60601b1916600160601b91909216021790555b6000898152600d60209081526040808320815160c081018352905460ff808216835261010082048116948301949094526201000081049093168183018190526301000000840461ffff9081166060840152600160281b8504166080830152600160381b90930463ffffffff1660a08201529051631d9ffc1d60e31b815290929173d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612a9491600401615b92565b60206040518083038186803b158015612aac57600080fd5b505af4158015612ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae49190614fda565b6020830151604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612b1f9190600401615b92565b60206040518083038186803b158015612b3757600080fd5b505af4158015612b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6f9190614fda565b8351604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612ba79190600401615b92565b60206040518083038186803b158015612bbf57600080fd5b505af4158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614fda565b612c019190615c78565b612c0b9190615c78565b60008c8152600d60205260409020805466ffff00000000001916600160281b61ffff8416021790559050612c4161025842615c95565b60009b8c52600e6020526040909b2080546001600160581b039c909c16600160a01b02600160a01b600160f81b0319909c169b909b17909a5550505050505050505050565b612c8e613473565b6001600160a01b0316826001600160a01b03161415612cbf5760405162461bcd60e51b8152600401610723906156d4565b8060056000612ccc613473565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612d10613473565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d489190615553565b60405180910390a35050565b8033612d5f82610d2b565b6001600160a01b03161480612d8a57506000818152600e60205260409020546001600160a01b031633145b612d9357600080fd5b612d9c33613d32565b15612db95760405162461bcd60e51b815260040161072390615911565b3341604051602001612dcc92919061526e565b60408051601f19818403018152908290528051602090910120601f55601c5463079cc67960e41b82526001600160a01b0316906379cc679090612e1e9033906801a055690d9db8000090600401615482565b600060405180830381600087803b158015612e3857600080fd5b505af1158015612e4c573d6000803e3d6000fd5b50505050612e65612e5c8361054c565b8333600061424e565b6000838152600c602090815260409091208251612e889391929190910190614b26565b506001600b600c6000858152602001908152602001600020604051612ead919061530d565b908152604051908190036020019020805491151560ff199092169190911790555050565b612ee2612edc613473565b836134e5565b612efe5760405162461bcd60e51b815260040161072390615976565b610c2784848484614481565b600d6020526000908152604090205460ff808216916101008104821691620100008204169061ffff63010000008204811691600160281b81049091169063ffffffff600160381b9091041686565b6060612f6382613456565b612f6c57600080fd5b6000828152600d60209081526040808320815160c081018352905460ff80821683526101008204811694830194909452620100008104909316918101919091526301000000820461ffff9081166060830152600160281b8304166080820152600160381b90910463ffffffff1660a082015290612fe88461054c565b825160208401516040808601516060870151608088015192516301798e3960e01b815295965073d27ac9227d30d75a27779f1cabbb68dd965cd992956301798e3995613044958c958a95600a9560139591929091600401615a3b565b60006040518083038186803b15801561305c57600080fd5b505af4158015613070573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130989190810190614f70565b949350505050565b601e546001600160a01b031633146130b757600080fd5b601c80546001600160a01b039384166001600160a01b031991821617909155601d8054929093169116179055565b601e546001600160a01b031633146130fc57600080fd5b60005b81518110156107db57600a6000848152602001908152602001600020604051806080016040528084848151811061314657634e487b7160e01b600052603260045260246000fd5b602002602001015160000151815260200184848151811061317757634e487b7160e01b600052603260045260246000fd5b60200260200101516020015181526020018484815181106131a857634e487b7160e01b600052603260045260246000fd5b60200260200101516040015181526020018484815181106131d957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926132179284920190614b26565b5060208281015180516132309260018501920190614b26565b506040820151805161324c916002840191602090910190614b26565b50606082015181600301555050808061326490615e15565b9150506130ff565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b601e546001600160a01b031633146132b157600080fd5b60005b818110156108be5760006132c6610818565b9050603281106132d557600080fd5b61330c336133076040518060400160405280600981526020016830313131313131313160b81b8152508433600061424e565b61368f565b508061331781615e15565b9150506132b4565b606083600061332e8585615d79565b67ffffffffffffffff81111561335457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561337e576020820181803683370190505b509050845b8481101561340c578281815181106133ab57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826133c58884615d79565b815181106133e357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061340481615e15565b915050613383565b5095945050505050565b60006001600160e01b031982166380ac58cd60e01b148061344757506001600160e01b03198216635b5e139f60e01b145b8061063d575061063d826144b4565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906134ac82610d2b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006134f082613456565b61350c5760405162461bcd60e51b81526004016107239061570b565b600061351783610d2b565b9050806001600160a01b0316846001600160a01b031614806135525750836001600160a01b0316613547846106fc565b6001600160a01b0316145b806130985750613098818561326c565b826001600160a01b031661357582610d2b565b6001600160a01b03161461359b5760405162461bcd60e51b8152600401610723906158c8565b6001600160a01b0382166135c15760405162461bcd60e51b815260040161072390615690565b6135cc8383836144cd565b6135d7600082613477565b6001600160a01b0383166000908152600360205260408120805460019290613600908490615d79565b90915550506001600160a01b038216600090815260036020526040812080546001929061362e908490615c95565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613699612406565b905060006136a5610818565b6000818152600c60209081526040909120855192935083926136c992870190614b26565b506001600b600c60008481526020019081526020016000206040516136ee919061530d565b908152604051908190036020019020805491151560ff199092169190911790556000808080613720606461ffff615cd2565b61372b906050615d07565b61ffff1690506000606461ffff6137429190615cd2565b61374d90605f615d07565b61ffff169050600061377e89604051806040016040528060068152602001650908a8298a8960d31b81525089610cf4565b9050828161ffff16106137a657613796600482615e50565b6137a1906005615c78565b6137a9565b60005b955060006137d88a60405180604001604052806008815260200167414343555241435960c01b8152508a610cf4565b9050838161ffff1610613800576137f0600482615e50565b6137fb906005615c78565b613803565b60005b945060006138318b60405180604001604052806007815260200166444546454e534560c81b8152508b610cf4565b9050838161ffff161061385957613849600482615e50565b613854906005615c78565b61386f565b613864600482615e50565b61386f906001615c78565b965050505050506138808885614556565b604051631d9ffc1d60e31b815260009073d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e8906138ba908590600401615b92565b60206040518083038186803b1580156138d257600080fd5b505af41580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a9190614fda565b604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e890613941908790600401615b92565b60206040518083038186803b15801561395957600080fd5b505af415801561396d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139919190614fda565b604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e8906139c8908990600401615b92565b60206040518083038186803b1580156139e057600080fd5b505af41580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614fda565b613a229190615c78565b613a2c9190615c78565b6040805160c08101825260ff9687168152948616602080870191825294871686830190815260006060880181815261ffff95861660808a0190815260a08a018381529b8352600d909852939020965187549251915193519651995160ff199093169089161761ff001916610100918916919091021762ff000019166201000092909716919091029590951764ffff00000019166301000000938216939093029290921766ffff00000000001916600160281b95909216949094021763ffffffff60381b1916600160381b63ffffffff909316929092029190911790555050505050565b613b1833613d32565b15613b355760405162461bcd60e51b815260040161072390615911565b3341604051602001613b4892919061526e565b60408051808303601f190181528282528051602091820120601f556000848152600e825282812060608501845280546001600160a01b0381168652600160a01b81046001600160581b031693860193909352909392909190830190600160f81b900460ff166001811115613bcc57634e487b7160e01b600052602160045260246000fd5b6001811115613beb57634e487b7160e01b600052602160045260246000fd5b81525050905080602001516001600160581b03164211613c0b5750613d2f565b600081602001516001600160581b031642613c269190615d79565b9050600182604001516001811115613c4e57634e487b7160e01b600052602160045260246000fd5b1415613cfc57600062015180613c6683610bb8615d31565b613c709190615cf3565b9050613c7e6103e882615e71565b6000858152600d60205260409020805463ffffffff60381b191661ffff92909216600160381b02919091179055613cb76103e882615cf3565b6000858152600d602052604090208054600390613ce09084906301000000900461ffff16615c78565b92506101000a81548161ffff021916908361ffff160217905550505b50506000818152600e602052604090208054600160a01b600160f81b031916600160a01b426001600160581b0316021790555b50565b3b151590565b6000838152600e60209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166001811115613da557634e487b7160e01b600052602160045260246000fd5b6001811115613dc457634e487b7160e01b600052602160045260246000fd5b9052509050816001811115613de957634e487b7160e01b600052602160045260246000fd5b81604001516001811115613e0d57634e487b7160e01b600052602160045260246000fd5b1415613e1857600080fd5b600081602001516001600160581b03164211613e415781602001516001600160581b0316613e43565b425b9050600082604001516001811115613e6b57634e487b7160e01b600052602160045260246000fd5b1415613eac57613e7c843087613562565b6001600160a01b038416600090815260106020908152604082208054600181018255908352912001859055613ef6565b81602001516001600160581b0316421115613eca57613eca85613b0f565b81602001516001600160581b0316816001600160581b031611613ef1578160200151613ef3565b805b90505b600080846001811115613f1957634e487b7160e01b600052602160045260246000fd5b14613f245784613f27565b60005b90506000846001811115613f4b57634e487b7160e01b600052602160045260246000fd5b1415613f6657613f5c308688613562565b613f668587614635565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856001811115613faf57634e487b7160e01b600052602160045260246000fd5b90526000878152600e602090815260409182902083518154928501516001600160581b0316600160a01b02600160a01b600160f81b03196001600160a01b039092166001600160a01b031990941693909317169190911780825591830151909182906001600160f81b0316600160f81b83600181111561403f57634e487b7160e01b600052602160045260246000fd5b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c03685874287600181111561408b57634e487b7160e01b600052602160045260246000fd5b60405161409b949392919061549b565b60405180910390a1505050505050565b6140b3614baa565b6000808460600180518091906140c890615dbc565b61ffff9081169091526140dc911685615e71565b90508460c001518560a0015186608001516140f79190615c78565b6141019190615c78565b61ffff168111801561412c575060e08501805160009161412082615dbc565b61ffff90811690915216115b1561417a576020850151614141906003615cad565b61414c906004615d50565b60ff1661415a600483615e71565b614165906001615c95565b61416f9190615c95565b915084925050614247565b8460a00151856080015161418e9190615c78565b61ffff16811180156141b9575060c0850180516000916141ad82615dbc565b61ffff90811690915216115b156141ce576020850151614141906002615cad565b846080015161ffff16811180156141fe575060a0850180516000916141f282615dbc565b61ffff90811690915216115b15614213576020850151614141906001615cad565b60808501805160009161422582615dbc565b61ffff90811690915216111561424557602085015161414c906004615d50565b505b9250929050565b6060600a821061425d57600080fd5b6040805180820190915260018152600360fc1b602082015260005b60088160ff161015614431576012805490600061429483615e15565b91905055506000606442448989896012546040516020016142ba969594939291906153fb565b6040516020818303038152906040528051906020012060001c6142dd9190615e71565b9050601e8161ffff16111561432f57826143088960ff8516614300866001615cad565b60ff1661331f565b6040516020016143199291906152de565b604051602081830303815290604052925061441e565b6012805490600061433f83615e15565b9190505550600061271061435d614354612406565b86601254610cf4565b6143679190615e71565b90508373d27ac9227d30d75a27779f1cabbb68dd965cd99263ee3a84da838660146040518463ffffffff1660e01b81526004016143a693929190615a13565b60006040518083038186803b1580156143be57600080fd5b505af41580156143d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143fa9190810190614f70565b60405160200161440b9291906152de565b6040516020818303038152906040529350505b508061442981615e30565b915050614278565b50600b8160405161444291906152c2565b9081526040519081900360200190205460ff16156144785761447086868661446b876001615c95565b61424e565b915050613098565b95945050505050565b61448c848484613562565b614498848484846146c0565b610c275760405162461bcd60e51b815260040161072390615607565b6001600160e01b031981166301ffc9a760e01b14919050565b6144d88383836107db565b6001600160a01b0383166144f4576144ef816147d8565b614517565b816001600160a01b0316836001600160a01b03161461451757614517838261481c565b6001600160a01b0382166145335761452e816148b9565b6107db565b826001600160a01b0316826001600160a01b0316146107db576107db8282614992565b6001600160a01b03821661457c5760405162461bcd60e51b815260040161072390615847565b61458581613456565b156145a25760405162461bcd60e51b815260040161072390615659565b6145ae600083836144cd565b6001600160a01b03821660009081526003602052604081208054600192906145d7908490615c95565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60005b6001600160a01b0383166000908152601060205260409020548110156107db576001600160a01b038316600090815260106020526040902080548391908390811061469357634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156146ae576146ae83826149d6565b806146b881615e15565b915050614638565b60006146d4846001600160a01b0316613d32565b156147d057836001600160a01b031663150b7a026146f0613473565b8786866040518563ffffffff1660e01b81526004016147129493929190615445565b602060405180830381600087803b15801561472c57600080fd5b505af192505050801561475c575060408051601f3d908101601f1916820190925261475991810190614f3a565b60015b6147b6573d80801561478a576040519150601f19603f3d011682016040523d82523d6000602084013e61478f565b606091505b5080516147ae5760405162461bcd60e51b815260040161072390615607565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613098565b506001613098565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161482984610dac565b6148339190615d79565b600083815260076020526040902054909150808214614886576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906148cb90600190615d79565b6000838152600960205260408120546008805493945090928490811061490157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061493057634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061497657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061499d83610dac565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821660009081526010602052604090205481106149fa576108be565b805b6001600160a01b038316600090815260106020526040902054614a2190600190615d79565b811015614ad6576001600160a01b0383166000908152601060205260409020614a4b826001615c95565b81548110614a6957634e487b7160e01b600052603260045260246000fd5b906000526020600020015460106000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110614ab857634e487b7160e01b600052603260045260246000fd5b60009182526020909120015580614ace81615e15565b9150506149fc565b506001600160a01b0382166000908152601060205260409020805480614b0c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050565b828054614b3290615dda565b90600052602060002090601f016020900481019282614b545760008555614b9a565b82601f10614b6d57805160ff1916838001178555614b9a565b82800160010185558215614b9a579182015b82811115614b9a578251825591602001919060010190614b7f565b50614ba6929150614bee565b5090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b5b80821115614ba65760008155600101614bef565b6000614c16614c1184615c50565b615c26565b9050828152838383011115614c2a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461064057600080fd5b60008083601f840112614c69578182fd5b50813567ffffffffffffffff811115614c80578182fd5b602083019150836020808302850101111561424757600080fd5b8035801515811461064057600080fd5b80356002811061064057600080fd5b8035600a811061064057600080fd5b600082601f830112614cd8578081fd5b614ce783833560208501614c03565b9392505050565b600060208284031215614cff578081fd5b614ce782614c41565b60008060408385031215614d1a578081fd5b614d2383614c41565b9150614d3160208401614c41565b90509250929050565b600080600060608486031215614d4e578081fd5b614d5784614c41565b9250614d6560208501614c41565b9150604084013590509250925092565b60008060008060808587031215614d8a578081fd5b614d9385614c41565b9350614da160208601614c41565b925060408501359150606085013567ffffffffffffffff811115614dc3578182fd5b8501601f81018713614dd3578182fd5b614de287823560208401614c03565b91505092959194509250565b60008060408385031215614e00578182fd5b614e0983614c41565b9150614d3160208401614c9a565b60008060408385031215614e29578182fd5b614e3283614c41565b9150602083013567ffffffffffffffff811115614e4d578182fd5b614e5985828601614cc8565b9150509250929050565b60008060408385031215614e75578182fd5b614e7e83614c41565b946020939093013593505050565b60008060208385031215614e9e578182fd5b823567ffffffffffffffff811115614eb4578283fd5b614ec085828601614c58565b90969095509350505050565b600080600060408486031215614ee0578081fd5b833567ffffffffffffffff811115614ef6578182fd5b614f0286828701614c58565b9094509250614f15905060208501614caa565b90509250925092565b600060208284031215614f2f578081fd5b8135614ce781615ec7565b600060208284031215614f4b578081fd5b8151614ce781615ec7565b600060208284031215614f67578081fd5b614ce782614cb9565b600060208284031215614f81578081fd5b815167ffffffffffffffff811115614f97578182fd5b8201601f81018413614fa7578182fd5b8051614fb5614c1182615c50565b818152856020838501011115614fc9578384fd5b614478826020830160208601615d90565b600060208284031215614feb578081fd5b815161ffff81168114614ce7578182fd5b60006020828403121561500d578081fd5b5035919050565b60008060408385031215615026578182fd5b8235915060208084013567ffffffffffffffff80821115615045578384fd5b818601915086601f830112615058578384fd5b81358181111561506a5761506a615eb1565b6150778485830201615c26565b81815284810190848601875b8481101561513457813587016080818e03601f190112156150a257898afd5b6150ac6080615c26565b89820135888111156150bc578b8cfd5b6150ca8f8c83860101614cc8565b8252506040820135888111156150de578b8cfd5b6150ec8f8c83860101614cc8565b8b83015250606082013588811115615102578b8cfd5b6151108f8c83860101614cc8565b60408301525060809190910135606082015284529287019290870190600101615083565b50979a909950975050505050505050565b60008060408385031215615157578182fd5b82359150614d3160208401614caa565b600080600080600060a0868803121561517e578283fd5b8535945061518e60208701614cb9565b935061519c60408701614c9a565b92506151aa60608701614c9a565b91506151b860808701614c9a565b90509295509295909350565b6000806000606084860312156151d8578081fd5b83359250602084013567ffffffffffffffff8111156151f5578182fd5b61520186828701614cc8565b925050604084013590509250925092565b60008060408385031215615224578182fd5b50508035926020909101359150565b6000815180845261524b816020860160208601615d90565b601f01601f19169290920160200192915050565b61ffff169052565b60ff169052565b6001600160601b0319606093841b811682529190921b16601482015260280190565b60609590951b6001600160601b0319168552601485019390935260348401919091526054830152607482015260940190565b600082516152d4818460208701615d90565b9190910192915050565b600083516152f0818460208801615d90565b835190830190615304818360208801615d90565b01949350505050565b600080835461531b81615dda565b60018281168015615333576001811461534457615370565b60ff19841687528287019450615370565b8786526020808720875b858110156153675781548a82015290840190820161534e565b50505082870194505b50929695505050505050565b6000600360fc1b82528451615398816001850160208901615d90565b8451908301906153af816001840160208901615d90565b84519101906153c5816001840160208801615d90565b0160010195945050505050565b6000603160f81b825282516153ee816001850160208701615d90565b9190910160010192915050565b95865260208601949094526040850192909252606090811b6001600160601b031916908401526074830152609482015260b40190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061547890830184615233565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526020840192909252604083015260ff16606082015260800190565b6001600160a01b03841681526001600160581b0383166020820152606081016002831061550157634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b6020808252825182820181905260009190848201906040850190845b818110156155475783518352928401929184019160010161552b565b50909695505050505050565b901515815260200190565b600060208252614ce76020830184615233565b6000608082526155846080830187615233565b82810360208401526155968187615233565b905082810360408401526155aa8186615233565b91505082606083015295945050505050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252600a90820152691b9bd8dbdb9d1c9858dd60b21b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b61ffff93909316835260ff919091166020830152604082015260600190565b90815260200190565b60006101208b835260208181850152615a568285018d615233565b915060408b818601528483036060860152828b548085528385019150838482028601018d8752848720875b83811015615b0e57601f19888403018552888254615a9e81615dda565b80865260018281168015615ab95760018114615acc57615af7565b60ff198416888d01528a88019450615af7565b868e528b8e208e5b84811015615aef5781548a82018f0152908301908d01615ad4565b89018d019550505b50978a019792955050509190910190600101615a81565b5050809650505050505050615b266080830188615267565b615b3360a0830187615267565b615b4060c0830186615267565b615b4d60e083018561525f565b615b5b61010083018461525f565b9a9950505050505050505050565b600084825260606020830152615b826060830185615233565b9050826040830152949350505050565b60ff91909116815260200190565b60ff988916815296909716602087015261ffff948516604087015292841660608601529083166080850152821660a0840152811660c083015290911660e08201526101000190565b60ff9687168152948616602086015292909416604084015261ffff9081166060840152909216608082015263ffffffff90911660a082015260c00190565b60405181810167ffffffffffffffff81118282101715615c4857615c48615eb1565b604052919050565b600067ffffffffffffffff821115615c6a57615c6a615eb1565b50601f01601f191660200190565b600061ffff80831681851680830382111561530457615304615e85565b60008219821115615ca857615ca8615e85565b500190565b600060ff821660ff84168060ff03821115615cca57615cca615e85565b019392505050565b600061ffff80841680615ce757615ce7615e9b565b92169190910492915050565b600082615d0257615d02615e9b565b500490565b600061ffff80831681851681830481118215151615615d2857615d28615e85565b02949350505050565b6000816000190483118215151615615d4b57615d4b615e85565b500290565b600060ff821660ff84168160ff0481118215151615615d7157615d71615e85565b029392505050565b600082821015615d8b57615d8b615e85565b500390565b60005b83811015615dab578181015183820152602001615d93565b83811115610c275750506000910152565b600061ffff821680615dd057615dd0615e85565b6000190192915050565b600281046001821680615dee57607f821691505b60208210811415615e0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e2957615e29615e85565b5060010190565b600060ff821660ff811415615e4757615e47615e85565b60010192915050565b600061ffff80841680615e6557615e65615e9b565b92169190910692915050565b600082615e8057615e80615e9b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114613d2f57600080fdfea2646970667358221220ce83a5bbd7cc7ede16ac5f07661e645414294965de62b385a02020d9f71349e364736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102315760003560e01c80636ba4c13811610130578063a06ca511116100b8578063c87b56dd1161007c578063c87b56dd146104ed578063cd931e4014610500578063d93dfe8814610513578063e985e9c514610526578063f906751b1461053957610231565b8063a06ca5111461047c578063a22cb4651461048f578063b7c72c34146104a2578063b88d4fde146104b5578063bd9d6f2b146104c857610231565b80638129fc1c116100ff5780638129fc1c1461042a57806382ab890a146104325780638592b7781461044557806395d89b411461044d578063962b2df21461045557610231565b80636ba4c138146103e957806370a08231146103fc57806376f0d51a1461040f578063787a08a61461042257610231565b80632f745c59116101be57806347fdf3271161018257806347fdf3271461038a5780634f6ccce71461039d57806352eb7796146103b05780635b4c3546146103c35780636352211e146103d657610231565b80632f745c59146103195780632fb098d21461032c57806339518b5e1461034f57806342842e0e14610357578063438b63001461036a57610231565b8063095ea7b311610205578063095ea7b3146102a75780630d1657e8146102bc57806318160ddd146102de57806323b872dd146102f35780632cc844761461030657610231565b80625ea3071461023657806301ffc9a71461025f57806306fdde031461027f578063081812fc14610287575b600080fd5b610249610244366004614ffc565b61054c565b604051610256919061555e565b60405180910390f35b61027261026d366004614f1e565b610645565b6040516102569190615553565b61024961066a565b61029a610295366004614ffc565b6106fc565b6040516102569190615431565b6102ba6102b5366004614e63565b610748565b005b6102cf6102ca366004614ffc565b6107e0565b604051610256939291906154c4565b6102e6610818565b6040516102569190615a32565b6102ba610301366004614d3a565b61081e565b6102ba610314366004614e17565b610856565b6102e6610327366004614e63565b6108c2565b61033f61033a366004615212565b610914565b6040516102569493929190615571565b6102e6610af9565b6102ba610365366004614d3a565b610b01565b61037d610378366004614cee565b610b1c565b604051610256919061550f565b6102ba610398366004614ecc565b610bda565b6102e66103ab366004614ffc565b610c2d565b61037d6103be366004614cee565b610c88565b6102e66103d13660046151c4565b610cf4565b61029a6103e4366004614ffc565b610d2b565b6102ba6103f7366004614e8c565b610d60565b6102e661040a366004614cee565b610dac565b6102ba61041d366004615145565b610df0565b6102e6610e8e565b6102ba610e94565b6102ba610440366004614ffc565b61208f565b6102e6612406565b610249612441565b610468610463366004614f56565b612450565b604051610256989796959493929190615ba0565b6102ba61048a366004615167565b6124ae565b6102ba61049d366004614dee565b612c86565b6102ba6104b0366004614ffc565b612d54565b6102ba6104c3366004614d75565b612ed1565b6104db6104d6366004614ffc565b612f0a565b60405161025696959493929190615be8565b6102496104fb366004614ffc565b612f58565b6102ba61050e366004614d08565b6130a0565b6102ba610521366004615014565b6130e5565b610272610534366004614d08565b61326c565b6102ba610547366004614ffc565b61329a565b6000818152600c602052604081208054606092919061056a90615dda565b80601f016020809104026020016040519081016040528092919081815260200182805461059690615dda565b80156105e35780601f106105b8576101008083540402835291602001916105e3565b820191906000526020600020905b8154815290600101906020018083116105c657829003601f168201915b505050505090506105f383610d2b565b6001600160a01b031661dead6001600160a01b0316141561063d5761061b816001600961331f565b60405160200161062b91906153d2565b60405160208183030381529060405290505b90505b919050565b60006001600160e01b0319821663780e9d6360e01b148061063d575061063d82613416565b60606000805461067990615dda565b80601f01602080910402602001604051908101604052809291908181526020018280546106a590615dda565b80156106f25780601f106106c7576101008083540402835291602001916106f2565b820191906000526020600020905b8154815290600101906020018083116106d557829003601f168201915b5050505050905090565b600061070782613456565b61072c5760405162461bcd60e51b81526004016107239061587c565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061075382610d2b565b9050806001600160a01b0316836001600160a01b031614156107875760405162461bcd60e51b815260040161072390615935565b806001600160a01b0316610799613473565b6001600160a01b031614806107b557506107b581610534613473565b6107d15760405162461bcd60e51b815260040161072390615757565b6107db8383613477565b505050565b600e602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60085490565b61082f610829613473565b826134e5565b61084b5760405162461bcd60e51b815260040161072390615976565b6107db838383613562565b601d546001600160a01b0316331461086d57600080fd5b6108be8261087e836008600961331f565b61088b846002600861331f565b610898856001600261331f565b6040516020016108aa9392919061537c565b60405160208183030381529060405261368f565b5050565b60006108cd83610dac565b82106108eb5760405162461bcd60e51b8152600401610723906155bc565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a602052816000526040600020818154811061093057600080fd5b90600052602060002090600402016000915091505080600001805461095490615dda565b80601f016020809104026020016040519081016040528092919081815260200182805461098090615dda565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050908060010180546109e290615dda565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90615dda565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b505050505090806002018054610a7090615dda565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615dda565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b5050505050908060030154905084565b63617f1ff081565b6107db83838360405180602001604052806000815250612ed1565b60606000610b2983610dac565b905060008167ffffffffffffffff811115610b5457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50905060005b82811015610bd257610b9585826108c2565b828281518110610bb557634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610bca81615e15565b915050610b83565b509392505050565b60005b82811015610c2757610c15848483818110610c0857634e487b7160e01b600052603260045260246000fd5b9050602002013583610df0565b80610c1f81615e15565b915050610bdd565b50505050565b6000610c37610818565b8210610c555760405162461bcd60e51b8152600401610723906159c7565b60088281548110610c7657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6001600160a01b038116600090815260106020908152604091829020805483518184028101840190945280845260609392830182828015610ce857602002820191906000526020600020905b815481526020019060010190808311610cd4575b50505050509050919050565b6000838383604051602001610d0b93929190615b69565b60408051601f198184030181529190528051602090910120949350505050565b6000818152600260205260408120546001600160a01b03168061063d5760405162461bcd60e51b8152600401610723906157fe565b60005b818110156107db57610d9a838383818110610d8e57634e487b7160e01b600052603260045260246000fd5b90506020020135613b0f565b80610da481615e15565b915050610d63565b60006001600160a01b038216610dd45760405162461bcd60e51b8152600401610723906157b4565b506001600160a01b031660009081526003602052604090205490565b8133610dfb82610d2b565b6001600160a01b03161480610e2657506000818152600e60205260409020546001600160a01b031633145b610e2f57600080fd5b610e3833613d32565b15610e555760405162461bcd60e51b815260040161072390615911565b3341604051602001610e6892919061526e565b60408051601f198184030181529190528051602090910120601f556107db833384613d38565b61025881565b601e546001600160a01b03163314610eab57600080fd5b6000604051806101000160405280600160ff168152602001600360ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001601260ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601e60ff168152602001603060ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280602d60ff168152602001604960ff168152602001600061ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600860ff168152602001600d60ff168152602001601961ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280600f60ff168152602001601c60ff168152602001603261ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601460ff168152602001602b60ff168152602001604b61ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280601e60ff168152602001603f60ff168152602001606461ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280602d60ff168152602001605860ff168152602001609661ffff1681526020016103e861ffff16815260200161032061ffff168152602001609661ffff168152602001603261ffff168152602001600061ffff1681525090506000604051806101000160405280603460ff168152602001606460ff16815260200161012c61ffff168152602001600a61ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815250905089600f60008060098111156112cb57634e487b7160e01b600052602160045260246000fd5b60098111156112ea57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505088600f60006003600981111561143557634e487b7160e01b600052602160045260246000fd5b600981111561145457634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505087600f60006007600981111561159f57634e487b7160e01b600052602160045260246000fd5b60098111156115be57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505086600f60006004600981111561170957634e487b7160e01b600052602160045260246000fd5b600981111561172857634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505085600f60006001600981111561187357634e487b7160e01b600052602160045260246000fd5b600981111561189257634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505084600f6000600260098111156119dd57634e487b7160e01b600052602160045260246000fd5b60098111156119fc57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505083600f600060066009811115611b4757634e487b7160e01b600052602160045260246000fd5b6009811115611b6657634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505082600f600060056009811115611cb157634e487b7160e01b600052602160045260246000fd5b6009811115611cd057634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505081600f600060086009811115611e1b57634e487b7160e01b600052602160045260246000fd5b6009811115611e3a57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548161ffff021916908361ffff16021790555060808201518160000160066101000a81548161ffff021916908361ffff16021790555060a08201518160000160086101000a81548161ffff021916908361ffff16021790555060c082015181600001600a6101000a81548161ffff021916908361ffff16021790555060e082015181600001600c6101000a81548161ffff021916908361ffff16021790555090505080600f6000600980811115611f8457634e487b7160e01b600052602160045260246000fd5b6009811115611fa357634e487b7160e01b600052602160045260246000fd5b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff1990981660ff9586161761ff00191661010095909716949094029590951763ffff000019166201000061ffff938416021765ffff000000001916640100000000918316919091021767ffff0000000000001916600160301b948216949094029390931761ffff60401b1916600160401b918416919091021761ffff60501b1916600160501b948316949094029390931761ffff60601b1916600160601b919092160217905550505050505050505050565b803361209a82610d2b565b6001600160a01b031614806120c557506000818152600e60205260409020546001600160a01b031633145b6120ce57600080fd5b6120d733613d32565b156120f45760405162461bcd60e51b815260040161072390615911565b334160405160200161210792919061526e565b60408051808303601f190181528282528051602091820120601f556000858152600d9091522054631d9ffc1d60e31b8252600a9173d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e89161216c91610100900460ff1690600401615b92565b60206040518083038186803b15801561218457600080fd5b505af4158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc9190614fda565b61ffff16106121ca57600080fd5b621275006121dc63617f1ff042615d79565b10156121e757600080fd5b6040805161010080820183527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760395460ff8082168085529282041660208085019190915261ffff620100008304811685870152640100000000830481166060860152600160301b830481166080860152600160401b8304811660a0860152600160501b8304811660c0860152600160601b909204821660e08501526000878152600d90915293909320549192630100000090920490911610156122a857600080fd5b601c5460408201516001600160a01b03909116906379cc67909033906122da9061ffff16670de0b6b3a7640000615d31565b6040518363ffffffff1660e01b81526004016122f7929190615482565b600060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b5050505061233283613b0f565b60096000908152600f6020527f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398054640100000000900461ffff1690600461237983615dbc565b82546101009290920a61ffff8181021990931691909216919091021790556000858152600d60205260409020805466ffff00000000001916651e000000000017905590506123c8816028615cad565b6000948552600d6020526040909420805462ff000019166201000060ff9096169586021761ff00191661010086021760ff1916909417909355505050565b600033424442601f54604051602001612423959493929190615290565b6040516020818303038152906040528051906020012060001c905090565b60606001805461067990615dda565b600f6020526000908152604090205460ff8082169161010081049091169061ffff6201000082048116916401000000008104821691600160301b8204811691600160401b8104821691600160501b8204811691600160601b90041688565b84336124b982610d2b565b6001600160a01b031614806124e457506000818152600e60205260409020546001600160a01b031633145b6124ed57600080fd5b6124f633613d32565b156125135760405162461bcd60e51b815260040161072390615911565b334160405160200161252692919061526e565b60408051808303601f190181529181528151602092830120601f556000888152600e909252902054600160a01b90046001600160581b031642101561256a57600080fd5b600985600981111561258c57634e487b7160e01b600052602160045260246000fd5b141561259757600080fd5b6000868152600e602052604090205442600160a01b9091046001600160581b031610156125c7576125c786613b0f565b60006125d1612406565b90506000600f60008860098111156125f957634e487b7160e01b600052602160045260246000fd5b600981111561261857634e487b7160e01b600052602160045260246000fd5b81526020808201929092526040908101600090812082516101008082018552915460ff808216808452938204168287015261ffff620100008204811683870152640100000000820481166060840152600160301b820481166080840152600160401b8204811660a0840152600160501b8204811660c0840152600160601b909104811660e08301528d8452600d9095529290912054919350630100000090910490911610156126c657600080fd5b604081015161ffff161561277257621275006126e663617f1ff042615d79565b116126f057600080fd5b601c5460408201516001600160a01b03909116906379cc67909033906127229061ffff16670de0b6b3a7640000615d31565b6040518363ffffffff1660e01b815260040161273f929190615482565b600060405180830381600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050505b600086156127d6576127ac826127a785604051806040016040528060068152602001650908a8298a8960d31b8152508d610cf4565b6140ab565b909250905060ff8116156127d6576000898152600d60205260409020805460ff191660ff83161790555b851561283a5761280b826127a78560405180604001604052806008815260200167414343555241435960c01b8152508d610cf4565b909250905060ff81161561283a576000898152600d60205260409020805461ff00191661010060ff8416021790555b841561289f5761286e826127a78560405180604001604052806007815260200166444546454e534560c81b8152508d610cf4565b909250905060ff81161561289f576000898152600d60205260409020805462ff000019166201000060ff8416021790555b60018860098111156128c157634e487b7160e01b600052602160045260246000fd5b11156129ec5781600f60008a60098111156128ec57634e487b7160e01b600052602160045260246000fd5b600981111561290b57634e487b7160e01b600052602160045260246000fd5b815260208082019290925260409081016000208351815493850151928501516060860151608087015160a088015160c089015160e09099015160ff1990981660ff9586161761ff00191661010095909716949094029590951763ffff000019166201000061ffff938416021765ffff000000001916640100000000918316919091021767ffff0000000000001916600160301b948216949094029390931761ffff60401b1916600160401b918416919091021761ffff60501b1916600160501b948316949094029390931761ffff60601b1916600160601b91909216021790555b6000898152600d60209081526040808320815160c081018352905460ff808216835261010082048116948301949094526201000081049093168183018190526301000000840461ffff9081166060840152600160281b8504166080830152600160381b90930463ffffffff1660a08201529051631d9ffc1d60e31b815290929173d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612a9491600401615b92565b60206040518083038186803b158015612aac57600080fd5b505af4158015612ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae49190614fda565b6020830151604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612b1f9190600401615b92565b60206040518083038186803b158015612b3757600080fd5b505af4158015612b4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6f9190614fda565b8351604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929163ecffe0e891612ba79190600401615b92565b60206040518083038186803b158015612bbf57600080fd5b505af4158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614fda565b612c019190615c78565b612c0b9190615c78565b60008c8152600d60205260409020805466ffff00000000001916600160281b61ffff8416021790559050612c4161025842615c95565b60009b8c52600e6020526040909b2080546001600160581b039c909c16600160a01b02600160a01b600160f81b0319909c169b909b17909a5550505050505050505050565b612c8e613473565b6001600160a01b0316826001600160a01b03161415612cbf5760405162461bcd60e51b8152600401610723906156d4565b8060056000612ccc613473565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612d10613473565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d489190615553565b60405180910390a35050565b8033612d5f82610d2b565b6001600160a01b03161480612d8a57506000818152600e60205260409020546001600160a01b031633145b612d9357600080fd5b612d9c33613d32565b15612db95760405162461bcd60e51b815260040161072390615911565b3341604051602001612dcc92919061526e565b60408051601f19818403018152908290528051602090910120601f55601c5463079cc67960e41b82526001600160a01b0316906379cc679090612e1e9033906801a055690d9db8000090600401615482565b600060405180830381600087803b158015612e3857600080fd5b505af1158015612e4c573d6000803e3d6000fd5b50505050612e65612e5c8361054c565b8333600061424e565b6000838152600c602090815260409091208251612e889391929190910190614b26565b506001600b600c6000858152602001908152602001600020604051612ead919061530d565b908152604051908190036020019020805491151560ff199092169190911790555050565b612ee2612edc613473565b836134e5565b612efe5760405162461bcd60e51b815260040161072390615976565b610c2784848484614481565b600d6020526000908152604090205460ff808216916101008104821691620100008204169061ffff63010000008204811691600160281b81049091169063ffffffff600160381b9091041686565b6060612f6382613456565b612f6c57600080fd5b6000828152600d60209081526040808320815160c081018352905460ff80821683526101008204811694830194909452620100008104909316918101919091526301000000820461ffff9081166060830152600160281b8304166080820152600160381b90910463ffffffff1660a082015290612fe88461054c565b825160208401516040808601516060870151608088015192516301798e3960e01b815295965073d27ac9227d30d75a27779f1cabbb68dd965cd992956301798e3995613044958c958a95600a9560139591929091600401615a3b565b60006040518083038186803b15801561305c57600080fd5b505af4158015613070573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130989190810190614f70565b949350505050565b601e546001600160a01b031633146130b757600080fd5b601c80546001600160a01b039384166001600160a01b031991821617909155601d8054929093169116179055565b601e546001600160a01b031633146130fc57600080fd5b60005b81518110156107db57600a6000848152602001908152602001600020604051806080016040528084848151811061314657634e487b7160e01b600052603260045260246000fd5b602002602001015160000151815260200184848151811061317757634e487b7160e01b600052603260045260246000fd5b60200260200101516020015181526020018484815181106131a857634e487b7160e01b600052603260045260246000fd5b60200260200101516040015181526020018484815181106131d957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151606001519091528254600181018455600093845292819020825180519394600402909101926132179284920190614b26565b5060208281015180516132309260018501920190614b26565b506040820151805161324c916002840191602090910190614b26565b50606082015181600301555050808061326490615e15565b9150506130ff565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b601e546001600160a01b031633146132b157600080fd5b60005b818110156108be5760006132c6610818565b9050603281106132d557600080fd5b61330c336133076040518060400160405280600981526020016830313131313131313160b81b8152508433600061424e565b61368f565b508061331781615e15565b9150506132b4565b606083600061332e8585615d79565b67ffffffffffffffff81111561335457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561337e576020820181803683370190505b509050845b8481101561340c578281815181106133ab57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826133c58884615d79565b815181106133e357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061340481615e15565b915050613383565b5095945050505050565b60006001600160e01b031982166380ac58cd60e01b148061344757506001600160e01b03198216635b5e139f60e01b145b8061063d575061063d826144b4565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906134ac82610d2b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006134f082613456565b61350c5760405162461bcd60e51b81526004016107239061570b565b600061351783610d2b565b9050806001600160a01b0316846001600160a01b031614806135525750836001600160a01b0316613547846106fc565b6001600160a01b0316145b806130985750613098818561326c565b826001600160a01b031661357582610d2b565b6001600160a01b03161461359b5760405162461bcd60e51b8152600401610723906158c8565b6001600160a01b0382166135c15760405162461bcd60e51b815260040161072390615690565b6135cc8383836144cd565b6135d7600082613477565b6001600160a01b0383166000908152600360205260408120805460019290613600908490615d79565b90915550506001600160a01b038216600090815260036020526040812080546001929061362e908490615c95565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613699612406565b905060006136a5610818565b6000818152600c60209081526040909120855192935083926136c992870190614b26565b506001600b600c60008481526020019081526020016000206040516136ee919061530d565b908152604051908190036020019020805491151560ff199092169190911790556000808080613720606461ffff615cd2565b61372b906050615d07565b61ffff1690506000606461ffff6137429190615cd2565b61374d90605f615d07565b61ffff169050600061377e89604051806040016040528060068152602001650908a8298a8960d31b81525089610cf4565b9050828161ffff16106137a657613796600482615e50565b6137a1906005615c78565b6137a9565b60005b955060006137d88a60405180604001604052806008815260200167414343555241435960c01b8152508a610cf4565b9050838161ffff1610613800576137f0600482615e50565b6137fb906005615c78565b613803565b60005b945060006138318b60405180604001604052806007815260200166444546454e534560c81b8152508b610cf4565b9050838161ffff161061385957613849600482615e50565b613854906005615c78565b61386f565b613864600482615e50565b61386f906001615c78565b965050505050506138808885614556565b604051631d9ffc1d60e31b815260009073d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e8906138ba908590600401615b92565b60206040518083038186803b1580156138d257600080fd5b505af41580156138e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390a9190614fda565b604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e890613941908790600401615b92565b60206040518083038186803b15801561395957600080fd5b505af415801561396d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139919190614fda565b604051631d9ffc1d60e31b815273d27ac9227d30d75a27779f1cabbb68dd965cd9929063ecffe0e8906139c8908990600401615b92565b60206040518083038186803b1580156139e057600080fd5b505af41580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614fda565b613a229190615c78565b613a2c9190615c78565b6040805160c08101825260ff9687168152948616602080870191825294871686830190815260006060880181815261ffff95861660808a0190815260a08a018381529b8352600d909852939020965187549251915193519651995160ff199093169089161761ff001916610100918916919091021762ff000019166201000092909716919091029590951764ffff00000019166301000000938216939093029290921766ffff00000000001916600160281b95909216949094021763ffffffff60381b1916600160381b63ffffffff909316929092029190911790555050505050565b613b1833613d32565b15613b355760405162461bcd60e51b815260040161072390615911565b3341604051602001613b4892919061526e565b60408051808303601f190181528282528051602091820120601f556000848152600e825282812060608501845280546001600160a01b0381168652600160a01b81046001600160581b031693860193909352909392909190830190600160f81b900460ff166001811115613bcc57634e487b7160e01b600052602160045260246000fd5b6001811115613beb57634e487b7160e01b600052602160045260246000fd5b81525050905080602001516001600160581b03164211613c0b5750613d2f565b600081602001516001600160581b031642613c269190615d79565b9050600182604001516001811115613c4e57634e487b7160e01b600052602160045260246000fd5b1415613cfc57600062015180613c6683610bb8615d31565b613c709190615cf3565b9050613c7e6103e882615e71565b6000858152600d60205260409020805463ffffffff60381b191661ffff92909216600160381b02919091179055613cb76103e882615cf3565b6000858152600d602052604090208054600390613ce09084906301000000900461ffff16615c78565b92506101000a81548161ffff021916908361ffff160217905550505b50506000818152600e602052604090208054600160a01b600160f81b031916600160a01b426001600160581b0316021790555b50565b3b151590565b6000838152600e60209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166001811115613da557634e487b7160e01b600052602160045260246000fd5b6001811115613dc457634e487b7160e01b600052602160045260246000fd5b9052509050816001811115613de957634e487b7160e01b600052602160045260246000fd5b81604001516001811115613e0d57634e487b7160e01b600052602160045260246000fd5b1415613e1857600080fd5b600081602001516001600160581b03164211613e415781602001516001600160581b0316613e43565b425b9050600082604001516001811115613e6b57634e487b7160e01b600052602160045260246000fd5b1415613eac57613e7c843087613562565b6001600160a01b038416600090815260106020908152604082208054600181018255908352912001859055613ef6565b81602001516001600160581b0316421115613eca57613eca85613b0f565b81602001516001600160581b0316816001600160581b031611613ef1578160200151613ef3565b805b90505b600080846001811115613f1957634e487b7160e01b600052602160045260246000fd5b14613f245784613f27565b60005b90506000846001811115613f4b57634e487b7160e01b600052602160045260246000fd5b1415613f6657613f5c308688613562565b613f668587614635565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856001811115613faf57634e487b7160e01b600052602160045260246000fd5b90526000878152600e602090815260409182902083518154928501516001600160581b0316600160a01b02600160a01b600160f81b03196001600160a01b039092166001600160a01b031990941693909317169190911780825591830151909182906001600160f81b0316600160f81b83600181111561403f57634e487b7160e01b600052602160045260246000fd5b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c03685874287600181111561408b57634e487b7160e01b600052602160045260246000fd5b60405161409b949392919061549b565b60405180910390a1505050505050565b6140b3614baa565b6000808460600180518091906140c890615dbc565b61ffff9081169091526140dc911685615e71565b90508460c001518560a0015186608001516140f79190615c78565b6141019190615c78565b61ffff168111801561412c575060e08501805160009161412082615dbc565b61ffff90811690915216115b1561417a576020850151614141906003615cad565b61414c906004615d50565b60ff1661415a600483615e71565b614165906001615c95565b61416f9190615c95565b915084925050614247565b8460a00151856080015161418e9190615c78565b61ffff16811180156141b9575060c0850180516000916141ad82615dbc565b61ffff90811690915216115b156141ce576020850151614141906002615cad565b846080015161ffff16811180156141fe575060a0850180516000916141f282615dbc565b61ffff90811690915216115b15614213576020850151614141906001615cad565b60808501805160009161422582615dbc565b61ffff90811690915216111561424557602085015161414c906004615d50565b505b9250929050565b6060600a821061425d57600080fd5b6040805180820190915260018152600360fc1b602082015260005b60088160ff161015614431576012805490600061429483615e15565b91905055506000606442448989896012546040516020016142ba969594939291906153fb565b6040516020818303038152906040528051906020012060001c6142dd9190615e71565b9050601e8161ffff16111561432f57826143088960ff8516614300866001615cad565b60ff1661331f565b6040516020016143199291906152de565b604051602081830303815290604052925061441e565b6012805490600061433f83615e15565b9190505550600061271061435d614354612406565b86601254610cf4565b6143679190615e71565b90508373d27ac9227d30d75a27779f1cabbb68dd965cd99263ee3a84da838660146040518463ffffffff1660e01b81526004016143a693929190615a13565b60006040518083038186803b1580156143be57600080fd5b505af41580156143d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143fa9190810190614f70565b60405160200161440b9291906152de565b6040516020818303038152906040529350505b508061442981615e30565b915050614278565b50600b8160405161444291906152c2565b9081526040519081900360200190205460ff16156144785761447086868661446b876001615c95565b61424e565b915050613098565b95945050505050565b61448c848484613562565b614498848484846146c0565b610c275760405162461bcd60e51b815260040161072390615607565b6001600160e01b031981166301ffc9a760e01b14919050565b6144d88383836107db565b6001600160a01b0383166144f4576144ef816147d8565b614517565b816001600160a01b0316836001600160a01b03161461451757614517838261481c565b6001600160a01b0382166145335761452e816148b9565b6107db565b826001600160a01b0316826001600160a01b0316146107db576107db8282614992565b6001600160a01b03821661457c5760405162461bcd60e51b815260040161072390615847565b61458581613456565b156145a25760405162461bcd60e51b815260040161072390615659565b6145ae600083836144cd565b6001600160a01b03821660009081526003602052604081208054600192906145d7908490615c95565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60005b6001600160a01b0383166000908152601060205260409020548110156107db576001600160a01b038316600090815260106020526040902080548391908390811061469357634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156146ae576146ae83826149d6565b806146b881615e15565b915050614638565b60006146d4846001600160a01b0316613d32565b156147d057836001600160a01b031663150b7a026146f0613473565b8786866040518563ffffffff1660e01b81526004016147129493929190615445565b602060405180830381600087803b15801561472c57600080fd5b505af192505050801561475c575060408051601f3d908101601f1916820190925261475991810190614f3a565b60015b6147b6573d80801561478a576040519150601f19603f3d011682016040523d82523d6000602084013e61478f565b606091505b5080516147ae5760405162461bcd60e51b815260040161072390615607565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613098565b506001613098565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161482984610dac565b6148339190615d79565b600083815260076020526040902054909150808214614886576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906148cb90600190615d79565b6000838152600960205260408120546008805493945090928490811061490157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061493057634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061497657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061499d83610dac565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821660009081526010602052604090205481106149fa576108be565b805b6001600160a01b038316600090815260106020526040902054614a2190600190615d79565b811015614ad6576001600160a01b0383166000908152601060205260409020614a4b826001615c95565b81548110614a6957634e487b7160e01b600052603260045260246000fd5b906000526020600020015460106000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110614ab857634e487b7160e01b600052603260045260246000fd5b60009182526020909120015580614ace81615e15565b9150506149fc565b506001600160a01b0382166000908152601060205260409020805480614b0c57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050565b828054614b3290615dda565b90600052602060002090601f016020900481019282614b545760008555614b9a565b82601f10614b6d57805160ff1916838001178555614b9a565b82800160010185558215614b9a579182015b82811115614b9a578251825591602001919060010190614b7f565b50614ba6929150614bee565b5090565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b5b80821115614ba65760008155600101614bef565b6000614c16614c1184615c50565b615c26565b9050828152838383011115614c2a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461064057600080fd5b60008083601f840112614c69578182fd5b50813567ffffffffffffffff811115614c80578182fd5b602083019150836020808302850101111561424757600080fd5b8035801515811461064057600080fd5b80356002811061064057600080fd5b8035600a811061064057600080fd5b600082601f830112614cd8578081fd5b614ce783833560208501614c03565b9392505050565b600060208284031215614cff578081fd5b614ce782614c41565b60008060408385031215614d1a578081fd5b614d2383614c41565b9150614d3160208401614c41565b90509250929050565b600080600060608486031215614d4e578081fd5b614d5784614c41565b9250614d6560208501614c41565b9150604084013590509250925092565b60008060008060808587031215614d8a578081fd5b614d9385614c41565b9350614da160208601614c41565b925060408501359150606085013567ffffffffffffffff811115614dc3578182fd5b8501601f81018713614dd3578182fd5b614de287823560208401614c03565b91505092959194509250565b60008060408385031215614e00578182fd5b614e0983614c41565b9150614d3160208401614c9a565b60008060408385031215614e29578182fd5b614e3283614c41565b9150602083013567ffffffffffffffff811115614e4d578182fd5b614e5985828601614cc8565b9150509250929050565b60008060408385031215614e75578182fd5b614e7e83614c41565b946020939093013593505050565b60008060208385031215614e9e578182fd5b823567ffffffffffffffff811115614eb4578283fd5b614ec085828601614c58565b90969095509350505050565b600080600060408486031215614ee0578081fd5b833567ffffffffffffffff811115614ef6578182fd5b614f0286828701614c58565b9094509250614f15905060208501614caa565b90509250925092565b600060208284031215614f2f578081fd5b8135614ce781615ec7565b600060208284031215614f4b578081fd5b8151614ce781615ec7565b600060208284031215614f67578081fd5b614ce782614cb9565b600060208284031215614f81578081fd5b815167ffffffffffffffff811115614f97578182fd5b8201601f81018413614fa7578182fd5b8051614fb5614c1182615c50565b818152856020838501011115614fc9578384fd5b614478826020830160208601615d90565b600060208284031215614feb578081fd5b815161ffff81168114614ce7578182fd5b60006020828403121561500d578081fd5b5035919050565b60008060408385031215615026578182fd5b8235915060208084013567ffffffffffffffff80821115615045578384fd5b818601915086601f830112615058578384fd5b81358181111561506a5761506a615eb1565b6150778485830201615c26565b81815284810190848601875b8481101561513457813587016080818e03601f190112156150a257898afd5b6150ac6080615c26565b89820135888111156150bc578b8cfd5b6150ca8f8c83860101614cc8565b8252506040820135888111156150de578b8cfd5b6150ec8f8c83860101614cc8565b8b83015250606082013588811115615102578b8cfd5b6151108f8c83860101614cc8565b60408301525060809190910135606082015284529287019290870190600101615083565b50979a909950975050505050505050565b60008060408385031215615157578182fd5b82359150614d3160208401614caa565b600080600080600060a0868803121561517e578283fd5b8535945061518e60208701614cb9565b935061519c60408701614c9a565b92506151aa60608701614c9a565b91506151b860808701614c9a565b90509295509295909350565b6000806000606084860312156151d8578081fd5b83359250602084013567ffffffffffffffff8111156151f5578182fd5b61520186828701614cc8565b925050604084013590509250925092565b60008060408385031215615224578182fd5b50508035926020909101359150565b6000815180845261524b816020860160208601615d90565b601f01601f19169290920160200192915050565b61ffff169052565b60ff169052565b6001600160601b0319606093841b811682529190921b16601482015260280190565b60609590951b6001600160601b0319168552601485019390935260348401919091526054830152607482015260940190565b600082516152d4818460208701615d90565b9190910192915050565b600083516152f0818460208801615d90565b835190830190615304818360208801615d90565b01949350505050565b600080835461531b81615dda565b60018281168015615333576001811461534457615370565b60ff19841687528287019450615370565b8786526020808720875b858110156153675781548a82015290840190820161534e565b50505082870194505b50929695505050505050565b6000600360fc1b82528451615398816001850160208901615d90565b8451908301906153af816001840160208901615d90565b84519101906153c5816001840160208801615d90565b0160010195945050505050565b6000603160f81b825282516153ee816001850160208701615d90565b9190910160010192915050565b95865260208601949094526040850192909252606090811b6001600160601b031916908401526074830152609482015260b40190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061547890830184615233565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526020840192909252604083015260ff16606082015260800190565b6001600160a01b03841681526001600160581b0383166020820152606081016002831061550157634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b6020808252825182820181905260009190848201906040850190845b818110156155475783518352928401929184019160010161552b565b50909695505050505050565b901515815260200190565b600060208252614ce76020830184615233565b6000608082526155846080830187615233565b82810360208401526155968187615233565b905082810360408401526155aa8186615233565b91505082606083015295945050505050565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252600a90820152691b9bd8dbdb9d1c9858dd60b21b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b61ffff93909316835260ff919091166020830152604082015260600190565b90815260200190565b60006101208b835260208181850152615a568285018d615233565b915060408b818601528483036060860152828b548085528385019150838482028601018d8752848720875b83811015615b0e57601f19888403018552888254615a9e81615dda565b80865260018281168015615ab95760018114615acc57615af7565b60ff198416888d01528a88019450615af7565b868e528b8e208e5b84811015615aef5781548a82018f0152908301908d01615ad4565b89018d019550505b50978a019792955050509190910190600101615a81565b5050809650505050505050615b266080830188615267565b615b3360a0830187615267565b615b4060c0830186615267565b615b4d60e083018561525f565b615b5b61010083018461525f565b9a9950505050505050505050565b600084825260606020830152615b826060830185615233565b9050826040830152949350505050565b60ff91909116815260200190565b60ff988916815296909716602087015261ffff948516604087015292841660608601529083166080850152821660a0840152811660c083015290911660e08201526101000190565b60ff9687168152948616602086015292909416604084015261ffff9081166060840152909216608082015263ffffffff90911660a082015260c00190565b60405181810167ffffffffffffffff81118282101715615c4857615c48615eb1565b604052919050565b600067ffffffffffffffff821115615c6a57615c6a615eb1565b50601f01601f191660200190565b600061ffff80831681851680830382111561530457615304615e85565b60008219821115615ca857615ca8615e85565b500190565b600060ff821660ff84168060ff03821115615cca57615cca615e85565b019392505050565b600061ffff80841680615ce757615ce7615e9b565b92169190910492915050565b600082615d0257615d02615e9b565b500490565b600061ffff80831681851681830481118215151615615d2857615d28615e85565b02949350505050565b6000816000190483118215151615615d4b57615d4b615e85565b500290565b600060ff821660ff84168160ff0481118215151615615d7157615d71615e85565b029392505050565b600082821015615d8b57615d8b615e85565b500390565b60005b83811015615dab578181015183820152602001615d93565b83811115610c275750506000910152565b600061ffff821680615dd057615dd0615e85565b6000190192915050565b600281046001821680615dee57607f821691505b60208210811415615e0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e2957615e29615e85565b5060010190565b600060ff821660ff811415615e4757615e47615e85565b60010192915050565b600061ffff80841680615e6557615e65615e9b565b92169190910692915050565b600082615e8057615e80615e9b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114613d2f57600080fdfea2646970667358221220ce83a5bbd7cc7ede16ac5f07661e645414294965de62b385a02020d9f71349e364736f6c63430008000033

Libraries Used

ZombieCatsLibrary : 0xd27ac9227d30d75a27779f1cabbb68dd965cd992Unverified

Deployed Bytecode Sourcemap

56018:23848:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77510:560;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33676:224;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20798:100::-;;;:::i;22357:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21880:411::-;;;;;;:::i;:::-;;:::i;:::-;;56719:47;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;34316:113::-;;;:::i;:::-;;;;;;;:::i;23247:339::-;;;;;;:::i;:::-;;:::i;73714:1044::-;;;;;;:::i;:::-;;:::i;33984:256::-;;;;;;:::i;:::-;;:::i;56248:63::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;59084:50::-;;;:::i;23657:185::-;;;;;;:::i;:::-;;:::i;78238:380::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63871:213::-;;;;;;:::i;:::-;;:::i;34506:233::-;;;;;;:::i;:::-;;:::i;68653:162::-;;;;;;:::i;:::-;;:::i;64885:172::-;;;;;;:::i;:::-;;:::i;20492:239::-;;;;;;:::i;:::-;;:::i;64713:164::-;;;;;;:::i;:::-;;:::i;20222:208::-;;;;;;:::i;:::-;;:::i;63725:138::-;;;;;;:::i;:::-;;:::i;56604:46::-;;;:::i;59662:2550::-;;;:::i;67994:651::-;;;;;;:::i;:::-;;:::i;65065:195::-;;;:::i;20967:104::-;;;:::i;56773:46::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;66166:1819::-;;;;;;:::i;:::-;;:::i;22650:295::-;;;;;;:::i;:::-;;:::i;75347:447::-;;;;;;:::i;:::-;;:::i;23913:328::-;;;;;;:::i;:::-;;:::i;56659:53::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;76711:665::-;;;;;;:::i;:::-;;:::i;79463:233::-;;;;;;:::i;:::-;;:::i;78773:492::-;;;;;;:::i;:::-;;:::i;23016:164::-;;;;;;:::i;:::-;;:::i;74901:340::-;;;;;;:::i;:::-;;:::i;77510:560::-;77631:23;77657;;;:13;:23;;;;;77631:49;;77600:13;;77631:23;77657;77631:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77762:17;77770:8;77762:7;:17::i;:::-;-1:-1:-1;;;;;77762:63:0;77783:42;-1:-1:-1;;;;;77762:63:0;;77758:276;;;77944:44;77972:9;77983:1;77986;77944:27;:44::i;:::-;77879:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;77842:180;;77758:276;78053:9;-1:-1:-1;77510:560:0;;;;:::o;33676:224::-;33778:4;-1:-1:-1;;;;;;33802:50:0;;-1:-1:-1;;;33802:50:0;;:90;;;33856:36;33880:11;33856:23;:36::i;20798:100::-;20852:13;20885:5;20878:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20798:100;:::o;22357:221::-;22433:7;22461:16;22469:7;22461;:16::i;:::-;22453:73;;;;-1:-1:-1;;;22453:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22546:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22546:24:0;;22357:221::o;21880:411::-;21961:13;21977:23;21992:7;21977:14;:23::i;:::-;21961:39;;22025:5;-1:-1:-1;;;;;22019:11:0;:2;-1:-1:-1;;;;;22019:11:0;;;22011:57;;;;-1:-1:-1;;;22011:57:0;;;;;;;:::i;:::-;22119:5;-1:-1:-1;;;;;22103:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22103:21:0;;:62;;;;22128:37;22145:5;22152:12;:10;:12::i;22128:37::-;22081:168;;;;-1:-1:-1;;;22081:168:0;;;;;;;:::i;:::-;22262:21;22271:2;22275:7;22262:8;:21::i;:::-;21880:411;;;:::o;56719:47::-;;;;;;;;;;;;-1:-1:-1;;;;;56719:47:0;;;-1:-1:-1;;;56719:47:0;;-1:-1:-1;;;;;56719:47:0;;-1:-1:-1;;;56719:47:0;;;;;:::o;34316:113::-;34404:10;:17;34316:113;:::o;23247:339::-;23442:41;23461:12;:10;:12::i;:::-;23475:7;23442:18;:41::i;:::-;23434:103;;;;-1:-1:-1;;;23434:103:0;;;;;;;:::i;:::-;23550:28;23560:4;23566:2;23570:7;23550:9;:28::i;73714:1044::-;73813:16;;-1:-1:-1;;;;;73813:16:0;73799:10;:30;73791:39;;;;;;74323:419;74336:8;74501:40;74529:5;74536:1;74539;74501:27;:40::i;:::-;74575;74603:5;74610:1;74613;74575:27;:40::i;:::-;74647;74675:5;74682:1;74685;74647:27;:40::i;:::-;74385:331;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74323:12;:419::i;:::-;73714:1044;;:::o;33984:256::-;34081:7;34117:23;34134:5;34117:16;:23::i;:::-;34109:5;:31;34101:87;;;;-1:-1:-1;;;34101:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34206:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;33984:256::o;56248:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59084:50::-;59124:10;59084:50;:::o;23657:185::-;23795:39;23812:4;23818:2;23822:7;23795:39;;;;;;;;;;;;:16;:39::i;78238:380::-;78326:16;78360:18;78381;78391:7;78381:9;:18::i;:::-;78360:39;;78412:25;78454:10;78440:25;;;;;;-1:-1:-1;;;78440:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78440:25:0;;78412:53;;78481:9;78476:109;78496:10;78492:1;:14;78476:109;;;78542:31;78562:7;78571:1;78542:19;:31::i;:::-;78528:8;78537:1;78528:11;;;;;;-1:-1:-1;;;78528:11:0;;;;;;;;;;;;;;;;;;:45;78508:3;;;;:::i;:::-;;;;78476:109;;;-1:-1:-1;78602:8:0;78238:380;-1:-1:-1;;;78238:380:0:o;63871:213::-;63973:13;63968:109;63992:18;;;63968:109;;;64036:29;64045:3;;64049:5;64045:10;;;;;-1:-1:-1;;;64045:10:0;;;;;;;;;;;;;;;64057:7;64036:8;:29::i;:::-;64012:7;;;;:::i;:::-;;;;63968:109;;;;63871:213;;;:::o;34506:233::-;34581:7;34617:30;:28;:30::i;:::-;34609:5;:38;34601:95;;;;-1:-1:-1;;;34601:95:0;;;;;;;:::i;:::-;34714:10;34725:5;34714:17;;;;;;-1:-1:-1;;;34714:17:0;;;;;;;;;;;;;;;;;34707:24;;34506:233;;;:::o;68653:162::-;-1:-1:-1;;;;;68783:24:0;;;;;;:16;:24;;;;;;;;;68776:31;;;;;;;;;;;;;;;;;68742:16;;68776:31;;;68783:24;68776:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68653:162;;;:::o;64885:172::-;64974:7;65030:4;65036:3;65041:5;65019:28;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;65019:28:0;;;;;;;;;65009:39;;65019:28;65009:39;;;;;64885:172;-1:-1:-1;;;;64885:172:0:o;20492:239::-;20564:7;20600:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20600:16:0;20635:19;20627:73;;;;-1:-1:-1;;;20627:73:0;;;;;;;:::i;64713:164::-;64777:13;64772:98;64796:18;;;64772:98;;;64840:18;64847:3;;64851:5;64847:10;;;;;-1:-1:-1;;;64847:10:0;;;;;;;;;;;;;;;64840:6;:18::i;:::-;64816:7;;;;:::i;:::-;;;;64772:98;;20222:208;20294:7;-1:-1:-1;;;;;20322:19:0;;20314:74;;;;-1:-1:-1;;;20314:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20406:16:0;;;;;:9;:16;;;;;;;20222:208::o;63725:138::-;63796:2;58434:10;58419:11;63796:2;58419:7;:11::i;:::-;-1:-1:-1;;;;;58419:25:0;;:63;;;-1:-1:-1;58448:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;58448:20:0;58472:10;58448:34;58419:63;58411:99;;;;;;58664:40:::1;58693:10;58664:28;:40::i;:::-;58663:41;58655:63;;;;-1:-1:-1::0;;;58655:63:0::1;;;;;;;:::i;:::-;58844:10;58856:14;58827:44;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;58827:44:0;;::::1;::::0;;;;;;58817:55;;58827:44:::1;58817:55:::0;;::::1;::::0;58802:12:::1;:70:::0;63821:34:::2;63831:2:::0;63835:10:::2;63847:7:::0;63821:9:::2;:34::i;56604:46::-:0;56640:10;56604:46;:::o;59662:2550::-;79822:6;;-1:-1:-1;;;;;79822:6:0;79832:10;79822:20;79814:29;;;;;;60067:18:::1;60088:121;;;;;;;;60109:1;60088:121;;;;;;60127:1;60088:121;;;;;;60138:1;60088:121;;;;;;60148:4;60088:121;;;;;;60162:3;60088:121;;;;;;60176:3;60088:121;;;;;;60190:2;60088:121;;;;;;60205:1;60088:121;;;;::::0;60067:142:::1;;60220:18;60241:121;;;;;;;;60262:2;60241:121;;;;;;60279:2;60241:121;;;;;;60291:1;60241:121;;;;;;60301:4;60241:121;;;;;;60315:3;60241:121;;;;;;60329:3;60241:121;;;;;;60343:2;60241:121;;;;;;60358:1;60241:121;;;;::::0;60220:142:::1;;60373:18;60394:121;;;;;;;;60415:2;60394:121;;;;;;60432:2;60394:121;;;;;;60444:1;60394:121;;;;;;60454:4;60394:121;;;;;;60468:3;60394:121;;;;;;60482:3;60394:121;;;;;;60496:2;60394:121;;;;;;60511:1;60394:121;;;;::::0;60373:142:::1;;60526:18;60547:121;;;;;;;;60568:2;60547:121;;;;;;60585:2;60547:121;;;;;;60597:1;60547:121;;;;;;60607:4;60547:121;;;;;;60621:3;60547:121;;;;;;60635:3;60547:121;;;;;;60649:2;60547:121;;;;;;60664:1;60547:121;;;;::::0;60526:142:::1;;60679:18;60700:121;;;;;;;;60722:1;60700:121;;;;;;60738:2;60700:121;;;;;;60749:2;60700:121;;;;;;60760:4;60700:121;;;;;;60774:3;60700:121;;;;;;60788:3;60700:121;;;;;;60802:2;60700:121;;;;;;60817:1;60700:121;;;;::::0;60679:142:::1;;60832:18;60853:121;;;;;;;;60874:2;60853:121;;;;;;60891:2;60853:121;;;;;;60902:2;60853:121;;;;;;60913:4;60853:121;;;;;;60927:3;60853:121;;;;;;60941:3;60853:121;;;;;;60955:2;60853:121;;;;;;60970:1;60853:121;;;;::::0;60832:142:::1;;60985:18;61006:121;;;;;;;;61027:2;61006:121;;;;;;61044:2;61006:121;;;;;;61055:2;61006:121;;;;;;61066:4;61006:121;;;;;;61080:3;61006:121;;;;;;61094:3;61006:121;;;;;;61108:2;61006:121;;;;;;61123:1;61006:121;;;;::::0;60985:142:::1;;61138:18;61159:121;;;;;;;;61180:2;61159:121;;;;;;61197:2;61159:121;;;;;;61207:3;61159:121;;;;;;61219:4;61159:121;;;;;;61233:3;61159:121;;;;;;61247:3;61159:121;;;;;;61261:2;61159:121;;;;;;61276:1;61159:121;;;;::::0;61138:142:::1;;61291:18;61312:121;;;;;;;;61333:2;61312:121;;;;;;61350:2;61312:121;;;;;;61360:3;61312:121;;;;;;61372:4;61312:121;;;;;;61386:3;61312:121;;;;;;61400:3;61312:121;;;;;;61414:2;61312:121;;;;;;61429:1;61312:121;;;;::::0;61291:142:::1;;61444:29;61477:122;;;;;;;;61498:2;61477:122;;;;;;61515:3;61477:122;;;;;;61526:3;61477:122;;;;;;61540:2;61477:122;;;;;;61555:1;61477:122;;;;;;61569:1;61477:122;;;;;;61582:1;61477:122;;;;;;61595:1;61477:122;;;;::::0;61444:155:::1;;61658:2;61612:9;:34;61622:23:::0;61612:34:::1;;;;;;-1:-1:-1::0;;;61612:34:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61612:34:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61717:2;61671:9;:29;61681:18;61671:29;;;;;;-1:-1:-1::0;;;61671:29:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61671:29:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61776:2;61730:9;:24;61740:13;61730:24;;;;;;-1:-1:-1::0;;;61730:24:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61730:24:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61835:2;61789:9;:37;61799:26;61789:37;;;;;;-1:-1:-1::0;;;61789:37:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61789:37:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61894:2;61848:9;:36;61858:25;61848:36;;;;;;-1:-1:-1::0;;;61848:36:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61848:36:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61953:2;61907:9;:37;61917:26;61907:37;;;;;;-1:-1:-1::0;;;61907:37:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61907:37:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62012:2;61966:9;:33;61976:22;61966:33;;;;;;-1:-1:-1::0;;;61966:33:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;61966:33:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62071:2;62025:9;:28;62035:17;62025:28;;;;;;-1:-1:-1::0;;;62025:28:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;62025:28:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62130:2;62084:9;:35;62094:24;62084:35;;;;;;-1:-1:-1::0;;;62084:35:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;62084:35:0::1;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62189:13;62143:9;:27;62153:16;62143:27:::0;::::1;;;;;-1:-1:-1::0;;;62143:27:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;62143:27:0::1;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;62143:27:0;:59;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;62143:59:0;;::::1;;::::0;;::::1;;-1:-1:-1::0;;62143:59:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;62143:59:0::1;::::0;::::1;::::0;;::::1;;;-1:-1:-1::0;;62143:59:0::1;::::0;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;62143:59:0::1;-1:-1:-1::0;;;62143:59:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;62143:59:0::1;-1:-1:-1::0;;;62143:59:0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;62143:59:0::1;-1:-1:-1::0;;;62143:59:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;62143:59:0::1;-1:-1:-1::0;;;62143:59:0;;;::::1;;;::::0;;-1:-1:-1;;;;;;;;;;59662:2550:0:o;67994:651::-;68046:2;58434:10;58419:11;68046:2;58419:7;:11::i;:::-;-1:-1:-1;;;;;58419:25:0;;:63;;;-1:-1:-1;58448:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;58448:20:0;58472:10;58448:34;58419:63;58411:99;;;;;;58664:40:::1;58693:10;58664:28;:40::i;:::-;58663:41;58655:63;;;;-1:-1:-1::0;;;58655:63:0::1;;;;;;;:::i;:::-;58844:10;58856:14;58827:44;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;58827:44:0;;;;;;58817:55;;58827:44:::1;58817:55:::0;;::::1;::::0;58802:12:::1;:70:::0;68104:14:::2;::::0;;;:10:::2;:14:::0;;;;:23;-1:-1:-1;;;68080:48:0;;68131:2:::2;::::0;68080:17:::2;::::0;:23:::2;::::0;:48:::2;::::0;68104:23:::2;::::0;::::2;;;::::0;68080:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;68072:62;;;::::0;::::2;;68187:7;68153:30;59124:10;68153:15;:30;:::i;:::-;:41;;68145:50;;;::::0;::::2;;68239:27:::0;68216:50;;::::2;::::0;;::::2;::::0;;68239:27;68216:50;::::2;::::0;;::::2;::::0;;;;;::::2;;68239:27;68216:50:::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;68216:50:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;68216:50:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;68216:50:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;68216:50:0;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;68285:14:0;;;:10:::2;:14:::0;;;;;;;:20;68216:50;;68285:20;;;::::2;::::0;;::::2;:37;;68277:46;;;::::0;::::2;;68343:12;::::0;68386:9:::2;::::0;::::2;::::0;-1:-1:-1;;;;;68343:12:0;;::::2;::::0;68336:29:::2;::::0;68366:10:::2;::::0;68378:28:::2;::::0;:18:::2;;68399:7;68378:28;:::i;:::-;68336:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;68420:10;68427:2;68420:6;:10::i;:::-;68473:16;68444:10;68463:27:::0;;;:9:::2;:27;::::0;;:35;;;;::::2;;;::::0;:33:::2;:35;::::0;::::2;:::i;:::-;::::0;;::::2;::::0;;;::::2;;::::0;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;;::::0;;-1:-1:-1;68510:14:0;;;:10:::2;:14;::::0;;;;:32;;-1:-1:-1;;68510:32:0::2;::::0;::::2;::::0;;68444:55;-1:-1:-1;68628:9:0::2;68444:55:::0;68635:2:::2;68628:9;:::i;:::-;68603:14;::::0;;;:10:::2;:14;::::0;;;;;:34;;-1:-1:-1;;68603:34:0::2;::::0;::::2;::::0;;::::2;::::0;;::::2;;-1:-1:-1::0;;68577:60:0::2;68603:34;68577:60:::0;::::2;;-1:-1:-1::0;;68553:84:0::2;::::0;;::::2;::::0;;;-1:-1:-1;;;67994:651:0:o;65065:195::-;65103:7;65165:10;65177:15;65194:16;65212:15;65229:12;;65148:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65138:105;;;;;;65130:114;;65123:121;;65065:195;:::o;20967:104::-;21023:13;21056:7;21049:14;;;;;:::i;56773:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56773:46:0;;;;;-1:-1:-1;;;56773:46:0;;;;;-1:-1:-1;;;56773:46:0;;;;;-1:-1:-1;;;56773:46:0;;;;:::o;66166:1819::-;66282:2;58434:10;58419:11;66282:2;58419:7;:11::i;:::-;-1:-1:-1;;;;;58419:25:0;;:63;;;-1:-1:-1;58448:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;58448:20:0;58472:10;58448:34;58419:63;58411:99;;;;;;58664:40:::1;58693:10;58664:28;:40::i;:::-;58663:41;58655:63;;;;-1:-1:-1::0;;;58655:63:0::1;;;;;;;:::i;:::-;58844:10;58856:14;58827:44;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;58827:44:0;;;;;;58817:55;;58827:44:::1;58817:55:::0;;::::1;::::0;58802:12:::1;:70:::0;66343:14:::2;::::0;;;:10:::2;:14:::0;;;;;:24;-1:-1:-1;;;66343:24:0;::::2;-1:-1:-1::0;;;;;66343:24:0::2;66316:15;:52;;66308:82;;;::::0;::::2;;66418:16;66409:5;:25;;;;;;-1:-1:-1::0;;;66409:25:0::2;;;;;;;;;;;66401:95;;;::::0;::::2;;66512:14;::::0;;;:10:::2;:14;::::0;;;;:24;66539:15:::2;-1:-1:-1::0;;;66512:24:0;;::::2;-1:-1:-1::0;;;;;66512:24:0::2;:42;66509:57;;;66556:10;66563:2;66556:6;:10::i;:::-;66580:13;66596:7;:5;:7::i;:::-;66580:23;;66618:20;66641:9;:16;66651:5;66641:16;;;;;;-1:-1:-1::0;;;66641:16:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;66641:16:0::2;;;;;;;;;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;66641:16:0;;;66618:39;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;66618:39:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;66618:39:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;66618:39:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;66618:39:0;;::::2;::::0;::::2;::::0;;;;66676:14;;;:10:::2;:14:::0;;;;;;;:20;66618:39;;-1:-1:-1;66676:20:0;;;::::2;::::0;;::::2;:45;;66668:100;;;::::0;::::2;;66785:9;::::0;::::2;::::0;:13:::2;;::::0;66781:209:::2;;66856:7;66823:30;59124:10;66823:15;:30;:::i;:::-;:40;66815:49;;;::::0;::::2;;66914:12;::::0;66957:9:::2;::::0;::::2;::::0;-1:-1:-1;;;;;66914:12:0;;::::2;::::0;66907:29:::2;::::0;66937:10:::2;::::0;66949:28:::2;::::0;:18:::2;;66970:7;66949:28;:::i;:::-;66907:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;66781:209;67003:10;67028:9;67024:172;;;67071:54;67088:4;67094:30;67105:5;67094:30;;;;;;;;;;;;;-1:-1:-1::0;;;67094:30:0::2;;::::0;67121:2:::2;67094:10;:30::i;:::-;67071:16;:54::i;:::-;67054:71:::0;;-1:-1:-1;67054:71:0;-1:-1:-1;67144:9:0::2;::::0;::::2;::::0;67140:44:::2;;67156:14;::::0;;;:10:::2;:14;::::0;;;;:28;;-1:-1:-1;;67156:28:0::2;;::::0;::::2;;::::0;;67140:44:::2;67210:11;67206:178;;;67255:56;67272:4;67278:32;67289:5;67278:32;;;;;;;;;;;;;-1:-1:-1::0;;;67278:32:0::2;;::::0;67307:2:::2;67278:10;:32::i;67255:56::-;67238:73:::0;;-1:-1:-1;67238:73:0;-1:-1:-1;67330:9:0::2;::::0;::::2;::::0;67326:46:::2;;67342:14;::::0;;;:10:::2;:14;::::0;;;;:30;;-1:-1:-1;;67342:30:0::2;;;::::0;::::2;;;::::0;;67326:46:::2;67398:10;67394:175;;;67442:55;67459:4;67465:31;67476:5;67465:31;;;;;;;;;;;;;-1:-1:-1::0;;;67465:31:0::2;;::::0;67493:2:::2;67465:10;:31::i;67442:55::-;67425:72:::0;;-1:-1:-1;67425:72:0;-1:-1:-1;67516:9:0::2;::::0;::::2;::::0;67512:45:::2;;67528:14;::::0;;;:10:::2;:14;::::0;;;;:29;;-1:-1:-1;;67528:29:0::2;::::0;::::2;::::0;::::2;;;::::0;;67512:45:::2;67599:1;67590:5;67585:11;;;;;;-1:-1:-1::0;;;67585:11:0::2;;;;;;;;;:15;67581:44;;;67621:4;67602:9;:16;67612:5;67602:16;;;;;;-1:-1:-1::0;;;67602:16:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;67602:16:0::2;;;;;;;;;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;67602:16:0;:23;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;-1:-1:-1;;67602:23:0;;::::2;;::::0;;::::2;;-1:-1:-1::0;;67602:23:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;67602:23:0::2;::::0;::::2;::::0;;::::2;;;-1:-1:-1::0;;67602:23:0::2;::::0;;;::::2;::::0;;;::::2;;-1:-1:-1::0;;67602:23:0::2;-1:-1:-1::0;;;67602:23:0;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;67602:23:0::2;-1:-1:-1::0;;;67602:23:0;;::::2;::::0;;;::::2;;-1:-1:-1::0;;;;67602:23:0::2;-1:-1:-1::0;;;67602:23:0;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;67602:23:0::2;-1:-1:-1::0;;;67602:23:0;;;::::2;;;::::0;;67581:44:::2;67638:26;67667:14:::0;;;:10:::2;:14;::::0;;;;;;;67638:43;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;;::::0;;::::2;::::0;;;;-1:-1:-1;;;67638:43:0;::::2;;::::0;;;;-1:-1:-1;;;67638:43:0;;::::2;;;::::0;;;;67805:42;;-1:-1:-1;;;67805:42:0;;67638:43;;:26;67805:17:::2;::::0;:23:::2;::::0;:42:::2;::::0;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67783:18;::::0;::::2;::::0;67759:43:::2;::::0;-1:-1:-1;;;67759:43:0;;:17:::2;::::0;:23:::2;::::0;:43:::2;::::0;67783:18;67759:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67739:16:::0;;67715:41:::2;::::0;-1:-1:-1;;;67715:41:0;;:17:::2;::::0;:23:::2;::::0;:41:::2;::::0;67739:16;67715:41:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:87;;;;:::i;:::-;:132;;;;:::i;:::-;67860:14;::::0;;;:10:::2;:14;::::0;;;;:43;;-1:-1:-1;;67860:43:0::2;-1:-1:-1::0;;;67860:43:0::2;::::0;::::2;;;::::0;;;-1:-1:-1;67950:26:0::2;56640:10;67950:15;:26;:::i;:::-;67916:14;::::0;;;:10:::2;:14;::::0;;;;;:61;;-1:-1:-1;;;;;67916:61:0;;;::::2;-1:-1:-1::0;;;67916:61:0::2;-1:-1:-1::0;;;;;;;;67916:61:0;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;;;;;;;;;66166:1819:0:o;22650:295::-;22765:12;:10;:12::i;:::-;-1:-1:-1;;;;;22753:24:0;:8;-1:-1:-1;;;;;22753:24:0;;;22745:62;;;;-1:-1:-1;;;22745:62:0;;;;;;;:::i;:::-;22865:8;22820:18;:32;22839:12;:10;:12::i;:::-;-1:-1:-1;;;;;22820:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;22820:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;22820:53:0;;;;;;;;;;;22904:12;:10;:12::i;:::-;-1:-1:-1;;;;;22889:48:0;;22928:8;22889:48;;;;;;:::i;:::-;;;;;;;;22650:295;;:::o;75347:447::-;75411:8;58434:10;58419:11;75411:8;58419:7;:11::i;:::-;-1:-1:-1;;;;;58419:25:0;;:63;;;-1:-1:-1;58448:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;58448:20:0;58472:10;58448:34;58419:63;58411:99;;;;;;58664:40:::1;58693:10;58664:28;:40::i;:::-;58663:41;58655:63;;;;-1:-1:-1::0;;;58655:63:0::1;;;;;;;:::i;:::-;58844:10;58856:14;58827:44;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;58827:44:0;;::::1;::::0;;;;;;;58817:55;;58827:44:::1;58817:55:::0;;::::1;::::0;58802:12:::1;:70:::0;75572:12:::2;::::0;-1:-1:-1;;;75565:51:0;;-1:-1:-1;;;;;75572:12:0::2;::::0;75565:29:::2;::::0;:51:::2;::::0;75595:10:::2;::::0;75607:8:::2;::::0;75565:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;75656:62;75668:24;75683:8;75668:14;:24::i;:::-;75694:8;75704:10;75716:1;75656:11;:62::i;:::-;75629:23;::::0;;;:13:::2;:23;::::0;;;;;;;:89;;::::2;::::0;:23;;:89;;;::::2;::::0;::::2;:::i;:::-;;75780:4;75740:12;75753:13;:23;75767:8;75753:23;;;;;;;;;;;75740:37;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:44;;;::::2;;-1:-1:-1::0;;75740:44:0;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;75347:447:0:o;23913:328::-;24088:41;24107:12;:10;:12::i;:::-;24121:7;24088:18;:41::i;:::-;24080:103;;;;-1:-1:-1;;;24080:103:0;;;;;;;:::i;:::-;24194:39;24208:4;24214:2;24218:7;24227:5;24194:13;:39::i;56659:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56659:53:0;;;;;;;-1:-1:-1;;;56659:53:0;;;;;:::o;76711:665::-;76813:13;76852:17;76860:8;76852:7;:17::i;:::-;76844:26;;;;;;76883;76912:20;;;:10;:20;;;;;;;;76883:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76883:49:0;;;;;;;-1:-1:-1;;;76883:49:0;;;;;;;;;;76971:24;76912:20;76971:14;:24::i;:::-;77185:16;;77221:18;;;;77259:17;;;;;77296:15;;;;77331:22;;;;77026:342;;-1:-1:-1;;;77026:342:0;;76945:50;;-1:-1:-1;77026:17:0;;:30;;:342;;77075:8;;76945:50;;77130:10;;77159:7;;77259:17;;77296:15;;77026:342;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77026:342:0;;;;;;;;;;;;:::i;:::-;77006:362;76711:665;-1:-1:-1;;;;76711:665:0:o;79463:233::-;79822:6;;-1:-1:-1;;;;;79822:6:0;79832:10;79822:20;79814:29;;;;;;79596:12:::1;:28:::0;;-1:-1:-1;;;;;79596:28:0;;::::1;-1:-1:-1::0;;;;;;79596:28:0;;::::1;;::::0;;;79635:16:::1;:36:::0;;;;;::::1;::::0;::::1;;::::0;;79463:233::o;78773:492::-;79822:6;;-1:-1:-1;;;;;79822:6:0;79832:10;79822:20;79814:29;;;;;;78899:9:::1;78894:345;78918:6;:13;78914:1;:17;78894:345;;;78953:10;:27;78964:15;78953:27;;;;;;;;;;;79004:208;;;;;;;;79050:6;79057:1;79050:9;;;;;;-1:-1:-1::0;;;79050:9:0::1;;;;;;;;;;;;;;;:19;;;79004:208;;;;79092:6;79099:1;79092:9;;;;;;-1:-1:-1::0;;;79092:9:0::1;;;;;;;;;;;;;;;:19;;;79004:208;;;;79134:6;79141:1;79134:9;;;;;;-1:-1:-1::0;;;79134:9:0::1;;;;;;;;;;;;;;;:16;;;79004:208;;;;79173:6;79180:1;79173:9;;;;;;-1:-1:-1::0;;;79173:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;:20:::1;;::::0;79004:208;;;78953:274;;::::1;::::0;::::1;::::0;;-1:-1:-1;78953:274:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;78953:274:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;78953:274:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;78933:3;;;;;:::i;:::-;;;;78894:345;;23016:164:::0;-1:-1:-1;;;;;23137:25:0;;;23113:4;23137:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23016:164::o;74901:340::-;79822:6;;-1:-1:-1;;;;;79822:6:0;79832:10;79822:20;79814:29;;;;;;74970:9:::1;74966:260;74986:6;74983:1;:9;74966:260;;;75013:20;75036:13;:11;:13::i;:::-;75013:36;;75087:2;75072:12;:17;75064:26;;;::::0;::::1;;75134:80;75147:10;75160:52;;;;;;;;;;;;;;-1:-1:-1::0;;;75160:52:0::1;;::::0;75184:12:::1;75198:10;75210:1;75160:11;:52::i;:::-;75134:12;:80::i;:::-;-1:-1:-1::0;74994:3:0;::::1;::::0;::::1;:::i;:::-;;;;74966:260;;54564:419:::0;54697:13;54753:3;54723:21;54800;54811:10;54800:8;:21;:::i;:::-;54790:32;;;;;;-1:-1:-1;;;54790:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54790:32:0;-1:-1:-1;54768:54:0;-1:-1:-1;54850:10:0;54833:111;54866:8;54862:1;:12;54833:111;;;54921:8;54930:1;54921:11;;;;;;-1:-1:-1;;;54921:11:0;;;;;;;;;;;;;-1:-1:-1;;;;;;54921:11:0;54896:6;54903:14;54907:10;54903:1;:14;:::i;:::-;54896:22;;;;;;-1:-1:-1;;;54896:22:0;;;;;;;;;;;;:36;-1:-1:-1;;;;;54896:36:0;;;;;;;;-1:-1:-1;54876:3:0;;;;:::i;:::-;;;;54833:111;;;-1:-1:-1;54968:6:0;54564:419;-1:-1:-1;;;;;54564:419:0:o;19853:305::-;19955:4;-1:-1:-1;;;;;;19992:40:0;;-1:-1:-1;;;19992:40:0;;:105;;-1:-1:-1;;;;;;;20049:48:0;;-1:-1:-1;;;20049:48:0;19992:105;:158;;;;20114:36;20138:11;20114:23;:36::i;25751:127::-;25816:4;25840:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25840:16:0;:30;;;25751:127::o;15550:98::-;15630:10;15550:98;:::o;29733:174::-;29808:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29808:29:0;-1:-1:-1;;;;;29808:29:0;;;;;;;;:24;;29862:23;29808:24;29862:14;:23::i;:::-;-1:-1:-1;;;;;29853:46:0;;;;;;;;;;;29733:174;;:::o;26045:348::-;26138:4;26163:16;26171:7;26163;:16::i;:::-;26155:73;;;;-1:-1:-1;;;26155:73:0;;;;;;;:::i;:::-;26239:13;26255:23;26270:7;26255:14;:23::i;:::-;26239:39;;26308:5;-1:-1:-1;;;;;26297:16:0;:7;-1:-1:-1;;;;;26297:16:0;;:51;;;;26341:7;-1:-1:-1;;;;;26317:31:0;:20;26329:7;26317:11;:20::i;:::-;-1:-1:-1;;;;;26317:31:0;;26297:51;:87;;;;26352:32;26369:5;26376:7;26352:16;:32::i;29037:578::-;29196:4;-1:-1:-1;;;;;29169:31:0;:23;29184:7;29169:14;:23::i;:::-;-1:-1:-1;;;;;29169:31:0;;29161:85;;;;-1:-1:-1;;;29161:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29265:16:0;;29257:65;;;;-1:-1:-1;;;29257:65:0;;;;;;;:::i;:::-;29335:39;29356:4;29362:2;29366:7;29335:20;:39::i;:::-;29439:29;29456:1;29460:7;29439:8;:29::i;:::-;-1:-1:-1;;;;;29481:15:0;;;;;;:9;:15;;;;;:20;;29500:1;;29481:15;:20;;29500:1;;29481:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29512:13:0;;;;;;:9;:13;;;;;:18;;29529:1;;29512:13;:18;;29529:1;;29512:18;:::i;:::-;;;;-1:-1:-1;;29541:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29541:21:0;-1:-1:-1;;;;;29541:21:0;;;;;;;;;29580:27;;29541:16;;29580:27;;;;;;;29037:578;;;:::o;72046:1557::-;72127:12;72142:7;:5;:7::i;:::-;72127:22;;72162:20;72185:13;:11;:13::i;:::-;72226:19;72273:26;;;:13;:26;;;;;;;;:34;;72162:36;;-1:-1:-1;72162:36:0;;72273:34;;;;;;:::i;:::-;;72363:4;72320:12;72333:13;:26;72347:11;72333:26;;;;;;;;;;;72320:40;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;-1:-1:-1;;72320:47:0;;;;;;;;;:40;;;;72560:22;72579:3;72560:16;:22;:::i;:::-;:27;;72585:2;72560:27;:::i;:::-;72536:51;;;;72602:19;72645:3;72626:16;:22;;;;:::i;:::-;:27;;72651:2;72626:27;:::i;:::-;72602:51;;;;72708:15;72733:39;72744:4;72733:39;;;;;;;;;;;;;-1:-1:-1;;;72733:39:0;;;72760:11;72733:10;:39::i;:::-;72708:65;;72826:9;72815:8;:20;;;:43;;72842:12;72853:1;72842:8;:12;:::i;:::-;:16;;72857:1;72842:16;:::i;:::-;72815:43;;;72838:1;72815:43;72796:63;;72876:18;72904:41;72915:4;72904:41;;;;;;;;;;;;;-1:-1:-1;;;72904:41:0;;;72933:11;72904:10;:41::i;:::-;72876:70;;73003:9;72989:11;:23;;;:49;;73019:15;73033:1;73019:11;:15;:::i;:::-;:19;;73037:1;73019:19;:::i;:::-;72989:49;;;73015:1;72989:49;72969:70;;73056:19;73085:40;73096:4;73085:40;;;;;;;;;;;;;-1:-1:-1;;;73085:40:0;;;73113:11;73085:10;:40::i;:::-;73056:70;;73185:11;73170:12;:26;;;:71;;73221:16;73236:1;73221:12;:16;:::i;:::-;:20;;73240:1;73221:20;:::i;:::-;73170:71;;;73199:16;73214:1;73199:12;:16;:::i;:::-;:20;;73218:1;73199:20;:::i;:::-;73149:93;;72046:1557;;;;;73266:28;73272:8;73282:11;73266:5;:28::i;:::-;73399:32;;-1:-1:-1;;;73399:32:0;;73307:19;;73399:17;;:23;;:32;;73423:7;;73399:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73363:33;;-1:-1:-1;;;73363:33:0;;:17;;:23;;:33;;73387:8;;73363:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73329:31;;-1:-1:-1;;;73329:31:0;;:17;;:23;;:31;;73353:6;;73329:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;:102;;;;:::i;:::-;73477:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73477:118:0;;;;;;;;;;;;;;;;;;;;;;73442:32;;;:10;:32;;;;;;:153;;;;;;;;;;;;;;-1:-1:-1;;73442:153:0;;;;;;;-1:-1:-1;;73442:153:0;;;;;;;;;;-1:-1:-1;;73442:153:0;;;;;;;;;;;;;;-1:-1:-1;;73442:153:0;;;;;;;;;;;;;-1:-1:-1;;73442:153:0;-1:-1:-1;;;73442:153:0;;;;;;;;;-1:-1:-1;;;;73442:153:0;-1:-1:-1;;;73477:118:0;73442:153;;;;;;;;;;;;;-1:-1:-1;;;;;72046:1557:0:o;64092:613::-;58664:40;58693:10;58664:28;:40::i;:::-;58663:41;58655:63;;;;-1:-1:-1;;;58655:63:0;;;;;;;:::i;:::-;58844:10;58856:14;58827:44;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;58827:44:0;;;;;;58817:55;;58827:44;58817:55;;;;58802:12;:70;64208:20:::1;64231:14:::0;;;:10:::1;:14:::0;;;;;64208:37:::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;64208:37:0;::::1;::::0;;-1:-1:-1;;;64208:37:0;::::1;-1:-1:-1::0;;;;;64208:37:0::1;::::0;;::::1;::::0;;;;:20;;58827:44;64231:14;;64208:37;;;;-1:-1:-1;;;64208:37:0;::::1;;;::::0;;::::1;;;;-1:-1:-1::0;;;64208:37:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;64208:37:0::1;;;;;;;;;;;::::0;::::1;;;64280:6;:16;;;-1:-1:-1::0;;;;;64261:35:0::1;:15;:35;64258:47;;64298:7;;;64258:47;64317:16;64362:6;:16;;;-1:-1:-1::0;;;;;64344:34:0::1;:15;:34;;;;:::i;:::-;64317:62:::0;-1:-1:-1;64413:16:0::1;64396:6;:13;;;:33;;;;;;-1:-1:-1::0;;;64396:33:0::1;;;;;;;;;;64392:243;;;64446:16;64483:6;64465:15;:8:::0;64476:4:::1;64465:15;:::i;:::-;:24;;;;:::i;:::-;64446:43:::0;-1:-1:-1;64540:15:0::1;64551:4;64446:43:::0;64540:15:::1;:::i;:::-;64504:14;::::0;;;:10:::1;:14;::::0;;;;:52;;-1:-1:-1;;;;64504:52:0::1;;::::0;;;::::1;-1:-1:-1::0;;;64504:52:0::1;::::0;;;::::1;::::0;;64607:15:::1;64618:4;64607:8:::0;:15:::1;:::i;:::-;64571:14;::::0;;;:10:::1;:14;::::0;;;;:52;;:20:::1;::::0;:52:::1;::::0;;;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;64392:243;;-1:-1:-1::0;;64647:14:0::1;::::0;;;:10:::1;:14;::::0;;;;:50;;-1:-1:-1;;;;;;;;64647:50:0::1;-1:-1:-1::0;;;64681:15:0::1;-1:-1:-1::0;;;;;64647:50:0::1;;;::::0;;58883:1:::1;64092:613:::0;:::o;54991:387::-;55314:20;55362:8;;;54991:387::o;62220:1493::-;62312:20;62335:14;;;:10;:14;;;;;;;;62312:37;;;;;;;;;-1:-1:-1;;;;;62312:37:0;;;;-1:-1:-1;;;62312:37:0;;-1:-1:-1;;;;;62312:37:0;;;;;;;;;62335:14;;62312:37;;;-1:-1:-1;;;62312:37:0;;;;;;;;;;-1:-1:-1;;;62312:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;62312:37:0;;;;;;;;;;;-1:-1:-1;62312:37:0;-1:-1:-1;62395:7:0;62378:24;;;;;;-1:-1:-1;;;62378:24:0;;;;;;;;;:6;:13;;;:24;;;;;;-1:-1:-1;;;62378:24:0;;;;;;;;;;;62370:78;;;;;;62560:16;62604:6;:16;;;-1:-1:-1;;;;;62586:34:0;:15;:34;:71;;62641:6;:16;;;-1:-1:-1;;;;;62586:71:0;;;;62623:15;62586:71;62560:98;-1:-1:-1;62946:16:0;62929:6;:13;;;:33;;;;;;-1:-1:-1;;;62929:33:0;;;;;;;;;;62925:344;;;62979:44;62989:14;63013:4;63020:2;62979:9;:44::i;:::-;-1:-1:-1;;;;;63038:32:0;;;;;;:16;:32;;;;;;;:41;;;;;;;;;;;;;;;;62925:344;;;63143:6;:16;;;-1:-1:-1;;;;;63125:34:0;:15;:34;63121:50;;;63161:10;63168:2;63161:6;:10::i;:::-;63210:6;:16;;;-1:-1:-1;;;;;63198:28:0;:9;-1:-1:-1;;;;;63198:28:0;;:59;;63241:6;:16;;;63198:59;;;63229:9;63198:59;63186:71;;62925:344;63281:14;;63298:7;:27;;;;;;-1:-1:-1;;;63298:27:0;;;;;;;;;;:57;;63341:14;63298:57;;;63336:1;63298:57;63281:74;-1:-1:-1;63389:16:0;63378:7;:27;;;;;;-1:-1:-1;;;63378:27:0;;;;;;;;;;63374:162;;;63422:44;63440:4;63447:14;63463:2;63422:9;:44::i;:::-;63481:43;63505:14;63521:2;63481:23;:43::i;:::-;63565:61;;;;;;;;63580:6;-1:-1:-1;;;;;63565:61:0;;;;;63615:9;-1:-1:-1;;;;;63565:61:0;;;;;63596:7;63565:61;;;;;;-1:-1:-1;;;63565:61:0;;;;;;;;;;;63548:14;;;;:10;:14;;;;;;;;;:78;;;;;;;;-1:-1:-1;;;;;63548:78:0;-1:-1:-1;;;63548:78:0;-1:-1:-1;;;;;;;;;;;;;63548:78:0;;;-1:-1:-1;;;;;;63548:78:0;;;;;;;;;;;;;;;;;;;:14;;;;-1:-1:-1;;;;;63548:78:0;-1:-1:-1;;;63548:78:0;;;;;;;-1:-1:-1;;;63548:78:0;;;;;;;;;;;;;;;;;63642:63;63653:14;63669:2;63673:15;63696:7;63690:14;;;;;;-1:-1:-1;;;63690:14:0;;;;;;;;;63642:63;;;;;;;;;:::i;:::-;;;;;;;;62220:1493;;;;;;:::o;65268:890::-;65348:15;;:::i;:::-;65365:10;65388:9;65407:4;:10;;:12;;;;;;;;:::i;:::-;;;;;;;;65400:19;;;:4;:19;:::i;:::-;65388:31;;65472:4;:11;;;65458:4;:11;;;65444:4;:11;;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;65437:46;;:4;:46;:67;;;;-1:-1:-1;65487:11:0;;;:13;;65503:1;;65487:13;;;:::i;:::-;;;;;;;;:17;;65437:67;65433:196;;;65552:16;;;;:20;;65571:1;65552:20;:::i;:::-;65551:26;;65576:1;65551:26;:::i;:::-;65534:43;;65535:8;65542:1;65535:4;:8;:::i;:::-;:12;;65546:1;65535:12;:::i;:::-;65534:43;;;;:::i;:::-;65521:57;;65606:4;65598:19;;;;;65433:196;65666:4;:11;;;65652:4;:11;;;:25;;;;:::i;:::-;65645:32;;:4;:32;:53;;;;-1:-1:-1;65681:11:0;;;:13;;65697:1;;65681:13;;;:::i;:::-;;;;;;;;:17;;65645:53;65641:177;;;65746:16;;;;:20;;65765:1;65746:20;:::i;65641:177::-;65841:4;:11;;;65834:18;;:4;:18;:39;;;;-1:-1:-1;65856:11:0;;;:13;;65872:1;;65856:13;;;:::i;:::-;;;;;;;;:17;;65834:39;65830:163;;;65921:16;;;;:20;;65940:1;65921:20;:::i;65830:163::-;66009:11;;;:13;;66025:1;;66009:13;;;:::i;:::-;;;;;;;;:17;;66005:136;;;66073:16;;;;:20;;66092:1;66073:20;:::i;66005:136::-;65268:890;;;;;;;:::o;70148:1809::-;70284:13;70323:2;70318;:7;70310:16;;;;;;70346:31;;;;;;;;;;;;-1:-1:-1;;;70346:31:0;;;;:25;70390:1438;70412:1;70408;:5;;;70390:1438;;;70449:10;:12;;;:10;:12;;;:::i;:::-;;;;;;70476:24;70915:3;70641:15;70687:16;70734:2;70767;70800;70833:10;;70594:276;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70558:335;;;;;;70528:384;;:390;;;;:::i;:::-;70476:457;;71014:2;70994:17;:22;;;70989:828;;;71116:11;71151:49;71179:12;71151:49;;;71196:3;71193:1;71198;71196:3;:::i;:::-;71151:49;;:27;:49::i;:::-;71077:142;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71038:200;;70989:828;;;71331:10;:12;;;:10;:12;;;:::i;:::-;;;;;;71364:17;71516:5;71447:43;71458:7;:5;:7::i;:::-;71466:11;71479:10;;71447;:43::i;:::-;71413:108;;;;:::i;:::-;71364:176;;71663:11;71702:17;:27;71730:10;71742:1;71745:13;71702:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;71702:57:0;;;;;;;;;;;;:::i;:::-;71620:162;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71577:224;;70989:828;;-1:-1:-1;70415:3:0;;;;:::i;:::-;;;;70390:1438;;;;71844:12;71857:11;71844:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;71840:78;;;71878:40;71890:12;71903:2;71907;71911:6;:2;71916:1;71911:6;:::i;:::-;71878:11;:40::i;:::-;71871:47;;;;;71840:78;71938:11;70148:1809;-1:-1:-1;;;;;70148:1809:0:o;25123:315::-;25280:28;25290:4;25296:2;25300:7;25280:9;:28::i;:::-;25327:48;25350:4;25356:2;25360:7;25369:5;25327:22;:48::i;:::-;25319:111;;;;-1:-1:-1;;;25319:111:0;;;;;;;:::i;18457:157::-;-1:-1:-1;;;;;;18566:40:0;;-1:-1:-1;;;18566:40:0;18457:157;;;:::o;35352:589::-;35496:45;35523:4;35529:2;35533:7;35496:26;:45::i;:::-;-1:-1:-1;;;;;35558:18:0;;35554:187;;35593:40;35625:7;35593:31;:40::i;:::-;35554:187;;;35663:2;-1:-1:-1;;;;;35655:10:0;:4;-1:-1:-1;;;;;35655:10:0;;35651:90;;35682:47;35715:4;35721:7;35682:32;:47::i;:::-;-1:-1:-1;;;;;35755:16:0;;35751:183;;35788:45;35825:7;35788:36;:45::i;:::-;35751:183;;;35861:4;-1:-1:-1;;;;;35855:10:0;:2;-1:-1:-1;;;;;35855:10:0;;35851:83;;35882:40;35910:2;35914:7;35882:27;:40::i;27729:382::-;-1:-1:-1;;;;;27809:16:0;;27801:61;;;;-1:-1:-1;;;27801:61:0;;;;;;;:::i;:::-;27882:16;27890:7;27882;:16::i;:::-;27881:17;27873:58;;;;-1:-1:-1;;;27873:58:0;;;;;;;:::i;:::-;27944:45;27973:1;27977:2;27981:7;27944:20;:45::i;:::-;-1:-1:-1;;;;;28002:13:0;;;;;;:9;:13;;;;;:18;;28019:1;;28002:13;:18;;28019:1;;28002:18;:::i;:::-;;;;-1:-1:-1;;28031:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28031:21:0;-1:-1:-1;;;;;28031:21:0;;;;;;;;28070:33;;28031:16;;;28070:33;;28031:16;;28070:33;27729:382;;:::o;69169:327::-;69260:9;69255:234;-1:-1:-1;;;;;69279:24:0;;;;;;:16;:24;;;;;:31;69275:35;;69255:234;;;-1:-1:-1;;;;;69336:24:0;;;;;;:16;:24;;;;;:27;;69367:7;;69336:24;69361:1;;69336:27;;;;-1:-1:-1;;;69336:27:0;;;;;;;;;;;;;;;;;:38;69332:146;;;69445:17;69452:6;69460:1;69445:6;:17::i;:::-;69312:3;;;;:::i;:::-;;;;69255:234;;30472:799;30627:4;30648:15;:2;-1:-1:-1;;;;;30648:13:0;;:15::i;:::-;30644:620;;;30700:2;-1:-1:-1;;;;;30684:36:0;;30721:12;:10;:12::i;:::-;30735:4;30741:7;30750:5;30684:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30684:72:0;;;;;;;;-1:-1:-1;;30684:72:0;;;;;;;;;;;;:::i;:::-;;;30680:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30926:13:0;;30922:272;;30969:60;;-1:-1:-1;;;30969:60:0;;;;;;;:::i;30922:272::-;31144:6;31138:13;31129:6;31125:2;31121:15;31114:38;30680:529;-1:-1:-1;;;;;;30807:51:0;-1:-1:-1;;;30807:51:0;;-1:-1:-1;30800:58:0;;30644:620;-1:-1:-1;31248:4:0;31241:11;;36664:164;36768:10;:17;;36741:24;;;;:15;:24;;;;;:44;;;36796:24;;;;;;;;;;;;36664:164::o;37455:988::-;37721:22;37771:1;37746:22;37763:4;37746:16;:22::i;:::-;:26;;;;:::i;:::-;37783:18;37804:26;;;:17;:26;;;;;;37721:51;;-1:-1:-1;37937:28:0;;;37933:328;;-1:-1:-1;;;;;38004:18:0;;37982:19;38004:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38055:30;;;;;;:44;;;38172:30;;:17;:30;;;;;:43;;;37933:328;-1:-1:-1;38357:26:0;;;;:17;:26;;;;;;;;38350:33;;;-1:-1:-1;;;;;38401:18:0;;;;;:12;:18;;;;;:34;;;;;;;38394:41;37455:988::o;38738:1079::-;39016:10;:17;38991:22;;39016:21;;39036:1;;39016:21;:::i;:::-;39048:18;39069:24;;;:15;:24;;;;;;39442:10;:26;;38991:46;;-1:-1:-1;39069:24:0;;38991:46;;39442:26;;;;-1:-1:-1;;;39442:26:0;;;;;;;;;;;;;;;;;39420:48;;39506:11;39481:10;39492;39481:22;;;;;;-1:-1:-1;;;39481:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;39586:28;;;:15;:28;;;;;;;:41;;;39758:24;;;;;39751:31;39793:10;:16;;;;;-1:-1:-1;;;39793:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;38738:1079;;;;:::o;36242:221::-;36327:14;36344:20;36361:2;36344:16;:20::i;:::-;-1:-1:-1;;;;;36375:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;36420:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36242:221:0:o;68823:338::-;-1:-1:-1;;;;;68903:24:0;;;;;;:16;:24;;;;;:31;68894:40;;68890:53;;68936:7;;68890:53;68972:5;68955:158;-1:-1:-1;;;;;68983:24:0;;;;;;:16;:24;;;;;:31;:35;;69017:1;;68983:35;:::i;:::-;68979:1;:39;68955:158;;;-1:-1:-1;;;;;69070:24:0;;;;;;:16;:24;;;;;69095:5;:1;69099;69095:5;:::i;:::-;69070:31;;;;;;-1:-1:-1;;;69070:31:0;;;;;;;;;;;;;;;;;69040:16;:24;69057:6;-1:-1:-1;;;;;69040:24:0;-1:-1:-1;;;;;69040:24:0;;;;;;;;;;;;69065:1;69040:27;;;;;;-1:-1:-1;;;69040:27:0;;;;;;;;;;;;;;;;;;:61;69020:3;;;;:::i;:::-;;;;68955:158;;;-1:-1:-1;;;;;;69123:24:0;;;;;;:16;:24;;;;;:30;;;;;-1:-1:-1;;;69123:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;68823:338;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:339:1;;109:53;124:37;154:6;124:37;:::i;:::-;109:53;:::i;:::-;100:62;;185:6;178:5;171:21;225:3;216:6;211:3;207:16;204:25;201:2;;;242:1;239;232:12;201:2;291:6;286:3;279:4;272:5;268:16;255:43;345:1;338:4;329:6;322:5;318:18;314:29;307:40;90:263;;;;;:::o;358:175::-;428:20;;-1:-1:-1;;;;;477:31:1;;467:42;;457:2;;523:1;520;513:12;538:404;;;671:3;664:4;656:6;652:17;648:27;638:2;;696:8;686;679:26;638:2;-1:-1:-1;726:20:1;;769:18;758:30;;755:2;;;808:8;798;791:26;755:2;852:4;844:6;840:17;828:29;;915:3;908:4;900;892:6;888:17;880:6;876:30;872:41;869:50;866:2;;;932:1;929;922:12;947:162;1014:20;;1070:13;;1063:21;1053:32;;1043:2;;1099:1;1096;1089:12;1114:151;1190:20;;1239:1;1229:12;;1219:2;;1255:1;1252;1245:12;1270:151;1345:20;;1394:2;1384:13;;1374:2;;1411:1;1408;1401:12;1426:233;;1524:3;1517:4;1509:6;1505:17;1501:27;1491:2;;1546:5;1539;1532:20;1491:2;1572:81;1649:3;1640:6;1627:20;1620:4;1612:6;1608:17;1572:81;:::i;:::-;1563:90;1481:178;-1:-1:-1;;;1481:178:1:o;1664:198::-;;1776:2;1764:9;1755:7;1751:23;1747:32;1744:2;;;1797:6;1789;1782:22;1744:2;1825:31;1846:9;1825:31;:::i;1867:274::-;;;1996:2;1984:9;1975:7;1971:23;1967:32;1964:2;;;2017:6;2009;2002:22;1964:2;2045:31;2066:9;2045:31;:::i;:::-;2035:41;;2095:40;2131:2;2120:9;2116:18;2095:40;:::i;:::-;2085:50;;1954:187;;;;;:::o;2146:342::-;;;;2292:2;2280:9;2271:7;2267:23;2263:32;2260:2;;;2313:6;2305;2298:22;2260:2;2341:31;2362:9;2341:31;:::i;:::-;2331:41;;2391:40;2427:2;2416:9;2412:18;2391:40;:::i;:::-;2381:50;;2478:2;2467:9;2463:18;2450:32;2440:42;;2250:238;;;;;:::o;2493:702::-;;;;;2665:3;2653:9;2644:7;2640:23;2636:33;2633:2;;;2687:6;2679;2672:22;2633:2;2715:31;2736:9;2715:31;:::i;:::-;2705:41;;2765:40;2801:2;2790:9;2786:18;2765:40;:::i;:::-;2755:50;;2852:2;2841:9;2837:18;2824:32;2814:42;;2907:2;2896:9;2892:18;2879:32;2934:18;2926:6;2923:30;2920:2;;;2971:6;2963;2956:22;2920:2;2999:22;;3052:4;3044:13;;3040:27;-1:-1:-1;3030:2:1;;3086:6;3078;3071:22;3030:2;3114:75;3181:7;3176:2;3163:16;3158:2;3154;3150:11;3114:75;:::i;:::-;3104:85;;;2623:572;;;;;;;:::o;3200:268::-;;;3326:2;3314:9;3305:7;3301:23;3297:32;3294:2;;;3347:6;3339;3332:22;3294:2;3375:31;3396:9;3375:31;:::i;:::-;3365:41;;3425:37;3458:2;3447:9;3443:18;3425:37;:::i;3473:420::-;;;3612:2;3600:9;3591:7;3587:23;3583:32;3580:2;;;3633:6;3625;3618:22;3580:2;3661:31;3682:9;3661:31;:::i;:::-;3651:41;;3743:2;3732:9;3728:18;3715:32;3770:18;3762:6;3759:30;3756:2;;;3807:6;3799;3792:22;3756:2;3835:52;3879:7;3870:6;3859:9;3855:22;3835:52;:::i;:::-;3825:62;;;3570:323;;;;;:::o;3898:266::-;;;4027:2;4015:9;4006:7;4002:23;3998:32;3995:2;;;4048:6;4040;4033:22;3995:2;4076:31;4097:9;4076:31;:::i;:::-;4066:41;4154:2;4139:18;;;;4126:32;;-1:-1:-1;;;3985:179:1:o;4169:463::-;;;4316:2;4304:9;4295:7;4291:23;4287:32;4284:2;;;4337:6;4329;4322:22;4284:2;4382:9;4369:23;4415:18;4407:6;4404:30;4401:2;;;4452:6;4444;4437:22;4401:2;4496:76;4564:7;4555:6;4544:9;4540:22;4496:76;:::i;:::-;4591:8;;4470:102;;-1:-1:-1;4274:358:1;-1:-1:-1;;;;4274:358:1:o;4637:557::-;;;;4813:2;4801:9;4792:7;4788:23;4784:32;4781:2;;;4834:6;4826;4819:22;4781:2;4879:9;4866:23;4912:18;4904:6;4901:30;4898:2;;;4949:6;4941;4934:22;4898:2;4993:76;5061:7;5052:6;5041:9;5037:22;4993:76;:::i;:::-;5088:8;;-1:-1:-1;4967:102:1;-1:-1:-1;5142:46:1;;-1:-1:-1;5184:2:1;5169:18;;5142:46;:::i;:::-;5132:56;;4771:423;;;;;:::o;5199:257::-;;5310:2;5298:9;5289:7;5285:23;5281:32;5278:2;;;5331:6;5323;5316:22;5278:2;5375:9;5362:23;5394:32;5420:5;5394:32;:::i;5461:261::-;;5583:2;5571:9;5562:7;5558:23;5554:32;5551:2;;;5604:6;5596;5589:22;5551:2;5641:9;5635:16;5660:32;5686:5;5660:32;:::i;5727:214::-;;5850:2;5838:9;5829:7;5825:23;5821:32;5818:2;;;5871:6;5863;5856:22;5818:2;5899:36;5925:9;5899:36;:::i;5946:676::-;;6079:2;6067:9;6058:7;6054:23;6050:32;6047:2;;;6100:6;6092;6085:22;6047:2;6138:9;6132:16;6171:18;6163:6;6160:30;6157:2;;;6208:6;6200;6193:22;6157:2;6236:22;;6289:4;6281:13;;6277:27;-1:-1:-1;6267:2:1;;6323:6;6315;6308:22;6267:2;6357;6351:9;6382:49;6397:33;6427:2;6397:33;:::i;6382:49::-;6454:2;6447:5;6440:17;6494:7;6489:2;6484;6480;6476:11;6472:20;6469:33;6466:2;;;6520:6;6512;6505:22;6466:2;6538:54;6589:2;6584;6577:5;6573:14;6568:2;6564;6560:11;6538:54;:::i;6627:296::-;;6749:2;6737:9;6728:7;6724:23;6720:32;6717:2;;;6770:6;6762;6755:22;6717:2;6807:9;6801:16;6857:6;6850:5;6846:18;6839:5;6836:29;6826:2;;6884:6;6876;6869:22;6928:190;;7040:2;7028:9;7019:7;7015:23;7011:32;7008:2;;;7061:6;7053;7046:22;7008:2;-1:-1:-1;7089:23:1;;6998:120;-1:-1:-1;6998:120:1:o;7123:1840::-;;;7300:2;7288:9;7279:7;7275:23;7271:32;7268:2;;;7321:6;7313;7306:22;7268:2;7362:9;7349:23;7339:33;;7391:2;7444;7433:9;7429:18;7416:32;7467:18;7508:2;7500:6;7497:14;7494:2;;;7529:6;7521;7514:22;7494:2;7572:6;7561:9;7557:22;7547:32;;7617:7;7610:4;7606:2;7602:13;7598:27;7588:2;;7644:6;7636;7629:22;7588:2;7685;7672:16;7707:2;7703;7700:10;7697:2;;;7713:18;;:::i;:::-;7753:36;7785:2;7780;7776;7772:11;7768:20;7753:36;:::i;:::-;7823:15;;;7854:12;;;;7886:11;;;7915:6;7930:1003;7944:2;7941:1;7938:9;7930:1003;;;8007:17;;7999:26;;8077:4;8049:16;;;-1:-1:-1;;8045:30:1;8041:41;8038:2;;;8100:6;8092;8085:22;8038:2;8135:20;8150:4;8135:20;:::i;:::-;8205:2;8201;8197:11;8184:25;8238:2;8228:8;8225:16;8222:2;;;8259:6;8251;8244:22;8222:2;8295:56;8343:7;8338:2;8327:8;8323:2;8319:17;8315:26;8295:56;:::i;:::-;8288:5;8281:71;;8402:2;8398;8394:11;8381:25;8435:2;8425:8;8422:16;8419:2;;;8456:6;8448;8441:22;8419:2;8501:56;8549:7;8544:2;8533:8;8529:2;8525:17;8521:26;8501:56;:::i;:::-;8496:2;8489:5;8485:14;8478:80;;8608:2;8604;8600:11;8587:25;8641:2;8631:8;8628:16;8625:2;;;8662:6;8654;8647:22;8625:2;8707:56;8755:7;8750:2;8739:8;8735:2;8731:17;8727:26;8707:56;:::i;:::-;8702:2;8691:14;;8684:80;-1:-1:-1;8821:4:1;8813:13;;;;8800:27;8795:2;8784:14;;8777:51;8841:18;;8879:12;;;;8911;;;;7962:1;7955:9;7930:1003;;;-1:-1:-1;7258:1705:1;;8952:5;;-1:-1:-1;7258:1705:1;-1:-1:-1;;;;;;;;7258:1705:1:o;8968:284::-;;;9109:2;9097:9;9088:7;9084:23;9080:32;9077:2;;;9130:6;9122;9115:22;9077:2;9171:9;9158:23;9148:33;;9200:46;9242:2;9231:9;9227:18;9200:46;:::i;9257:494::-;;;;;;9439:3;9427:9;9418:7;9414:23;9410:33;9407:2;;;9461:6;9453;9446:22;9407:2;9502:9;9489:23;9479:33;;9531:45;9572:2;9561:9;9557:18;9531:45;:::i;:::-;9521:55;;9595:37;9628:2;9617:9;9613:18;9595:37;:::i;:::-;9585:47;;9651:37;9684:2;9673:9;9669:18;9651:37;:::i;:::-;9641:47;;9707:38;9740:3;9729:9;9725:19;9707:38;:::i;:::-;9697:48;;9397:354;;;;;;;;:::o;9756:480::-;;;;9912:2;9900:9;9891:7;9887:23;9883:32;9880:2;;;9933:6;9925;9918:22;9880:2;9974:9;9961:23;9951:33;;10035:2;10024:9;10020:18;10007:32;10062:18;10054:6;10051:30;10048:2;;;10099:6;10091;10084:22;10048:2;10127:52;10171:7;10162:6;10151:9;10147:22;10127:52;:::i;:::-;10117:62;;;10226:2;10215:9;10211:18;10198:32;10188:42;;9870:366;;;;;:::o;10241:258::-;;;10370:2;10358:9;10349:7;10345:23;10341:32;10338:2;;;10391:6;10383;10376:22;10338:2;-1:-1:-1;;10419:23:1;;;10489:2;10474:18;;;10461:32;;-1:-1:-1;10328:171:1:o;10504:259::-;;10585:5;10579:12;10612:6;10607:3;10600:19;10628:63;10684:6;10677:4;10672:3;10668:14;10661:4;10654:5;10650:16;10628:63;:::i;:::-;10745:2;10724:15;-1:-1:-1;;10720:29:1;10711:39;;;;10752:4;10707:50;;10555:208;-1:-1:-1;;10555:208:1:o;10768:92::-;10846:6;10835:18;10823:31;;10813:47::o;10865:77::-;10934:4;10923:16;10911:29;;10909:33::o;10947:349::-;-1:-1:-1;;;;;;11190:2:1;11186:15;;;11182:24;;11170:37;;11241:15;;;;11237:24;11232:2;11223:12;;11216:46;11287:2;11278:12;;11110:186::o;11301:491::-;11562:2;11558:15;;;;-1:-1:-1;;;;;;11554:53:1;11542:66;;11633:2;11624:12;;11617:28;;;;11670:2;11661:12;;11654:28;;;;11707:2;11698:12;;11691:28;11744:3;11735:13;;11728:29;11782:3;11773:13;;11532:260::o;11797:276::-;;11966:6;11960:13;11982:53;12028:6;12023:3;12016:4;12008:6;12004:17;11982:53;:::i;:::-;12051:16;;;;;11936:137;-1:-1:-1;;11936:137:1:o;12078:470::-;;12295:6;12289:13;12311:53;12357:6;12352:3;12345:4;12337:6;12333:17;12311:53;:::i;:::-;12427:13;;12386:16;;;;12449:57;12427:13;12386:16;12483:4;12471:17;;12449:57;:::i;:::-;12522:20;;12265:283;-1:-1:-1;;;;12265:283:1:o;12553:821::-;;12710:3;12745:6;12739:13;12775:36;12801:9;12775:36;:::i;:::-;12830:1;12847:18;;;12874:104;;;;12992:1;12987:362;;;;12840:509;;12874:104;-1:-1:-1;;12907:24:1;;12895:37;;12952:16;;;;-1:-1:-1;12874:104:1;;12987:362;13020:6;13015:3;13008:19;13050:4;13097:2;13092:3;13082:18;13122:3;13138:165;13152:6;13149:1;13146:13;13138:165;;;13230:14;;13217:11;;;13210:35;13273:16;;;;13167:10;;13138:165;;;13142:3;;;13332:6;13327:3;13323:16;13316:23;;12840:509;-1:-1:-1;13365:3:1;;12689:685;-1:-1:-1;;;;;;12689:685:1:o;13379:804::-;;-1:-1:-1;;;13732:3:1;13725:16;13770:6;13764:13;13786:61;13840:6;13836:1;13831:3;13827:11;13820:4;13812:6;13808:17;13786:61;:::i;:::-;13907:13;;13866:16;;;;13929:62;13907:13;13978:1;13970:10;;13963:4;13951:17;;13929:62;:::i;:::-;14052:13;;14010:17;;;14074:62;14052:13;14123:1;14115:10;;14108:4;14096:17;;14074:62;:::i;:::-;14156:17;14175:1;14152:25;;13715:468;-1:-1:-1;;;;;13715:468:1:o;14188:418::-;;-1:-1:-1;;;14445:3:1;14438:16;14483:6;14477:13;14499:61;14553:6;14549:1;14544:3;14540:11;14533:4;14525:6;14521:17;14499:61;:::i;:::-;14580:16;;;;14598:1;14576:24;;14428:178;-1:-1:-1;;14428:178:1:o;14611:557::-;14880:19;;;14924:2;14915:12;;14908:28;;;;14961:2;14952:12;;14945:28;;;;15011:2;15007:15;;;-1:-1:-1;;;;;;15003:53:1;14989:12;;;14982:75;15082:3;15073:13;;15066:29;15120:3;15111:13;;15104:29;15158:3;15149:13;;14870:298::o;15173:203::-;-1:-1:-1;;;;;15337:32:1;;;;15319:51;;15307:2;15292:18;;15274:102::o;15381:490::-;-1:-1:-1;;;;;15650:15:1;;;15632:34;;15702:15;;15697:2;15682:18;;15675:43;15749:2;15734:18;;15727:34;;;15797:3;15792:2;15777:18;;15770:31;;;15381:490;;15818:47;;15845:19;;15837:6;15818:47;:::i;:::-;15810:55;15584:287;-1:-1:-1;;;;;;15584:287:1:o;15876:301::-;-1:-1:-1;;;;;16095:32:1;;;;16077:51;;16159:2;16144:18;;16137:34;16065:2;16050:18;;16032:145::o;16461:424::-;-1:-1:-1;;;;;16706:32:1;;;;16688:51;;16770:2;16755:18;;16748:34;;;;16813:2;16798:18;;16791:34;16873:4;16861:17;16856:2;16841:18;;16834:45;16675:3;16660:19;;16642:243::o;16890:537::-;-1:-1:-1;;;;;17118:32:1;;17100:51;;-1:-1:-1;;;;;17187:37:1;;17182:2;17167:18;;17160:65;17088:2;17073:18;;17255:1;17244:13;;17234:2;;17300:10;17295:3;17291:20;17288:1;17281:31;17335:4;17332:1;17325:15;17363:4;17360:1;17353:15;17234:2;17414:6;17409:2;17398:9;17394:18;17387:34;17055:372;;;;;;:::o;17432:635::-;17603:2;17655:21;;;17725:13;;17628:18;;;17747:22;;;17432:635;;17603:2;17826:15;;;;17800:2;17785:18;;;17432:635;17872:169;17886:6;17883:1;17880:13;17872:169;;;17947:13;;17935:26;;18016:15;;;;17981:12;;;;17908:1;17901:9;17872:169;;;-1:-1:-1;18058:3:1;;17583:484;-1:-1:-1;;;;;;17583:484:1:o;18072:187::-;18237:14;;18230:22;18212:41;;18200:2;18185:18;;18167:92::o;18264:221::-;;18413:2;18402:9;18395:21;18433:46;18475:2;18464:9;18460:18;18452:6;18433:46;:::i;18490:622::-;;18763:3;18752:9;18745:22;18790:47;18832:3;18821:9;18817:19;18809:6;18790:47;:::i;:::-;18885:9;18877:6;18873:22;18868:2;18857:9;18853:18;18846:50;18919:34;18946:6;18938;18919:34;:::i;:::-;18905:48;;19001:9;18993:6;18989:22;18984:2;18973:9;18969:18;18962:50;19029:34;19056:6;19048;19029:34;:::i;:::-;19021:42;;;19099:6;19094:2;19083:9;19079:18;19072:34;18735:377;;;;;;;:::o;19117:407::-;19319:2;19301:21;;;19358:2;19338:18;;;19331:30;19397:34;19392:2;19377:18;;19370:62;-1:-1:-1;;;19463:2:1;19448:18;;19441:41;19514:3;19499:19;;19291:233::o;19529:414::-;19731:2;19713:21;;;19770:2;19750:18;;;19743:30;19809:34;19804:2;19789:18;;19782:62;-1:-1:-1;;;19875:2:1;19860:18;;19853:48;19933:3;19918:19;;19703:240::o;19948:352::-;20150:2;20132:21;;;20189:2;20169:18;;;20162:30;20228;20223:2;20208:18;;20201:58;20291:2;20276:18;;20122:178::o;20305:400::-;20507:2;20489:21;;;20546:2;20526:18;;;20519:30;20585:34;20580:2;20565:18;;20558:62;-1:-1:-1;;;20651:2:1;20636:18;;20629:34;20695:3;20680:19;;20479:226::o;20710:349::-;20912:2;20894:21;;;20951:2;20931:18;;;20924:30;20990:27;20985:2;20970:18;;20963:55;21050:2;21035:18;;20884:175::o;21064:408::-;21266:2;21248:21;;;21305:2;21285:18;;;21278:30;21344:34;21339:2;21324:18;;21317:62;-1:-1:-1;;;21410:2:1;21395:18;;21388:42;21462:3;21447:19;;21238:234::o;21477:420::-;21679:2;21661:21;;;21718:2;21698:18;;;21691:30;21757:34;21752:2;21737:18;;21730:62;21828:26;21823:2;21808:18;;21801:54;21887:3;21872:19;;21651:246::o;21902:406::-;22104:2;22086:21;;;22143:2;22123:18;;;22116:30;22182:34;22177:2;22162:18;;22155:62;-1:-1:-1;;;22248:2:1;22233:18;;22226:40;22298:3;22283:19;;22076:232::o;22313:405::-;22515:2;22497:21;;;22554:2;22534:18;;;22527:30;22593:34;22588:2;22573:18;;22566:62;-1:-1:-1;;;22659:2:1;22644:18;;22637:39;22708:3;22693:19;;22487:231::o;22723:356::-;22925:2;22907:21;;;22944:18;;;22937:30;23003:34;22998:2;22983:18;;22976:62;23070:2;23055:18;;22897:182::o;23084:408::-;23286:2;23268:21;;;23325:2;23305:18;;;23298:30;23364:34;23359:2;23344:18;;23337:62;-1:-1:-1;;;23430:2:1;23415:18;;23408:42;23482:3;23467:19;;23258:234::o;23497:405::-;23699:2;23681:21;;;23738:2;23718:18;;;23711:30;23777:34;23772:2;23757:18;;23750:62;-1:-1:-1;;;23843:2:1;23828:18;;23821:39;23892:3;23877:19;;23671:231::o;23907:334::-;24109:2;24091:21;;;24148:2;24128:18;;;24121:30;-1:-1:-1;;;24182:2:1;24167:18;;24160:40;24232:2;24217:18;;24081:160::o;24246:397::-;24448:2;24430:21;;;24487:2;24467:18;;;24460:30;24526:34;24521:2;24506:18;;24499:62;-1:-1:-1;;;24592:2:1;24577:18;;24570:31;24633:3;24618:19;;24420:223::o;24648:413::-;24850:2;24832:21;;;24889:2;24869:18;;;24862:30;24928:34;24923:2;24908:18;;24901:62;-1:-1:-1;;;24994:2:1;24979:18;;24972:47;25051:3;25036:19;;24822:239::o;25066:408::-;25268:2;25250:21;;;25307:2;25287:18;;;25280:30;25346:34;25341:2;25326:18;;25319:62;-1:-1:-1;;;25412:2:1;25397:18;;25390:42;25464:3;25449:19;;25240:234::o;25479:387::-;25755:6;25743:19;;;;25725:38;;25811:4;25799:17;;;;25794:2;25779:18;;25772:45;25848:2;25833:18;;25826:34;25713:2;25698:18;;25680:186::o;25871:177::-;26017:25;;;26005:2;25990:18;;25972:76::o;26053:2388::-;;26541:3;26571:6;26560:9;26553:25;26597:2;26635;26630;26619:9;26615:18;26608:30;26661:46;26703:2;26692:9;26688:18;26680:6;26661:46;:::i;:::-;26647:60;;26726:2;26764:6;26759:2;26748:9;26744:18;26737:34;26819:9;26811:6;26807:22;26802:2;26791:9;26787:18;26780:50;26850:6;26885;26879:13;26916:6;26908;26901:22;26951:2;26943:6;26939:15;26932:22;;27011:2;27005;26997:6;26993:15;26985:6;26981:28;26977:37;27036:6;27030:4;27023:20;27082:2;27076:4;27066:19;27103:4;27116:1014;27130:6;27127:1;27124:13;27116:1014;;;27220:2;27216:7;27207:6;27199;27195:19;27191:33;27186:3;27179:46;27249:4;27289:6;27283:13;27325:36;27351:9;27325:36;:::i;:::-;27374:24;;;27421:1;27442:18;;;27473:127;;;;27618:1;27613:411;;;;27435:589;;27473:127;-1:-1:-1;;27522:24:1;;27505:15;;;27498:49;27571:15;;;;-1:-1:-1;27473:127:1;;27613:411;27651:6;27645:4;27638:20;27706:2;27700:4;27690:19;27737:4;27758:203;27774:8;27769:3;27766:17;27758:203;;;27880:14;;27857:16;;;27853:25;;27846:49;27927:16;;;;27793:12;;27758:203;;;27989:16;;27985:25;;;-1:-1:-1;;27435:589:1;-1:-1:-1;28108:12:1;;;;28047:3;;-1:-1:-1;;;28073:15:1;;;;;27152:1;27145:9;27116:1014;;;27120:3;;28147:6;28139:14;;;;;;;;28162:47;28204:3;28193:9;28189:19;28181:6;28162:47;:::i;:::-;28218;28260:3;28249:9;28245:19;28237:6;28218:47;:::i;:::-;28274;28316:3;28305:9;28301:19;28293:6;28274:47;:::i;:::-;28330:48;28373:3;28362:9;28358:19;28350:6;28330:48;:::i;:::-;28387;28430:3;28419:9;28415:19;28407:6;28387:48;:::i;:::-;26521:1920;;;;;;;;;;;;:::o;28446:363::-;;28651:6;28640:9;28633:25;28694:2;28689;28678:9;28674:18;28667:30;28714:46;28756:2;28745:9;28741:18;28733:6;28714:46;:::i;:::-;28706:54;;28796:6;28791:2;28780:9;28776:18;28769:34;28623:186;;;;;;:::o;28814:193::-;28995:4;28983:17;;;;28965:36;;28953:2;28938:18;;28920:87::o;29012:760::-;29365:4;29353:17;;;29335:36;;29407:17;;;;29402:2;29387:18;;29380:45;29444:6;29486:15;;;29481:2;29466:18;;29459:43;29538:15;;;29533:2;29518:18;;29511:43;29591:15;;;29585:3;29570:19;;29563:44;29644:15;;29638:3;29623:19;;29616:44;29697:15;;29691:3;29676:19;;29669:44;29750:15;;;29744:3;29729:19;;29722:44;29322:3;29307:19;;29289:483::o;29777:610::-;30076:4;30064:17;;;30046:36;;30118:17;;;30113:2;30098:18;;30091:45;30172:17;;;;30167:2;30152:18;;30145:45;30209:6;30251:15;;;30246:2;30231:18;;30224:43;30304:15;;;30298:3;30283:19;;30276:44;30369:10;30357:23;;;30351:3;30336:19;;30329:52;30033:3;30018:19;;30000:387::o;30392:251::-;30462:2;30456:9;30492:17;;;30539:18;30524:34;;30560:22;;;30521:62;30518:2;;;30586:18;;:::i;:::-;30622:2;30615:22;30436:207;;-1:-1:-1;30436:207:1:o;30648:190::-;;30731:18;30723:6;30720:30;30717:2;;;30753:18;;:::i;:::-;-1:-1:-1;30821:2:1;30798:17;-1:-1:-1;;30794:31:1;30827:4;30790:42;;30707:131::o;30843:224::-;;30910:6;30943:2;30940:1;30936:10;30973:2;30970:1;30966:10;31004:3;31000:2;30996:12;30991:3;30988:21;30985:2;;;31012:18;;:::i;31072:128::-;;31143:1;31139:6;31136:1;31133:13;31130:2;;;31149:18;;:::i;:::-;-1:-1:-1;31185:9:1;;31120:80::o;31205:204::-;;31279:4;31276:1;31272:12;31311:4;31308:1;31304:12;31346:3;31340:4;31336:14;31331:3;31328:23;31325:2;;;31354:18;;:::i;:::-;31390:13;;31251:158;-1:-1:-1;;;31251:158:1:o;31414:187::-;;31479:6;31512:2;31509:1;31505:10;31534:3;31524:2;;31541:18;;:::i;:::-;31579:10;;31575:20;;;;;31459:142;-1:-1:-1;;31459:142:1:o;31606:120::-;;31672:1;31662:2;;31677:18;;:::i;:::-;-1:-1:-1;31711:9:1;;31652:74::o;31731:258::-;;31802:6;31835:2;31832:1;31828:10;31865:2;31862:1;31858:10;31921:3;31917:2;31913:12;31908:3;31905:21;31898:3;31891:11;31884:19;31880:47;31877:2;;;31930:18;;:::i;:::-;31970:13;;31782:207;-1:-1:-1;;;;31782:207:1:o;31994:168::-;;32100:1;32096;32092:6;32088:14;32085:1;32082:21;32077:1;32070:9;32063:17;32059:45;32056:2;;;32107:18;;:::i;:::-;-1:-1:-1;32147:9:1;;32046:116::o;32167:238::-;;32245:4;32242:1;32238:12;32277:4;32274:1;32270:12;32337:3;32331:4;32327:14;32322:3;32319:23;32312:3;32305:11;32298:19;32294:49;32291:2;;;32346:18;;:::i;:::-;32386:13;;32217:188;-1:-1:-1;;;32217:188:1:o;32410:125::-;;32478:1;32475;32472:8;32469:2;;;32483:18;;:::i;:::-;-1:-1:-1;32520:9:1;;32459:76::o;32540:258::-;32612:1;32622:113;32636:6;32633:1;32630:13;32622:113;;;32712:11;;;32706:18;32693:11;;;32686:39;32658:2;32651:10;32622:113;;;32753:6;32750:1;32747:13;32744:2;;;-1:-1:-1;;32788:1:1;32770:16;;32763:27;32593:205::o;32803:181::-;;32885:6;32878:5;32874:18;32911:7;32901:2;;32922:18;;:::i;:::-;-1:-1:-1;;32958:20:1;;32849:135;-1:-1:-1;;32849:135:1:o;32989:380::-;33074:1;33064:12;;33121:1;33111:12;;;33132:2;;33186:4;33178:6;33174:17;33164:27;;33132:2;33239;33231:6;33228:14;33208:18;33205:38;33202:2;;;33285:10;33280:3;33276:20;33273:1;33266:31;33320:4;33317:1;33310:15;33348:4;33345:1;33338:15;33202:2;;33044:325;;;:::o;33374:135::-;;-1:-1:-1;;33434:17:1;;33431:2;;;33454:18;;:::i;:::-;-1:-1:-1;33501:1:1;33490:13;;33421:88::o;33514:175::-;;33595:4;33588:5;33584:16;33624:4;33615:7;33612:17;33609:2;;;33632:18;;:::i;:::-;33681:1;33668:15;;33559:130;-1:-1:-1;;33559:130:1:o;33694:179::-;;33751:6;33784:2;33781:1;33777:10;33806:3;33796:2;;33813:18;;:::i;:::-;33851:10;;33847:20;;;;;33731:142;-1:-1:-1;;33731:142:1:o;33878:112::-;;33936:1;33926:2;;33941:18;;:::i;:::-;-1:-1:-1;33975:9:1;;33916:74::o;33995:127::-;34056:10;34051:3;34047:20;34044:1;34037:31;34087:4;34084:1;34077:15;34111:4;34108:1;34101:15;34127:127;34188:10;34183:3;34179:20;34176:1;34169:31;34219:4;34216:1;34209:15;34243:4;34240:1;34233:15;34259:127;34320:10;34315:3;34311:20;34308:1;34301:31;34351:4;34348:1;34341:15;34375:4;34372:1;34365:15;34391:133;-1:-1:-1;;;;;;34467:32:1;;34457:43;;34447:2;;34514:1;34511;34504:12

Swarm Source

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