ETH Price: $2,606.72 (+0.60%)

Token

Zombie Max (ZMAX)
 

Overview

Max Total Supply

761 ZMAX

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 ZMAX
0x9c0489ecc7f7157859c235de456325da5e3dc734
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZMAX

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

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

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

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


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

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

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

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

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

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

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


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

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

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

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


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


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

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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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

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


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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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


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


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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/v3.0.0/contracts/ERC721A.sol


// Creator: Chiru Labs

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev 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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

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

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

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

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

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

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

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

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

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

// File: ZMAX.sol

contract ZMAX is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

    //  Transaction Events
    event SubmitTransaction(
        address indexed owner,
        uint indexed txIndex,
        address indexed to
    );
    event ConfirmTransaction(address indexed owner, uint indexed txIndex);
    event RevokeConfirmation(address indexed owner, uint indexed txIndex);
    event ExecuteTransaction(address indexed owner, uint indexed txIndex);

    // Change Owners Events
    event SubmitChangeOwnerTransaction(
        address indexed owner,
        address indexed from,
        address indexed to
    );
    event ConfirmChangeOwnerTransaction(address indexed owner, uint indexed txIndex);
    event RevokeChangeOwnerConfirmation(address indexed owner, uint indexed txIndex);
    event ExecuteChangeOwnerTransaction(address indexed owner, uint indexed txIndex);

    // Change NumberConfirmation Events
    event SubmitChangeNumberTransaction(
        address indexed owner,
        uint256 indexed from,
        uint256 indexed to
    );
    event ConfirmChangeNumberTransaction(address indexed owner, uint indexed txIndex);
    event RevokeChangeNumberConfirmation(address indexed owner, uint indexed txIndex);
    event ExecuteChangeNumberTransaction(address indexed owner, uint indexed txIndex);

    // Meta variable
    string private uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;
  
    // NFT Minting variables
    uint256 public presaleCost = 0.055 ether;
    uint256 public publicCost = 0.11 ether;
    uint256 public maxSupply = 3000;
    uint256 public maxPublicMintAmountPerTx = 10;
    uint256 public maxPresaleMintAmountPerTx = 10;
    uint256 public maxPresaleWalletLimit = 10;
    uint256 public maxPublicSaleWalletLimit = 20;

    // Contract and Sale variable
    bool public paused = true;
    bool public presaleActive = false;
    bool public saleActive = false;
    bool public revealed = false;

    // Merkle Hash
    bytes32 private merkleRoot;

    // Multisign Variables
    bool public initialOwnersSet = false;
    bool public initialNumberSet = false;
    address[] public owners;
    mapping(address => bool) public isOwner;
    uint public numConfirmationsRequired;
    uint256 public trxIndex = 0;
    uint256 public trxOwnerIndex = 0;
    uint256 public trxNumberIndex = 0;
    struct Transaction {
        address to;
        bool executed;
        uint numConfirmations;
    }
    struct OwnerTransaction {
        address to;
        address from;
        bool executed;
        uint numConfirmations;
    }
    struct NumberTransaction {
        uint256 from;
        uint256 to;
        bool executed;
        uint numConfirmations;
    }
    mapping(uint => mapping(address => bool)) public isConfirmed;
    mapping(uint => mapping(address => bool)) public isOwnerConfirmed;
    mapping(uint => mapping(address => bool)) public isNumberConfirmed;
    Transaction[] public transactions;
    OwnerTransaction[] public transactionsOwner;
    NumberTransaction[] public transactionsNumber;

    address collector = 0x26e3EBDE1A963F8A78E09E4811BC9740aE33Dae8;

    constructor() ERC721A("Zombie Max", "ZMAX") {}

    function _startTokenId() internal override view virtual returns (uint256) {
            return 1;
    }

    function cost() public view returns(uint256) {
        if(presaleActive) return presaleCost;

        return publicCost;
    }

    function maxWalletLimit() public view returns(uint256) {
        if(presaleActive) return maxPresaleWalletLimit;

        return maxPublicSaleWalletLimit;
    }

    function maxMintAmountPerTx() public view returns(uint256) {
        if(presaleActive) return maxPresaleMintAmountPerTx;

        return maxPublicMintAmountPerTx;
    }

    modifier onlyOwners() {
        require(isOwner[msg.sender], "not owner");
        _;
    }

    modifier txExists(uint _txIndex) {
        require(_txIndex == transactions.length, "tx does not exist");
        _;
    }

    modifier txOwnerExists(uint _txIndex) {
        require(_txIndex == transactionsOwner.length, "tx does not exist");
        _;
    }

    modifier txNumberExists(uint _txIndex) {
        require(_txIndex == transactionsNumber.length, "tx does not exist");
        _;
    }

    modifier notExecuted(uint _txIndex) {
        require(!transactions[_txIndex - 1].executed, "tx already executed");
        _;
    }

    modifier notOwnerExecuted(uint _txIndex) {
        require(!transactionsOwner[_txIndex - 1].executed, "tx already executed");
        _;
    }

    modifier notNumberExecuted(uint _txIndex) {
        require(!transactionsNumber[_txIndex - 1].executed, "tx already executed");
        _;
    }

    modifier notConfirmed(uint _txIndex) {
        require(!isConfirmed[_txIndex - 1][msg.sender], "tx already confirmed");
        _;
    }

    modifier notOwnerConfirmed(uint _txIndex) {
        require(!isOwnerConfirmed[_txIndex - 1][msg.sender], "tx already confirmed");
        _;
    }

    modifier notNumberConfirmed(uint _txIndex) {
        require(!isNumberConfirmed[_txIndex - 1][msg.sender], "tx already confirmed");
        _;
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(!paused, "The contract is paused!");
        require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx(), "Invalid mint amount!");
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    modifier selfMintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0, "Invalid mint amount!");
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(saleActive, "Sale is not Active" );
        require(msg.value >= cost() * _mintAmount, "Insufficient funds!");
        require(balanceOf(msg.sender) + _mintAmount <= maxWalletLimit(), "Max mint amount per wallet reached");
        _safeMint(msg.sender, _mintAmount);
    }
    
    function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

    function mintForSelf(uint256 _mintAmount) public selfMintCompliance(_mintAmount) onlyOwner {
        _safeMint(msg.sender, _mintAmount);
    }

    function whitelistMint(uint256 _mintAmount, bytes32 leaf, bytes32[] memory proof) external payable mintCompliance(_mintAmount) {
        require(presaleActive, "Sale is not Active" );
        require(merkleRoot != '', "Merkle Root not set");
        // Verify that (msg.sender, amount) correspond to Merkle leaf
        require(keccak256(abi.encodePacked(msg.sender)) == leaf, "Sender and amount don't match Merkle leaf");

        // Verify that (leaf, proof) matches the Merkle root
        require(verify(merkleRoot, leaf, proof), "Not a valid leaf in the Merkle tree");
        require(msg.value >= cost() * _mintAmount, "Insufficient funds!");
        require(balanceOf(msg.sender) + _mintAmount <= maxWalletLimit(), "Max mint amount per wallet reached");
        _safeMint(msg.sender, _mintAmount);
    }

    function verify(bytes32 _merkleRoot, bytes32 leaf, bytes32[] memory proof) internal pure returns (bool) {
        return MerkleProof.verify(proof, _merkleRoot, leaf);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

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

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

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

    function submitTransaction() public onlyOwner returns (uint txIndex) {
        txIndex = transactions.length + 1;
        address _to = collector;

        transactions.push(
            Transaction({
                to: _to,
                executed: false,
                numConfirmations: 0
            })
        );
        trxIndex++;
        
        emit SubmitTransaction(msg.sender, txIndex, _to);
    }

    function submitOwnerTransaction(
        address _from, address _to
    ) public onlyOwner returns (uint txOwnerIndex) {
        txOwnerIndex = transactionsOwner.length + 1;

        transactionsOwner.push(
            OwnerTransaction({
                to: _to,
                from: _from,
                executed: false,
                numConfirmations: 0
            })
        );
        trxOwnerIndex++;
        
        emit SubmitChangeOwnerTransaction(msg.sender, _from, _to);
    }

    function submitNumberTransaction(
        uint _value
    ) public onlyOwner returns (uint txNuberIndex) {
        txNuberIndex = transactionsNumber.length + 1;

        transactionsNumber.push(
            NumberTransaction({
                to: _value,
                from: numConfirmationsRequired,
                executed: false,
                numConfirmations: 0
            })
        );
        trxNumberIndex++;
        
        emit SubmitChangeNumberTransaction(msg.sender, numConfirmationsRequired, _value);
    }

    function confirmCurrentTransaction()
        public
        onlyOwners
        txExists(trxIndex)
        notExecuted(trxIndex)
        notConfirmed(trxIndex)
    {
        require(!isConfirmed[trxIndex - 1][msg.sender], "tx already confirmed");
        Transaction storage transaction = transactions[trxIndex - 1];
        transaction.numConfirmations += 1;
        isConfirmed[trxIndex - 1][msg.sender] = true;

        emit ConfirmTransaction(msg.sender, trxIndex);
    }

    function confirmCurrentOwnerTransaction()
        public
        onlyOwners
        txOwnerExists(trxOwnerIndex)
        notOwnerExecuted(trxOwnerIndex)
        notOwnerConfirmed(trxOwnerIndex)
    {
        require(!isOwnerConfirmed[trxOwnerIndex - 1][msg.sender], "tx already confirmed");
        OwnerTransaction storage transaction = transactionsOwner[trxOwnerIndex - 1];
        transaction.numConfirmations += 1;
        isOwnerConfirmed[trxOwnerIndex - 1][msg.sender] = true;

        emit ConfirmChangeOwnerTransaction(msg.sender, trxOwnerIndex);
    }

    function confirmCurrentNumberTransaction()
        public
        onlyOwners
        txNumberExists(trxNumberIndex)
        notNumberExecuted(trxNumberIndex)
        notNumberConfirmed(trxNumberIndex)
    {
        require(!isNumberConfirmed[trxNumberIndex - 1][msg.sender], "tx already confirmed");
        NumberTransaction storage transaction = transactionsNumber[trxNumberIndex - 1];
        transaction.numConfirmations += 1;
        isNumberConfirmed[trxNumberIndex - 1][msg.sender] = true;

        emit ConfirmChangeNumberTransaction(msg.sender, trxNumberIndex);
    }

    function executeCurrentTransaction()
        internal
        onlyOwner
        txExists(trxIndex)
        notExecuted(trxIndex)
    {
        Transaction storage transaction = transactions[trxIndex - 1];

        require(
            transaction.numConfirmations >= numConfirmationsRequired,
            "cannot execute tx"
        );

        transaction.executed = true;

        emit ExecuteTransaction(msg.sender, trxIndex);
    }

    function executeCurrentOwnerTransaction()
        internal
        onlyOwner
        txOwnerExists(trxOwnerIndex)
        notOwnerExecuted(trxOwnerIndex)
    {
        OwnerTransaction storage transaction = transactionsOwner[trxOwnerIndex - 1];

        require(
            transaction.numConfirmations >= numConfirmationsRequired,
            "cannot execute tx"
        );

        transaction.executed = true;

        emit ExecuteChangeOwnerTransaction(msg.sender, trxOwnerIndex);
    }

    function executeCurrentNumberTransaction()
        internal
        onlyOwner
        txNumberExists(trxNumberIndex)
        notNumberExecuted(trxNumberIndex)
    {
        NumberTransaction storage transaction = transactionsNumber[trxNumberIndex - 1];

        require(
            transaction.numConfirmations >= numConfirmationsRequired,
            "cannot execute tx"
        );

        transaction.executed = true;

        emit ExecuteChangeNumberTransaction(msg.sender, trxNumberIndex);
    }

    function revokecurrentConfirmation()
        public
        onlyOwners
        txExists(trxIndex)
        notExecuted(trxIndex)
    {
        Transaction storage transaction = transactions[trxIndex - 1];

        require(isConfirmed[trxIndex - 1][msg.sender], "tx not confirmed");

        transaction.numConfirmations -= 1;
        isConfirmed[trxIndex - 1][msg.sender] = false;

        emit RevokeConfirmation(msg.sender, trxIndex);
    }

    function revokecurrentOwnerConfirmation()
        public
        onlyOwners
        txOwnerExists(trxOwnerIndex)
        notOwnerExecuted(trxOwnerIndex)
    {
        OwnerTransaction storage transaction = transactionsOwner[trxOwnerIndex - 1];

        require(isOwnerConfirmed[trxOwnerIndex - 1][msg.sender], "tx not confirmed");

        transaction.numConfirmations -= 1;
        isOwnerConfirmed[trxOwnerIndex - 1][msg.sender] = false;

        emit RevokeChangeOwnerConfirmation(msg.sender, trxOwnerIndex);
    }

    function revokecurrentNumberConfirmation()
        public
        onlyOwners
        txNumberExists(trxNumberIndex)
        notNumberExecuted(trxNumberIndex)
    {
        NumberTransaction storage transaction = transactionsNumber[trxNumberIndex - 1];

        require(isNumberConfirmed[trxNumberIndex - 1][msg.sender], "tx not confirmed");

        transaction.numConfirmations -= 1;
        isNumberConfirmed[trxNumberIndex - 1][msg.sender] = false;

        emit RevokeChangeNumberConfirmation(msg.sender, trxNumberIndex);
    }

    function setOwners(address[] memory _owners) public onlyOwner {
        require(initialOwnersSet == false, "Owners can be set only once. Please raise a request to update the particular owner");
        updateOwners(_owners);
        setIntitialOwner();
    }

    function setOwner(address _from, address _to) public onlyOwner {
        require(trxOwnerIndex > 0, "Transaction not found!");
        require(owners.length > 0, "owners required");
        require(
                    numConfirmationsRequired > 0 &&
                        numConfirmationsRequired <= owners.length,
                    "invalid number of required confirmations"
                );
        OwnerTransaction storage transaction = transactionsOwner[trxOwnerIndex - 1];
        require(transaction.executed == false, "No active transaction request found!");
        require(transaction.numConfirmations >= numConfirmationsRequired, "Minimum confirmation not met!");
        require(transaction.to == _to, "Address provided is not an approved address!");
        executeCurrentOwnerTransaction();
        uint256 index = getIndexOfOwner(_from);
        owners[index] = _to;
        delete isOwner[_from];
        isOwner[_to] = true;
    }

    function getIndexOfOwner(address _owner) internal view returns(uint256) {
        for (uint256 i = 0; i < owners.length; i++) {
            if (owners[i] == _owner) {
                return i;
            }
        }

        revert("Not Found");
    }

    function updateOwners(address[] memory _owners) internal {
        for (uint i = 0; i < _owners.length; i++) {
            address owner = _owners[i];

            require(owner != address(0), "invalid owner");
            require(!isOwner[owner], "owner not unique");

            isOwner[owner] = true;
            owners.push(owner);
        }
    }

    function setIntitialOwner() internal {
        initialOwnersSet = true;
    }

    function getOwners() public view returns (address[] memory) {
        return owners;
    }

    function getTransactionCount() public view returns (uint) {
        return transactions.length;
    }

    function getTransaction(uint _txIndex)
        public
        view
        returns (
            address to,
            bool executed,
            uint numConfirmations
        )
    {
        if(_txIndex > transactions.length) revert("Index exceed the current transaction length");
        Transaction storage transaction = transactions[_txIndex - 1];

        return (
            transaction.to,
            transaction.executed,
            transaction.numConfirmations
        );
    }

    function getOwnerTransaction(uint _txIndex)
        public
        view
        returns (
            address to,
            bool executed,
            uint numConfirmations
        )
    {
        if(_txIndex > transactionsOwner.length) revert("Index exceed the current transaction length");
        OwnerTransaction storage transaction = transactionsOwner[_txIndex - 1];

        return (
            transaction.to,
            transaction.executed,
            transaction.numConfirmations
        );
    }

    function getNumberTransaction(uint _txIndex)
        public
        view
        returns (
            uint256 to,
            bool executed,
            uint numConfirmations
        )
    {
        if(_txIndex > transactionsNumber.length) revert("Index exceed the current transaction length");
        NumberTransaction storage transaction = transactionsNumber[_txIndex - 1];

        return (
            transaction.to,
            transaction.executed,
            transaction.numConfirmations
        );
    }

    function setNumConfirmationsRequired(uint _state) public onlyOwner {
        if(initialNumberSet == false) {
            numConfirmationsRequired = _state;
            initialNumberSet = true;
        }else {
            require(trxNumberIndex > 0, "Transaction not found!");
            require(owners.length > 0, "owners required");
            require(
                        numConfirmationsRequired > 0 &&
                            numConfirmationsRequired <= owners.length,
                        "invalid number of required confirmations"
                    );
            NumberTransaction storage transaction = transactionsNumber[trxNumberIndex - 1];
            require(transaction.executed == false, "No active transaction request found!");
            require(transaction.numConfirmations >= numConfirmationsRequired, "Minimum confirmation not met!");
            require(transaction.to == _state, "Num provided is not an approved Num!");
            executeCurrentNumberTransaction();
            numConfirmationsRequired = _state;
        }
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setCollector(address _state) public onlyOwner {
        collector = _state;
    }

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

    function setPublicCost(uint256 _cost) public onlyOwner {
        publicCost = _cost;
    }

    function setPresaleCost(uint256 _cost) public onlyOwner {
        presaleCost = _cost;
    }

    function setPublicSale(bool _sale) public onlyOwner {
        saleActive = _sale;
    }

    function setPreSale(bool _sale) public onlyOwner {
        presaleActive = _sale;
    }

    function setPresaleMaxWalletLimit(uint256 _maxWalletLimit) public onlyOwner {
        maxPresaleWalletLimit = _maxWalletLimit;
    }

    function setPublicSaleMaxWalletLimit(uint256 _maxWalletLimit) public onlyOwner {
        maxPublicSaleWalletLimit = _maxWalletLimit;
    }

    function setPublicMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
        maxPublicMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setPresaleMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
        maxPresaleMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance is 0");
        require(trxIndex > 0, "Transaction not found!");
        require(owners.length > 0, "owners required");
        require(
                numConfirmationsRequired > 0 &&
                    numConfirmationsRequired <= owners.length,
                "invalid number of required confirmations"
            );
        Transaction storage transaction = transactions[trxIndex - 1];
        require(transaction.executed == false, "No active transaction request found!");
        require(transaction.numConfirmations >= numConfirmationsRequired, "Minimum confirmation not met!");
        executeCurrentTransaction();
        payable(collector).transfer(address(this).balance);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ConfirmChangeNumberTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ConfirmChangeOwnerTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ConfirmTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ExecuteChangeNumberTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ExecuteChangeOwnerTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"RevokeChangeNumberConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"RevokeChangeOwnerConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"}],"name":"RevokeConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"to","type":"uint256"}],"name":"SubmitChangeNumberTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"SubmitChangeOwnerTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"txIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"SubmitTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"confirmCurrentNumberTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmCurrentOwnerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmCurrentTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"getNumberTransaction","outputs":[{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"getOwnerTransaction","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txIndex","type":"uint256"}],"name":"getTransaction","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialNumberSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialOwnersSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isNumberConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isOwnerConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSaleWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForSelf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numConfirmationsRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokecurrentConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokecurrentNumberConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokecurrentOwnerConfirmation","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_state","type":"address"}],"name":"setCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setNumConfirmationsRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"}],"name":"setOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sale","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setPresaleMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletLimit","type":"uint256"}],"name":"setPresaleMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setPublicMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sale","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletLimit","type":"uint256"}],"name":"setPublicSaleMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"submitNumberTransaction","outputs":[{"internalType":"uint256","name":"txNuberIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"submitOwnerTransaction","outputs":[{"internalType":"uint256","name":"txOwnerIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"txIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactionsNumber","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactionsOwner","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"numConfirmations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trxIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trxNumberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trxOwnerIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600a91620001ae565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600b91620001ae565b5066c3663566a58000600d55670186cc6acd4b0000600e55610bb8600f55600a6010819055601181905560125560146013819055805463ffffffff191660011790556016805461ffff191690556000601a819055601b819055601c55602380546001600160a01b0319167326e3ebde1a963f8a78e09e4811bc9740ae33dae8179055348015620000d957600080fd5b50604080518082018252600a8152690b4dedac4d2ca409ac2f60b31b6020808301918252835180850190945260048452630b49a82b60e31b9084015281519192916200012891600291620001ae565b5080516200013e906003906020840190620001ae565b505060016000555062000151336200015c565b600160095562000291565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001bc9062000254565b90600052602060002090601f016020900481019282620001e057600085556200022b565b82601f10620001fb57805160ff19168380011785556200022b565b828001600101855582156200022b579182015b828111156200022b5782518255916020019190600101906200020e565b50620002399291506200023d565b5090565b5b808211156200023957600081556001016200023e565b600181811c908216806200026957607f821691505b602082108114156200028b57634e487b7160e01b600052602260045260246000fd5b50919050565b61528f80620002a16000396000f3fe6080604052600436106104aa5760003560e01c80636352211e1161026b578063a34df5891161014f578063d38f7e91116100c1578063ec7fdc5011610085578063ec7fdc5014610e9b578063efbd73f414610ed6578063f2fde38b14610ef6578063fa4d369814610f16578063fb5b82d014610f36578063fc3b3d9e14610f5657600080fd5b8063d38f7e9114610dcc578063d5abeb0114610e07578063dc6b576414610e1d578063e0a8085314610e32578063e985e9c514610e5257600080fd5b8063be8f624811610113578063be8f624814610d08578063c0ac01ff14610d4e578063c49b3d5414610d63578063c87b56dd14610d83578063cebbaf5514610da3578063d0549b8514610db657600080fd5b8063a34df58914610c88578063a45ba8e714610c9e578063ab13065a14610cb3578063b88d4fde14610cd3578063b9fe06d314610cf357600080fd5b80638da5cb5b116101e857806395d89b41116101ac57806395d89b4114610bad5780639ace38c214610bc2578063a0712d6814610be2578063a0e67e2b14610bf5578063a22cb46514610c17578063a2763b6314610c3757600080fd5b80638da5cb5b14610aff5780638f02565614610b1d5780638fdcf94214610b3d5780639286c39714610b5d57806394354fd014610b9857600080fd5b80637cb647591161022f5780637cb6475914610a4e5780637ec4a65914610a6e57806380f59a6514610a8e578063811d243714610ac95780638693da2014610ae957600080fd5b80636352211e146109c457806366a88d96146109e457806368428a1b146109f957806370a0823114610a19578063715018a614610a3957600080fd5b80632f54bf6e116103925780634fdd43cb1161030f578063562a0a0c116102d3578063562a0a0c14610920578063565dc391146109365780635aca1bb61461094b5780635c975abb1461096b5780635ef7cd97146109855780636016ed5f146109a557600080fd5b80634fdd43cb1461089557806351830227146108b557806353135ca0146108d6578063535483f0146108f55780635503a0e81461090b57600080fd5b8063438b630011610356578063438b63001461080357806344cb7a9b1461083057806346f797fa1461084a57806349d3a2c5146108605780634c5003d51461088057600080fd5b80632f54bf6e1461076957806333ea3dc8146107995780633caed876146107b95780633ccfd60b146107ce57806342842e0e146107e357600080fd5b806316c38b3c1161042b57806328893e1d116103ef57806328893e1d146106a3578063299a7bcc146106c35780632a23d07d146106e35780632aad1f74146106f95780632b9f965b1461070f5780632e7700f01461075457600080fd5b806316c38b3c14610619578063178dd4e31461063957806318160ddd1461064e57806323b872dd14610663578063274690801461068357600080fd5b80630d95ccc9116104725780630d95ccc9146105805780630daafd84146105a057806313faede6146105ce5780631509b1ec146105e357806316ba10e0146105f957600080fd5b806301ffc9a7146104af578063025e7c27146104e457806306fdde031461051c578063081812fc1461053e578063095ea7b31461055e575b600080fd5b3480156104bb57600080fd5b506104cf6104ca366004614a1b565b610f6c565b60405190151581526020015b60405180910390f35b3480156104f057600080fd5b506105046104ff366004614a02565b610fbe565b6040516001600160a01b0390911681526020016104db565b34801561052857600080fd5b50610531610fe8565b6040516104db9190614d1e565b34801561054a57600080fd5b50610504610559366004614a02565b61107a565b34801561056a57600080fd5b5061057e61057936600461491a565b6110be565b005b34801561058c57600080fd5b5061057e61059b3660046149e7565b61114c565b3480156105ac57600080fd5b506105c06105bb366004614806565b611199565b6040519081526020016104db565b3480156105da57600080fd5b506105c0611316565b3480156105ef57600080fd5b506105c0601b5481565b34801561060557600080fd5b5061057e610614366004614a55565b611337565b34801561062557600080fd5b5061057e6106343660046149e7565b611378565b34801561064557600080fd5b5061057e6113b5565b34801561065a57600080fd5b506105c0611571565b34801561066f57600080fd5b5061057e61067e366004614839565b61157f565b34801561068f57600080fd5b506105c061069e366004614a02565b61158a565b3480156106af57600080fd5b5061057e6106be366004614a02565b6116ee565b3480156106cf57600080fd5b5061057e6106de366004614806565b6118a0565b3480156106ef57600080fd5b506105c0600d5481565b34801561070557600080fd5b506105c060105481565b34801561071b57600080fd5b5061072f61072a366004614a02565b611ab9565b604080516001600160a01b0390941684529115156020840152908201526060016104db565b34801561076057600080fd5b506020546105c0565b34801561077557600080fd5b506104cf6107843660046147eb565b60186020526000908152604090205460ff1681565b3480156107a557600080fd5b5061072f6107b4366004614a02565b611b40565b3480156107c557600080fd5b506105c0611bc1565b3480156107da57600080fd5b5061057e611d01565b3480156107ef57600080fd5b5061057e6107fe366004614839565b611ea3565b34801561080f57600080fd5b5061082361081e3660046147eb565b611ebe565b6040516104db9190614ce6565b34801561083c57600080fd5b506016546104cf9060ff1681565b34801561085657600080fd5b506105c0601c5481565b34801561086c57600080fd5b5061057e61087b366004614a02565b611f9e565b34801561088c57600080fd5b5061057e611fcd565b3480156108a157600080fd5b5061057e6108b0366004614a55565b6121d7565b3480156108c157600080fd5b506014546104cf906301000000900460ff1681565b3480156108e257600080fd5b506014546104cf90610100900460ff1681565b34801561090157600080fd5b506105c0601a5481565b34801561091757600080fd5b50610531612214565b34801561092c57600080fd5b506105c060135481565b34801561094257600080fd5b5061057e6122a2565b34801561095757600080fd5b5061057e6109663660046149e7565b6124b0565b34801561097757600080fd5b506014546104cf9060ff1681565b34801561099157600080fd5b5061057e6109a0366004614a02565b6124f6565b3480156109b157600080fd5b506016546104cf90610100900460ff1681565b3480156109d057600080fd5b506105046109df366004614a02565b612525565b3480156109f057600080fd5b506105c0612537565b348015610a0557600080fd5b506014546104cf9062010000900460ff1681565b348015610a2557600080fd5b506105c0610a343660046147eb565b612558565b348015610a4557600080fd5b5061057e6125a6565b348015610a5a57600080fd5b5061057e610a69366004614a02565b6125dc565b348015610a7a57600080fd5b5061057e610a89366004614a55565b61260b565b348015610a9a57600080fd5b506104cf610aa9366004614a9d565b601d60209081526000928352604080842090915290825290205460ff1681565b348015610ad557600080fd5b5061057e610ae4366004614a02565b612648565b348015610af557600080fd5b506105c0600e5481565b348015610b0b57600080fd5b506008546001600160a01b0316610504565b348015610b2957600080fd5b5061057e610b38366004614a02565b612677565b348015610b4957600080fd5b5061057e610b58366004614a02565b6126a6565b348015610b6957600080fd5b506104cf610b78366004614a9d565b601f60209081526000928352604080842090915290825290205460ff1681565b348015610ba457600080fd5b506105c06126d5565b348015610bb957600080fd5b506105316126f6565b348015610bce57600080fd5b5061072f610bdd366004614a02565b612705565b61057e610bf0366004614a02565b612748565b348015610c0157600080fd5b50610c0a6128bd565b6040516104db9190614c99565b348015610c2357600080fd5b5061057e610c323660046148f0565b61291e565b348015610c4357600080fd5b50610c57610c52366004614a02565b6129b4565b604080516001600160a01b0395861681529490931660208501529015159183019190915260608201526080016104db565b348015610c9457600080fd5b506105c060115481565b348015610caa57600080fd5b50610531612a00565b348015610cbf57600080fd5b5061057e610cce366004614a02565b612a0d565b348015610cdf57600080fd5b5061057e610cee366004614875565b612a3c565b348015610cff57600080fd5b5061057e612a8d565b348015610d1457600080fd5b50610d28610d23366004614a02565b612c45565b6040805194855260208501939093529015159183019190915260608201526080016104db565b348015610d5a57600080fd5b5061057e612c82565b348015610d6f57600080fd5b5061057e610d7e366004614a02565b612e42565b348015610d8f57600080fd5b50610531610d9e366004614a02565b612ec1565b61057e610db1366004614ac0565b613032565b348015610dc257600080fd5b506105c060195481565b348015610dd857600080fd5b50610dec610de7366004614a02565b6132e5565b604080519384529115156020840152908201526060016104db565b348015610e1357600080fd5b506105c0600f5481565b348015610e2957600080fd5b5061057e61335f565b348015610e3e57600080fd5b5061057e610e4d3660046149e7565b613571565b348015610e5e57600080fd5b506104cf610e6d366004614806565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610ea757600080fd5b506104cf610eb6366004614a9d565b601e60209081526000928352604080842090915290825290205460ff1681565b348015610ee257600080fd5b5061057e610ef1366004614a9d565b6135b9565b348015610f0257600080fd5b5061057e610f113660046147eb565b613679565b348015610f2257600080fd5b5061057e610f31366004614944565b613711565b348015610f4257600080fd5b5061057e610f513660046147eb565b6137ea565b348015610f6257600080fd5b506105c060125481565b60006001600160e01b031982166380ac58cd60e01b1480610f9d57506001600160e01b03198216635b5e139f60e01b145b80610fb857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60178181548110610fce57600080fd5b6000918252602090912001546001600160a01b0316905081565b606060028054610ff790615181565b80601f016020809104026020016040519081016040528092919081815260200182805461102390615181565b80156110705780601f1061104557610100808354040283529160200191611070565b820191906000526020600020905b81548152906001019060200180831161105357829003601f168201915b5050505050905090565b600061108582613836565b6110a2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006110c982612525565b9050806001600160a01b0316836001600160a01b031614156110fe5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061111e575061111c8133610e6d565b155b1561113c576040516367d9dca160e11b815260040160405180910390fd5b61114783838361386f565b505050565b6008546001600160a01b0316331461117f5760405162461bcd60e51b815260040161117690614e11565b60405180910390fd5b601480549115156101000261ff0019909216919091179055565b6008546000906001600160a01b031633146111c65760405162461bcd60e51b815260040161117690614e11565b6021546111d49060016150f3565b604080516080810182526001600160a01b0380861682528681166020830190815260009383018481526060840185815260218054600181018255908752945160039095027f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b570810180549686166001600160a01b03199097169690961790955591517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b5718501805492511515600160a01b026001600160a81b0319909316919094161717909155517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57290910155601b8054929350906112d0836151bc565b90915550506040516001600160a01b03808416919085169033907f5a3f9f01e5126a65618aa3ed4395c2f75b04fa71a92211806146518de5b7a75790600090a492915050565b601454600090610100900460ff16156113305750600d5490565b50600e5490565b6008546001600160a01b031633146113615760405162461bcd60e51b815260040161117690614e11565b805161137490600b9060208401906146cf565b5050565b6008546001600160a01b031633146113a25760405162461bcd60e51b815260040161117690614e11565b6014805460ff1916911515919091179055565b3360009081526018602052604090205460ff166113e45760405162461bcd60e51b815260040161117690614ffb565b601a5460205481146114085760405162461bcd60e51b815260040161117690614db8565b601a54602061141860018361513e565b8154811061142857611428615217565b6000918252602090912060029091020154600160a01b900460ff16156114605760405162461bcd60e51b815260040161117690614f79565b600060206001601a54611473919061513e565b8154811061148357611483615217565b90600052602060002090600202019050601d60006001601a546114a6919061513e565b81526020808201929092526040908101600090812033825290925290205460ff166114e35760405162461bcd60e51b815260040161117690614fa6565b60018160010160008282546114f8919061513e565b925050819055506000601d60006001601a54611514919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601a54905190927ff0dca620e2e81f7841d07bcc105e1704fb01475b278a9d4c236e1c62945edd5591a3505050565b600154600054036000190190565b6111478383836138cb565b6008546000906001600160a01b031633146115b75760405162461bcd60e51b815260040161117690614e11565b6022546115c59060016150f3565b604080516080810182526019548152602081018581526000928201838152606083018481526022805460018101825590865293517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51060049095029485015591517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e511840155517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5128301805460ff1916911515919091179055517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51390910155601c8054929350906116b3836151bc565b909155505060195460405183919033907f8c5f7831df4ee763756731d74d4e909b85620bf6e526e44f8a6ba9fb8c38327d90600090a4919050565b6008546001600160a01b031633146117185760405162461bcd60e51b815260040161117690614e11565b601654610100900460ff1661173b576019556016805461ff001916610100179055565b6000601c541161175d5760405162461bcd60e51b815260040161117690614d88565b60175461177c5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611792575060175460195411155b6117ae5760405162461bcd60e51b815260040161117690614f31565b600060226001601c546117c1919061513e565b815481106117d1576117d1615217565b60009182526020909120600490910201600281015490915060ff16156118095760405162461bcd60e51b815260040161117690614eed565b6019548160030154101561182f5760405162461bcd60e51b815260040161117690615069565b8181600101541461188e5760405162461bcd60e51b8152602060048201526024808201527f4e756d2070726f7669646564206973206e6f7420616e20617070726f766564206044820152634e756d2160e01b6064820152608401611176565b611896613adf565b5060198190555b50565b6008546001600160a01b031633146118ca5760405162461bcd60e51b815260040161117690614e11565b6000601b54116118ec5760405162461bcd60e51b815260040161117690614d88565b60175461190b5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611921575060175460195411155b61193d5760405162461bcd60e51b815260040161117690614f31565b600060216001601b54611950919061513e565b8154811061196057611960615217565b600091825260209091206003909102016001810154909150600160a01b900460ff161561199f5760405162461bcd60e51b815260040161117690614eed565b601954816002015410156119c55760405162461bcd60e51b815260040161117690615069565b80546001600160a01b03838116911614611a365760405162461bcd60e51b815260206004820152602c60248201527f416464726573732070726f7669646564206973206e6f7420616e20617070726f60448201526b76656420616464726573732160a01b6064820152608401611176565b611a3e613c1c565b6000611a4984613d67565b90508260178281548110611a5f57611a5f615217565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055958216815260189095526040808620805460ff1990811690915594909116855290932080549092166001179091555050565b6000806000602180549050841115611ae35760405162461bcd60e51b81526004016111769061501e565b60006021611af260018761513e565b81548110611b0257611b02615217565b60009182526020909120600390910201805460018201546002909201546001600160a01b0390911697600160a01b90920460ff169650945092505050565b6000806000602080549050841115611b6a5760405162461bcd60e51b81526004016111769061501e565b60006020611b7960018761513e565b81548110611b8957611b89615217565b6000918252602090912060029091020180546001909101546001600160a01b03821697600160a01b90920460ff169650945092505050565b6008546000906001600160a01b03163314611bee5760405162461bcd60e51b815260040161117690614e11565b602054611bfc9060016150f3565b602354604080516060810182526001600160a01b03928316808252600060208381018281529484018281528154600181018355918352935160029091027fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb8101805496511515600160a01b026001600160a81b031990971692909716919091179490941790945590517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90920191909155601a8054939450909291611cc0836151bc565b90915550506040516001600160a01b03821690839033907fe9a5429a8a068914a05dabee2cba2f9e22ec5ee1375f61c96cdcd2ba1228924790600090a45090565b6008546001600160a01b03163314611d2b5760405162461bcd60e51b815260040161117690614e11565b60004711611d6a5760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401611176565b6000601a5411611d8c5760405162461bcd60e51b815260040161117690614d88565b601754611dab5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611dc1575060175460195411155b611ddd5760405162461bcd60e51b815260040161117690614f31565b600060206001601a54611df0919061513e565b81548110611e0057611e00615217565b600091825260209091206002909102018054909150600160a01b900460ff1615611e3c5760405162461bcd60e51b815260040161117690614eed565b60195481600101541015611e625760405162461bcd60e51b815260040161117690615069565b611e6a613dfa565b6023546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611374573d6000803e3d6000fd5b61114783838360405180602001604052806000815250612a3c565b60606000611ecb83612558565b90506000816001600160401b03811115611ee757611ee761522d565b604051908082528060200260200182016040528015611f10578160200160208202803683370190505b509050600160005b8381108015611f295750600f548211155b15611f94576000611f3983612525565b9050866001600160a01b0316816001600160a01b03161415611f815782848381518110611f6857611f68615217565b602090810291909101015281611f7d816151bc565b9250505b82611f8b816151bc565b93505050611f18565b5090949350505050565b6008546001600160a01b03163314611fc85760405162461bcd60e51b815260040161117690614e11565b601055565b3360009081526018602052604090205460ff16611ffc5760405162461bcd60e51b815260040161117690614ffb565b601c5460225481146120205760405162461bcd60e51b815260040161117690614db8565b601c54602261203060018361513e565b8154811061204057612040615217565b600091825260209091206002600490920201015460ff16156120745760405162461bcd60e51b815260040161117690614f79565b601c54601f600061208660018461513e565b81526020808201929092526040908101600090812033825290925290205460ff16156120c45760405162461bcd60e51b815260040161117690614de3565b601f60006001601c546120d7919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156121155760405162461bcd60e51b815260040161117690614de3565b600060226001601c54612128919061513e565b8154811061213857612138615217565b90600052602060002090600402019050600181600301600082825461215d91906150f3565b925050819055506001601f60006001601c54612179919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601c54905190927f55fac8ec3c6472e1dfdf502b559a257fb8d92c55097ea09a047687d061e0c5bf91a350505050565b6008546001600160a01b031633146122015760405162461bcd60e51b815260040161117690614e11565b805161137490600c9060208401906146cf565b600b805461222190615181565b80601f016020809104026020016040519081016040528092919081815260200182805461224d90615181565b801561229a5780601f1061226f5761010080835404028352916020019161229a565b820191906000526020600020905b81548152906001019060200180831161227d57829003601f168201915b505050505081565b3360009081526018602052604090205460ff166122d15760405162461bcd60e51b815260040161117690614ffb565b601a5460205481146122f55760405162461bcd60e51b815260040161117690614db8565b601a54602061230560018361513e565b8154811061231557612315615217565b6000918252602090912060029091020154600160a01b900460ff161561234d5760405162461bcd60e51b815260040161117690614f79565b601a54601d600061235f60018461513e565b81526020808201929092526040908101600090812033825290925290205460ff161561239d5760405162461bcd60e51b815260040161117690614de3565b601d60006001601a546123b0919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156123ee5760405162461bcd60e51b815260040161117690614de3565b600060206001601a54612401919061513e565b8154811061241157612411615217565b90600052602060002090600202019050600181600101600082825461243691906150f3565b925050819055506001601d60006001601a54612452919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601a54905190927f5cbe105e36805f7820e291f799d5794ff948af2a5f664e580382defb6339004191a350505050565b6008546001600160a01b031633146124da5760405162461bcd60e51b815260040161117690614e11565b60148054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146125205760405162461bcd60e51b815260040161117690614e11565b601255565b600061253082613f3d565b5192915050565b601454600090610100900460ff1615612551575060125490565b5060135490565b60006001600160a01b038216612581576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146125d05760405162461bcd60e51b815260040161117690614e11565b6125da6000614064565b565b6008546001600160a01b031633146126065760405162461bcd60e51b815260040161117690614e11565b601555565b6008546001600160a01b031633146126355760405162461bcd60e51b815260040161117690614e11565b805161137490600a9060208401906146cf565b6008546001600160a01b031633146126725760405162461bcd60e51b815260040161117690614e11565b600e55565b6008546001600160a01b031633146126a15760405162461bcd60e51b815260040161117690614e11565b601155565b6008546001600160a01b031633146126d05760405162461bcd60e51b815260040161117690614e11565b600d55565b601454600090610100900460ff16156126ef575060115490565b5060105490565b606060038054610ff790615181565b6020818154811061271557600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0382169250600160a01b90910460ff169083565b601454819060ff161561276d5760405162461bcd60e51b815260040161117690614e46565b60008111801561278457506127806126d5565b8111155b6127a05760405162461bcd60e51b815260040161117690614d5a565b600f54816127ac611571565b6127b691906150f3565b11156127d45760405162461bcd60e51b815260040161117690614e7d565b60145462010000900460ff166128215760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b6044820152606401611176565b8161282a611316565b612834919061511f565b3410156128795760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401611176565b612881612537565b8261288b33612558565b61289591906150f3565b11156128b35760405162461bcd60e51b815260040161117690614eab565b61137433836140b6565b6060601780548060200260200160405190810160405280929190818152602001828054801561107057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128f7575050505050905090565b6001600160a01b0382163314156129485760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b602181815481106129c457600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935090821691600160a01b900460ff169084565b600c805461222190615181565b6008546001600160a01b03163314612a375760405162461bcd60e51b815260040161117690614e11565b601355565b612a478484846138cb565b6001600160a01b0383163b15158015612a695750612a67848484846140d0565b155b15612a87576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3360009081526018602052604090205460ff16612abc5760405162461bcd60e51b815260040161117690614ffb565b601c546022548114612ae05760405162461bcd60e51b815260040161117690614db8565b601c546022612af060018361513e565b81548110612b0057612b00615217565b600091825260209091206002600490920201015460ff1615612b345760405162461bcd60e51b815260040161117690614f79565b600060226001601c54612b47919061513e565b81548110612b5757612b57615217565b90600052602060002090600402019050601f60006001601c54612b7a919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16612bb75760405162461bcd60e51b815260040161117690614fa6565b6001816003016000828254612bcc919061513e565b925050819055506000601f60006001601c54612be8919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601c54905190927f522b374a854e9b59227e83e8b55a610861d2c90fe89fde0425766c4234a4a46591a3505050565b60228181548110612c5557600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193509160ff169084565b3360009081526018602052604090205460ff16612cb15760405162461bcd60e51b815260040161117690614ffb565b601b546021548114612cd55760405162461bcd60e51b815260040161117690614db8565b601b546021612ce560018361513e565b81548110612cf557612cf5615217565b906000526020600020906003020160010160149054906101000a900460ff1615612d315760405162461bcd60e51b815260040161117690614f79565b600060216001601b54612d44919061513e565b81548110612d5457612d54615217565b90600052602060002090600302019050601e60006001601b54612d77919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16612db45760405162461bcd60e51b815260040161117690614fa6565b6001816002016000828254612dc9919061513e565b925050819055506000601e60006001601b54612de5919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601b54905190927f137e87fedbd5b7a4217039dbc94b8bd6638d1a41b4038f6bebcb324b6c7b3f0f91a3505050565b8060008111612e635760405162461bcd60e51b815260040161117690614d5a565b600f5481612e6f611571565b612e7991906150f3565b1115612e975760405162461bcd60e51b815260040161117690614e7d565b6008546001600160a01b031633146128b35760405162461bcd60e51b815260040161117690614e11565b6060612ecc82613836565b612f305760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611176565b6014546301000000900460ff16612fd357600c8054612f4e90615181565b80601f0160208091040260200160405190810160405280929190818152602001828054612f7a90615181565b8015612fc75780601f10612f9c57610100808354040283529160200191612fc7565b820191906000526020600020905b815481529060010190602001808311612faa57829003601f168201915b50505050509050919050565b6000612fdd6141c8565b90506000815111612ffd576040518060200160405280600081525061302b565b80613007846141d7565b600b60405160200161301b93929190614b98565b6040516020818303038152906040525b9392505050565b601454839060ff16156130575760405162461bcd60e51b815260040161117690614e46565b60008111801561306e575061306a6126d5565b8111155b61308a5760405162461bcd60e51b815260040161117690614d5a565b600f5481613096611571565b6130a091906150f3565b11156130be5760405162461bcd60e51b815260040161117690614e7d565b601454610100900460ff1661310a5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b6044820152606401611176565b60155461314f5760405162461bcd60e51b815260206004820152601360248201527213595c9adb1948149bdbdd081b9bdd081cd95d606a1b6044820152606401611176565b6040516bffffffffffffffffffffffff193360601b166020820152839060340160405160208183030381529060405280519060200120146131e45760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d656044820152683935b632903632b0b360b91b6064820152608401611176565b6131f160155484846142d4565b6132495760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201526272656560e81b6064820152608401611176565b83613252611316565b61325c919061511f565b3410156132a15760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401611176565b6132a9612537565b846132b333612558565b6132bd91906150f3565b11156132db5760405162461bcd60e51b815260040161117690614eab565b612a8733856140b6565b600080600060228054905084111561330f5760405162461bcd60e51b81526004016111769061501e565b6000602261331e60018761513e565b8154811061332e5761332e615217565b6000918252602090912060049091020160018101546002820154600390920154909760ff9092169650945092505050565b3360009081526018602052604090205460ff1661338e5760405162461bcd60e51b815260040161117690614ffb565b601b5460215481146133b25760405162461bcd60e51b815260040161117690614db8565b601b5460216133c260018361513e565b815481106133d2576133d2615217565b906000526020600020906003020160010160149054906101000a900460ff161561340e5760405162461bcd60e51b815260040161117690614f79565b601b54601e600061342060018461513e565b81526020808201929092526040908101600090812033825290925290205460ff161561345e5760405162461bcd60e51b815260040161117690614de3565b601e60006001601b54613471919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156134af5760405162461bcd60e51b815260040161117690614de3565b600060216001601b546134c2919061513e565b815481106134d2576134d2615217565b9060005260206000209060030201905060018160020160008282546134f791906150f3565b925050819055506001601e60006001601b54613513919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601b54905190927f7d4845cb7989d302732b5b83b397abec3a7e1013c3edd5f1a445730d71e6ab0191a350505050565b6008546001600160a01b0316331461359b5760405162461bcd60e51b815260040161117690614e11565b6014805491151563010000000263ff00000019909216919091179055565b601454829060ff16156135de5760405162461bcd60e51b815260040161117690614e46565b6000811180156135f557506135f16126d5565b8111155b6136115760405162461bcd60e51b815260040161117690614d5a565b600f548161361d611571565b61362791906150f3565b11156136455760405162461bcd60e51b815260040161117690614e7d565b6008546001600160a01b0316331461366f5760405162461bcd60e51b815260040161117690614e11565b61114782846140b6565b6008546001600160a01b031633146136a35760405162461bcd60e51b815260040161117690614e11565b6001600160a01b0381166137085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611176565b61189d81614064565b6008546001600160a01b0316331461373b5760405162461bcd60e51b815260040161117690614e11565b60165460ff16156137cf5760405162461bcd60e51b815260206004820152605260248201527f4f776e6572732063616e20626520736574206f6e6c79206f6e63652e20506c6560448201527f6173652072616973652061207265717565737420746f2075706461746520746860648201527132903830b93a34b1bab630b91037bbb732b960711b608482015260a401611176565b6137d8816142e1565b61189d6016805460ff19166001179055565b6008546001600160a01b031633146138145760405162461bcd60e51b815260040161117690614e11565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b60008160011115801561384a575060005482105b8015610fb8575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006138d682613f3d565b80519091506000906001600160a01b0316336001600160a01b03161480613904575081516139049033610e6d565b8061391f5750336139148461107a565b6001600160a01b0316145b90508061393f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146139745760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661399b57604051633a954ecd60e21b815260040160405180910390fd5b6139ab600084846000015161386f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116613a9557600054811015613a9557825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6008546001600160a01b03163314613b095760405162461bcd60e51b815260040161117690614e11565b601c546022548114613b2d5760405162461bcd60e51b815260040161117690614db8565b601c546022613b3d60018361513e565b81548110613b4d57613b4d615217565b600091825260209091206002600490920201015460ff1615613b815760405162461bcd60e51b815260040161117690614f79565b600060226001601c54613b94919061513e565b81548110613ba457613ba4615217565b9060005260206000209060040201905060195481600301541015613bda5760405162461bcd60e51b815260040161117690614fd0565b60028101805460ff19166001179055601c5460405133907f37605548c2760632e63060c14a3acc6bdad6536285ab9eb0b91c2f99320e456b90600090a3505050565b6008546001600160a01b03163314613c465760405162461bcd60e51b815260040161117690614e11565b601b546021548114613c6a5760405162461bcd60e51b815260040161117690614db8565b601b546021613c7a60018361513e565b81548110613c8a57613c8a615217565b906000526020600020906003020160010160149054906101000a900460ff1615613cc65760405162461bcd60e51b815260040161117690614f79565b600060216001601b54613cd9919061513e565b81548110613ce957613ce9615217565b9060005260206000209060030201905060195481600201541015613d1f5760405162461bcd60e51b815260040161117690614fd0565b60018101805460ff60a01b1916600160a01b179055601b5460405133907f2de58dbb393279e477a5337466666ff63011a1c94085c040f7e0d09e1be1714690600090a3505050565b6000805b601754811015613dc557826001600160a01b031660178281548110613d9257613d92615217565b6000918252602090912001546001600160a01b03161415613db35792915050565b80613dbd816151bc565b915050613d6b565b5060405162461bcd60e51b8152602060048201526009602482015268139bdd08119bdd5b9960ba1b6044820152606401611176565b6008546001600160a01b03163314613e245760405162461bcd60e51b815260040161117690614e11565b601a546020548114613e485760405162461bcd60e51b815260040161117690614db8565b601a546020613e5860018361513e565b81548110613e6857613e68615217565b6000918252602090912060029091020154600160a01b900460ff1615613ea05760405162461bcd60e51b815260040161117690614f79565b600060206001601a54613eb3919061513e565b81548110613ec357613ec3615217565b9060005260206000209060020201905060195481600101541015613ef95760405162461bcd60e51b815260040161117690614fd0565b805460ff60a01b1916600160a01b178155601a5460405133907f5445f318f4f5fcfb66592e68e0cc5822aa15664039bd5f0ffde24c5a8142b1ac90600090a3505050565b60408051606081018252600080825260208201819052918101919091528180600111158015613f6d575060005481105b1561404b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906140495780516001600160a01b031615613fe0579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215614044579392505050565b613fe0565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611374828260405180602001604052806000815250614430565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290614105903390899088908890600401614c5c565b602060405180830381600087803b15801561411f57600080fd5b505af192505050801561414f575060408051601f3d908101601f1916820190925261414c91810190614a38565b60015b6141aa573d80801561417d576040519150601f19603f3d011682016040523d82523d6000602084013e614182565b606091505b5080516141a2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610ff790615181565b6060816141fb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614225578061420f816151bc565b915061421e9050600a8361510b565b91506141ff565b6000816001600160401b0381111561423f5761423f61522d565b6040519080825280601f01601f191660200182016040528015614269576020820181803683370190505b5090505b84156141c05761427e60018361513e565b915061428b600a866151d7565b6142969060306150f3565b60f81b8183815181106142ab576142ab615217565b60200101906001600160f81b031916908160001a9053506142cd600a8661510b565b945061426d565b60006141c082858561443d565b60005b815181101561137457600082828151811061430157614301615217565b6020026020010151905060006001600160a01b0316816001600160a01b0316141561435e5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b6044820152606401611176565b6001600160a01b03811660009081526018602052604090205460ff16156143ba5760405162461bcd60e51b815260206004820152601060248201526f6f776e6572206e6f7420756e6971756560801b6044820152606401611176565b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556017805491820181559091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b031916909117905580614428816151bc565b9150506142e4565b6111478383836001614453565b60008261444a8584614623565b14949350505050565b6000546001600160a01b03851661447c57604051622e076360e81b815260040160405180910390fd5b8361449a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561454b57506001600160a01b0387163b15155b156145d4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461459c60008884806001019550886140d0565b6145b9576040516368d2bf6b60e11b815260040160405180910390fd5b808214156145515782600054146145cf57600080fd5b61461a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156145d5575b50600055613ad8565b600081815b84518110156146c757600085828151811061464557614645615217565b602002602001015190508083116146875760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506146b4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806146bf816151bc565b915050614628565b509392505050565b8280546146db90615181565b90600052602060002090601f0160209004810192826146fd5760008555614743565b82601f1061471657805160ff1916838001178555614743565b82800160010185558215614743579182015b82811115614743578251825591602001919060010190614728565b5061474f929150614753565b5090565b5b8082111561474f5760008155600101614754565b60006001600160401b038311156147815761478161522d565b614794601f8401601f19166020016150a0565b90508281528383830111156147a857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146147d657600080fd5b919050565b803580151581146147d657600080fd5b6000602082840312156147fd57600080fd5b61302b826147bf565b6000806040838503121561481957600080fd5b614822836147bf565b9150614830602084016147bf565b90509250929050565b60008060006060848603121561484e57600080fd5b614857846147bf565b9250614865602085016147bf565b9150604084013590509250925092565b6000806000806080858703121561488b57600080fd5b614894856147bf565b93506148a2602086016147bf565b92506040850135915060608501356001600160401b038111156148c457600080fd5b8501601f810187136148d557600080fd5b6148e487823560208401614768565b91505092959194509250565b6000806040838503121561490357600080fd5b61490c836147bf565b9150614830602084016147db565b6000806040838503121561492d57600080fd5b614936836147bf565b946020939093013593505050565b6000602080838503121561495757600080fd5b82356001600160401b0381111561496d57600080fd5b8301601f8101851361497e57600080fd5b803561499161498c826150d0565b6150a0565b80828252848201915084840188868560051b87010111156149b157600080fd5b600094505b838510156149db576149c7816147bf565b8352600194909401939185019185016149b6565b50979650505050505050565b6000602082840312156149f957600080fd5b61302b826147db565b600060208284031215614a1457600080fd5b5035919050565b600060208284031215614a2d57600080fd5b813561302b81615243565b600060208284031215614a4a57600080fd5b815161302b81615243565b600060208284031215614a6757600080fd5b81356001600160401b03811115614a7d57600080fd5b8201601f81018413614a8e57600080fd5b6141c084823560208401614768565b60008060408385031215614ab057600080fd5b82359150614830602084016147bf565b600080600060608486031215614ad557600080fd5b83359250602080850135925060408501356001600160401b03811115614afa57600080fd5b8501601f81018713614b0b57600080fd5b8035614b1961498c826150d0565b8082825284820191508484018a868560051b8701011115614b3957600080fd5b600094505b83851015614b5c578035835260019490940193918501918501614b3e565b5080955050505050509250925092565b60008151808452614b84816020860160208601615155565b601f01601f19169290920160200192915050565b600084516020614bab8285838a01615155565b855191840191614bbe8184848a01615155565b8554920191600090600181811c9080831680614bdb57607f831692505b858310811415614bf957634e487b7160e01b85526022600452602485fd5b808015614c0d5760018114614c1e57614c4b565b60ff19851688528388019550614c4b565b60008b81526020902060005b85811015614c435781548a820152908401908801614c2a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c8f90830184614b6c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cda5783516001600160a01b031683529284019291840191600101614cb5565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cda57835183529284019291840191600101614d02565b60208152600061302b6020830184614b6c565b6020808252600f908201526e1bdddb995c9cc81c995c5d5a5c9959608a1b604082015260600190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601690820152755472616e73616374696f6e206e6f7420666f756e642160501b604082015260600190565b6020808252601190820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b604082015260600190565b6020808252601490820152731d1e08185b1c9958591e4818dbdb999a5c9b595960621b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526022908201527f4d6178206d696e7420616d6f756e74207065722077616c6c6574207265616368604082015261195960f21b606082015260800190565b60208082526024908201527f4e6f20616374697665207472616e73616374696f6e207265717565737420666f604082015263756e642160e01b606082015260800190565b60208082526028908201527f696e76616c6964206e756d626572206f6620726571756972656420636f6e6669604082015267726d6174696f6e7360c01b606082015260800190565b6020808252601390820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b604082015260600190565b60208082526010908201526f1d1e081b9bdd0818dbdb999a5c9b595960821b604082015260600190565b6020808252601190820152700c6c2dcdcdee840caf0cac6eae8ca40e8f607b1b604082015260600190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b6020808252602b908201527f496e64657820657863656564207468652063757272656e74207472616e73616360408201526a0e8d2dedc40d8cadccee8d60ab1b606082015260800190565b6020808252601d908201527f4d696e696d756d20636f6e6669726d6174696f6e206e6f74206d657421000000604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156150c8576150c861522d565b604052919050565b60006001600160401b038211156150e9576150e961522d565b5060051b60200190565b60008219821115615106576151066151eb565b500190565b60008261511a5761511a615201565b500490565b6000816000190483118215151615615139576151396151eb565b500290565b600082821015615150576151506151eb565b500390565b60005b83811015615170578181015183820152602001615158565b83811115612a875750506000910152565b600181811c9082168061519557607f821691505b602082108114156151b657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151d0576151d06151eb565b5060010190565b6000826151e6576151e6615201565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461189d57600080fdfea2646970667358221220716a0295c19528c3f3998358cb276fc8a1bc4a4c6636780f11ac2931e00dbfd964736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104aa5760003560e01c80636352211e1161026b578063a34df5891161014f578063d38f7e91116100c1578063ec7fdc5011610085578063ec7fdc5014610e9b578063efbd73f414610ed6578063f2fde38b14610ef6578063fa4d369814610f16578063fb5b82d014610f36578063fc3b3d9e14610f5657600080fd5b8063d38f7e9114610dcc578063d5abeb0114610e07578063dc6b576414610e1d578063e0a8085314610e32578063e985e9c514610e5257600080fd5b8063be8f624811610113578063be8f624814610d08578063c0ac01ff14610d4e578063c49b3d5414610d63578063c87b56dd14610d83578063cebbaf5514610da3578063d0549b8514610db657600080fd5b8063a34df58914610c88578063a45ba8e714610c9e578063ab13065a14610cb3578063b88d4fde14610cd3578063b9fe06d314610cf357600080fd5b80638da5cb5b116101e857806395d89b41116101ac57806395d89b4114610bad5780639ace38c214610bc2578063a0712d6814610be2578063a0e67e2b14610bf5578063a22cb46514610c17578063a2763b6314610c3757600080fd5b80638da5cb5b14610aff5780638f02565614610b1d5780638fdcf94214610b3d5780639286c39714610b5d57806394354fd014610b9857600080fd5b80637cb647591161022f5780637cb6475914610a4e5780637ec4a65914610a6e57806380f59a6514610a8e578063811d243714610ac95780638693da2014610ae957600080fd5b80636352211e146109c457806366a88d96146109e457806368428a1b146109f957806370a0823114610a19578063715018a614610a3957600080fd5b80632f54bf6e116103925780634fdd43cb1161030f578063562a0a0c116102d3578063562a0a0c14610920578063565dc391146109365780635aca1bb61461094b5780635c975abb1461096b5780635ef7cd97146109855780636016ed5f146109a557600080fd5b80634fdd43cb1461089557806351830227146108b557806353135ca0146108d6578063535483f0146108f55780635503a0e81461090b57600080fd5b8063438b630011610356578063438b63001461080357806344cb7a9b1461083057806346f797fa1461084a57806349d3a2c5146108605780634c5003d51461088057600080fd5b80632f54bf6e1461076957806333ea3dc8146107995780633caed876146107b95780633ccfd60b146107ce57806342842e0e146107e357600080fd5b806316c38b3c1161042b57806328893e1d116103ef57806328893e1d146106a3578063299a7bcc146106c35780632a23d07d146106e35780632aad1f74146106f95780632b9f965b1461070f5780632e7700f01461075457600080fd5b806316c38b3c14610619578063178dd4e31461063957806318160ddd1461064e57806323b872dd14610663578063274690801461068357600080fd5b80630d95ccc9116104725780630d95ccc9146105805780630daafd84146105a057806313faede6146105ce5780631509b1ec146105e357806316ba10e0146105f957600080fd5b806301ffc9a7146104af578063025e7c27146104e457806306fdde031461051c578063081812fc1461053e578063095ea7b31461055e575b600080fd5b3480156104bb57600080fd5b506104cf6104ca366004614a1b565b610f6c565b60405190151581526020015b60405180910390f35b3480156104f057600080fd5b506105046104ff366004614a02565b610fbe565b6040516001600160a01b0390911681526020016104db565b34801561052857600080fd5b50610531610fe8565b6040516104db9190614d1e565b34801561054a57600080fd5b50610504610559366004614a02565b61107a565b34801561056a57600080fd5b5061057e61057936600461491a565b6110be565b005b34801561058c57600080fd5b5061057e61059b3660046149e7565b61114c565b3480156105ac57600080fd5b506105c06105bb366004614806565b611199565b6040519081526020016104db565b3480156105da57600080fd5b506105c0611316565b3480156105ef57600080fd5b506105c0601b5481565b34801561060557600080fd5b5061057e610614366004614a55565b611337565b34801561062557600080fd5b5061057e6106343660046149e7565b611378565b34801561064557600080fd5b5061057e6113b5565b34801561065a57600080fd5b506105c0611571565b34801561066f57600080fd5b5061057e61067e366004614839565b61157f565b34801561068f57600080fd5b506105c061069e366004614a02565b61158a565b3480156106af57600080fd5b5061057e6106be366004614a02565b6116ee565b3480156106cf57600080fd5b5061057e6106de366004614806565b6118a0565b3480156106ef57600080fd5b506105c0600d5481565b34801561070557600080fd5b506105c060105481565b34801561071b57600080fd5b5061072f61072a366004614a02565b611ab9565b604080516001600160a01b0390941684529115156020840152908201526060016104db565b34801561076057600080fd5b506020546105c0565b34801561077557600080fd5b506104cf6107843660046147eb565b60186020526000908152604090205460ff1681565b3480156107a557600080fd5b5061072f6107b4366004614a02565b611b40565b3480156107c557600080fd5b506105c0611bc1565b3480156107da57600080fd5b5061057e611d01565b3480156107ef57600080fd5b5061057e6107fe366004614839565b611ea3565b34801561080f57600080fd5b5061082361081e3660046147eb565b611ebe565b6040516104db9190614ce6565b34801561083c57600080fd5b506016546104cf9060ff1681565b34801561085657600080fd5b506105c0601c5481565b34801561086c57600080fd5b5061057e61087b366004614a02565b611f9e565b34801561088c57600080fd5b5061057e611fcd565b3480156108a157600080fd5b5061057e6108b0366004614a55565b6121d7565b3480156108c157600080fd5b506014546104cf906301000000900460ff1681565b3480156108e257600080fd5b506014546104cf90610100900460ff1681565b34801561090157600080fd5b506105c0601a5481565b34801561091757600080fd5b50610531612214565b34801561092c57600080fd5b506105c060135481565b34801561094257600080fd5b5061057e6122a2565b34801561095757600080fd5b5061057e6109663660046149e7565b6124b0565b34801561097757600080fd5b506014546104cf9060ff1681565b34801561099157600080fd5b5061057e6109a0366004614a02565b6124f6565b3480156109b157600080fd5b506016546104cf90610100900460ff1681565b3480156109d057600080fd5b506105046109df366004614a02565b612525565b3480156109f057600080fd5b506105c0612537565b348015610a0557600080fd5b506014546104cf9062010000900460ff1681565b348015610a2557600080fd5b506105c0610a343660046147eb565b612558565b348015610a4557600080fd5b5061057e6125a6565b348015610a5a57600080fd5b5061057e610a69366004614a02565b6125dc565b348015610a7a57600080fd5b5061057e610a89366004614a55565b61260b565b348015610a9a57600080fd5b506104cf610aa9366004614a9d565b601d60209081526000928352604080842090915290825290205460ff1681565b348015610ad557600080fd5b5061057e610ae4366004614a02565b612648565b348015610af557600080fd5b506105c0600e5481565b348015610b0b57600080fd5b506008546001600160a01b0316610504565b348015610b2957600080fd5b5061057e610b38366004614a02565b612677565b348015610b4957600080fd5b5061057e610b58366004614a02565b6126a6565b348015610b6957600080fd5b506104cf610b78366004614a9d565b601f60209081526000928352604080842090915290825290205460ff1681565b348015610ba457600080fd5b506105c06126d5565b348015610bb957600080fd5b506105316126f6565b348015610bce57600080fd5b5061072f610bdd366004614a02565b612705565b61057e610bf0366004614a02565b612748565b348015610c0157600080fd5b50610c0a6128bd565b6040516104db9190614c99565b348015610c2357600080fd5b5061057e610c323660046148f0565b61291e565b348015610c4357600080fd5b50610c57610c52366004614a02565b6129b4565b604080516001600160a01b0395861681529490931660208501529015159183019190915260608201526080016104db565b348015610c9457600080fd5b506105c060115481565b348015610caa57600080fd5b50610531612a00565b348015610cbf57600080fd5b5061057e610cce366004614a02565b612a0d565b348015610cdf57600080fd5b5061057e610cee366004614875565b612a3c565b348015610cff57600080fd5b5061057e612a8d565b348015610d1457600080fd5b50610d28610d23366004614a02565b612c45565b6040805194855260208501939093529015159183019190915260608201526080016104db565b348015610d5a57600080fd5b5061057e612c82565b348015610d6f57600080fd5b5061057e610d7e366004614a02565b612e42565b348015610d8f57600080fd5b50610531610d9e366004614a02565b612ec1565b61057e610db1366004614ac0565b613032565b348015610dc257600080fd5b506105c060195481565b348015610dd857600080fd5b50610dec610de7366004614a02565b6132e5565b604080519384529115156020840152908201526060016104db565b348015610e1357600080fd5b506105c0600f5481565b348015610e2957600080fd5b5061057e61335f565b348015610e3e57600080fd5b5061057e610e4d3660046149e7565b613571565b348015610e5e57600080fd5b506104cf610e6d366004614806565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610ea757600080fd5b506104cf610eb6366004614a9d565b601e60209081526000928352604080842090915290825290205460ff1681565b348015610ee257600080fd5b5061057e610ef1366004614a9d565b6135b9565b348015610f0257600080fd5b5061057e610f113660046147eb565b613679565b348015610f2257600080fd5b5061057e610f31366004614944565b613711565b348015610f4257600080fd5b5061057e610f513660046147eb565b6137ea565b348015610f6257600080fd5b506105c060125481565b60006001600160e01b031982166380ac58cd60e01b1480610f9d57506001600160e01b03198216635b5e139f60e01b145b80610fb857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60178181548110610fce57600080fd5b6000918252602090912001546001600160a01b0316905081565b606060028054610ff790615181565b80601f016020809104026020016040519081016040528092919081815260200182805461102390615181565b80156110705780601f1061104557610100808354040283529160200191611070565b820191906000526020600020905b81548152906001019060200180831161105357829003601f168201915b5050505050905090565b600061108582613836565b6110a2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006110c982612525565b9050806001600160a01b0316836001600160a01b031614156110fe5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061111e575061111c8133610e6d565b155b1561113c576040516367d9dca160e11b815260040160405180910390fd5b61114783838361386f565b505050565b6008546001600160a01b0316331461117f5760405162461bcd60e51b815260040161117690614e11565b60405180910390fd5b601480549115156101000261ff0019909216919091179055565b6008546000906001600160a01b031633146111c65760405162461bcd60e51b815260040161117690614e11565b6021546111d49060016150f3565b604080516080810182526001600160a01b0380861682528681166020830190815260009383018481526060840185815260218054600181018255908752945160039095027f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b570810180549686166001600160a01b03199097169690961790955591517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b5718501805492511515600160a01b026001600160a81b0319909316919094161717909155517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57290910155601b8054929350906112d0836151bc565b90915550506040516001600160a01b03808416919085169033907f5a3f9f01e5126a65618aa3ed4395c2f75b04fa71a92211806146518de5b7a75790600090a492915050565b601454600090610100900460ff16156113305750600d5490565b50600e5490565b6008546001600160a01b031633146113615760405162461bcd60e51b815260040161117690614e11565b805161137490600b9060208401906146cf565b5050565b6008546001600160a01b031633146113a25760405162461bcd60e51b815260040161117690614e11565b6014805460ff1916911515919091179055565b3360009081526018602052604090205460ff166113e45760405162461bcd60e51b815260040161117690614ffb565b601a5460205481146114085760405162461bcd60e51b815260040161117690614db8565b601a54602061141860018361513e565b8154811061142857611428615217565b6000918252602090912060029091020154600160a01b900460ff16156114605760405162461bcd60e51b815260040161117690614f79565b600060206001601a54611473919061513e565b8154811061148357611483615217565b90600052602060002090600202019050601d60006001601a546114a6919061513e565b81526020808201929092526040908101600090812033825290925290205460ff166114e35760405162461bcd60e51b815260040161117690614fa6565b60018160010160008282546114f8919061513e565b925050819055506000601d60006001601a54611514919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601a54905190927ff0dca620e2e81f7841d07bcc105e1704fb01475b278a9d4c236e1c62945edd5591a3505050565b600154600054036000190190565b6111478383836138cb565b6008546000906001600160a01b031633146115b75760405162461bcd60e51b815260040161117690614e11565b6022546115c59060016150f3565b604080516080810182526019548152602081018581526000928201838152606083018481526022805460018101825590865293517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51060049095029485015591517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e511840155517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5128301805460ff1916911515919091179055517f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51390910155601c8054929350906116b3836151bc565b909155505060195460405183919033907f8c5f7831df4ee763756731d74d4e909b85620bf6e526e44f8a6ba9fb8c38327d90600090a4919050565b6008546001600160a01b031633146117185760405162461bcd60e51b815260040161117690614e11565b601654610100900460ff1661173b576019556016805461ff001916610100179055565b6000601c541161175d5760405162461bcd60e51b815260040161117690614d88565b60175461177c5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611792575060175460195411155b6117ae5760405162461bcd60e51b815260040161117690614f31565b600060226001601c546117c1919061513e565b815481106117d1576117d1615217565b60009182526020909120600490910201600281015490915060ff16156118095760405162461bcd60e51b815260040161117690614eed565b6019548160030154101561182f5760405162461bcd60e51b815260040161117690615069565b8181600101541461188e5760405162461bcd60e51b8152602060048201526024808201527f4e756d2070726f7669646564206973206e6f7420616e20617070726f766564206044820152634e756d2160e01b6064820152608401611176565b611896613adf565b5060198190555b50565b6008546001600160a01b031633146118ca5760405162461bcd60e51b815260040161117690614e11565b6000601b54116118ec5760405162461bcd60e51b815260040161117690614d88565b60175461190b5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611921575060175460195411155b61193d5760405162461bcd60e51b815260040161117690614f31565b600060216001601b54611950919061513e565b8154811061196057611960615217565b600091825260209091206003909102016001810154909150600160a01b900460ff161561199f5760405162461bcd60e51b815260040161117690614eed565b601954816002015410156119c55760405162461bcd60e51b815260040161117690615069565b80546001600160a01b03838116911614611a365760405162461bcd60e51b815260206004820152602c60248201527f416464726573732070726f7669646564206973206e6f7420616e20617070726f60448201526b76656420616464726573732160a01b6064820152608401611176565b611a3e613c1c565b6000611a4984613d67565b90508260178281548110611a5f57611a5f615217565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055958216815260189095526040808620805460ff1990811690915594909116855290932080549092166001179091555050565b6000806000602180549050841115611ae35760405162461bcd60e51b81526004016111769061501e565b60006021611af260018761513e565b81548110611b0257611b02615217565b60009182526020909120600390910201805460018201546002909201546001600160a01b0390911697600160a01b90920460ff169650945092505050565b6000806000602080549050841115611b6a5760405162461bcd60e51b81526004016111769061501e565b60006020611b7960018761513e565b81548110611b8957611b89615217565b6000918252602090912060029091020180546001909101546001600160a01b03821697600160a01b90920460ff169650945092505050565b6008546000906001600160a01b03163314611bee5760405162461bcd60e51b815260040161117690614e11565b602054611bfc9060016150f3565b602354604080516060810182526001600160a01b03928316808252600060208381018281529484018281528154600181018355918352935160029091027fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb8101805496511515600160a01b026001600160a81b031990971692909716919091179490941790945590517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90920191909155601a8054939450909291611cc0836151bc565b90915550506040516001600160a01b03821690839033907fe9a5429a8a068914a05dabee2cba2f9e22ec5ee1375f61c96cdcd2ba1228924790600090a45090565b6008546001600160a01b03163314611d2b5760405162461bcd60e51b815260040161117690614e11565b60004711611d6a5760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401611176565b6000601a5411611d8c5760405162461bcd60e51b815260040161117690614d88565b601754611dab5760405162461bcd60e51b815260040161117690614d31565b6000601954118015611dc1575060175460195411155b611ddd5760405162461bcd60e51b815260040161117690614f31565b600060206001601a54611df0919061513e565b81548110611e0057611e00615217565b600091825260209091206002909102018054909150600160a01b900460ff1615611e3c5760405162461bcd60e51b815260040161117690614eed565b60195481600101541015611e625760405162461bcd60e51b815260040161117690615069565b611e6a613dfa565b6023546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611374573d6000803e3d6000fd5b61114783838360405180602001604052806000815250612a3c565b60606000611ecb83612558565b90506000816001600160401b03811115611ee757611ee761522d565b604051908082528060200260200182016040528015611f10578160200160208202803683370190505b509050600160005b8381108015611f295750600f548211155b15611f94576000611f3983612525565b9050866001600160a01b0316816001600160a01b03161415611f815782848381518110611f6857611f68615217565b602090810291909101015281611f7d816151bc565b9250505b82611f8b816151bc565b93505050611f18565b5090949350505050565b6008546001600160a01b03163314611fc85760405162461bcd60e51b815260040161117690614e11565b601055565b3360009081526018602052604090205460ff16611ffc5760405162461bcd60e51b815260040161117690614ffb565b601c5460225481146120205760405162461bcd60e51b815260040161117690614db8565b601c54602261203060018361513e565b8154811061204057612040615217565b600091825260209091206002600490920201015460ff16156120745760405162461bcd60e51b815260040161117690614f79565b601c54601f600061208660018461513e565b81526020808201929092526040908101600090812033825290925290205460ff16156120c45760405162461bcd60e51b815260040161117690614de3565b601f60006001601c546120d7919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156121155760405162461bcd60e51b815260040161117690614de3565b600060226001601c54612128919061513e565b8154811061213857612138615217565b90600052602060002090600402019050600181600301600082825461215d91906150f3565b925050819055506001601f60006001601c54612179919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601c54905190927f55fac8ec3c6472e1dfdf502b559a257fb8d92c55097ea09a047687d061e0c5bf91a350505050565b6008546001600160a01b031633146122015760405162461bcd60e51b815260040161117690614e11565b805161137490600c9060208401906146cf565b600b805461222190615181565b80601f016020809104026020016040519081016040528092919081815260200182805461224d90615181565b801561229a5780601f1061226f5761010080835404028352916020019161229a565b820191906000526020600020905b81548152906001019060200180831161227d57829003601f168201915b505050505081565b3360009081526018602052604090205460ff166122d15760405162461bcd60e51b815260040161117690614ffb565b601a5460205481146122f55760405162461bcd60e51b815260040161117690614db8565b601a54602061230560018361513e565b8154811061231557612315615217565b6000918252602090912060029091020154600160a01b900460ff161561234d5760405162461bcd60e51b815260040161117690614f79565b601a54601d600061235f60018461513e565b81526020808201929092526040908101600090812033825290925290205460ff161561239d5760405162461bcd60e51b815260040161117690614de3565b601d60006001601a546123b0919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156123ee5760405162461bcd60e51b815260040161117690614de3565b600060206001601a54612401919061513e565b8154811061241157612411615217565b90600052602060002090600202019050600181600101600082825461243691906150f3565b925050819055506001601d60006001601a54612452919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601a54905190927f5cbe105e36805f7820e291f799d5794ff948af2a5f664e580382defb6339004191a350505050565b6008546001600160a01b031633146124da5760405162461bcd60e51b815260040161117690614e11565b60148054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146125205760405162461bcd60e51b815260040161117690614e11565b601255565b600061253082613f3d565b5192915050565b601454600090610100900460ff1615612551575060125490565b5060135490565b60006001600160a01b038216612581576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146125d05760405162461bcd60e51b815260040161117690614e11565b6125da6000614064565b565b6008546001600160a01b031633146126065760405162461bcd60e51b815260040161117690614e11565b601555565b6008546001600160a01b031633146126355760405162461bcd60e51b815260040161117690614e11565b805161137490600a9060208401906146cf565b6008546001600160a01b031633146126725760405162461bcd60e51b815260040161117690614e11565b600e55565b6008546001600160a01b031633146126a15760405162461bcd60e51b815260040161117690614e11565b601155565b6008546001600160a01b031633146126d05760405162461bcd60e51b815260040161117690614e11565b600d55565b601454600090610100900460ff16156126ef575060115490565b5060105490565b606060038054610ff790615181565b6020818154811061271557600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0382169250600160a01b90910460ff169083565b601454819060ff161561276d5760405162461bcd60e51b815260040161117690614e46565b60008111801561278457506127806126d5565b8111155b6127a05760405162461bcd60e51b815260040161117690614d5a565b600f54816127ac611571565b6127b691906150f3565b11156127d45760405162461bcd60e51b815260040161117690614e7d565b60145462010000900460ff166128215760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b6044820152606401611176565b8161282a611316565b612834919061511f565b3410156128795760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401611176565b612881612537565b8261288b33612558565b61289591906150f3565b11156128b35760405162461bcd60e51b815260040161117690614eab565b61137433836140b6565b6060601780548060200260200160405190810160405280929190818152602001828054801561107057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128f7575050505050905090565b6001600160a01b0382163314156129485760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b602181815481106129c457600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935090821691600160a01b900460ff169084565b600c805461222190615181565b6008546001600160a01b03163314612a375760405162461bcd60e51b815260040161117690614e11565b601355565b612a478484846138cb565b6001600160a01b0383163b15158015612a695750612a67848484846140d0565b155b15612a87576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b3360009081526018602052604090205460ff16612abc5760405162461bcd60e51b815260040161117690614ffb565b601c546022548114612ae05760405162461bcd60e51b815260040161117690614db8565b601c546022612af060018361513e565b81548110612b0057612b00615217565b600091825260209091206002600490920201015460ff1615612b345760405162461bcd60e51b815260040161117690614f79565b600060226001601c54612b47919061513e565b81548110612b5757612b57615217565b90600052602060002090600402019050601f60006001601c54612b7a919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16612bb75760405162461bcd60e51b815260040161117690614fa6565b6001816003016000828254612bcc919061513e565b925050819055506000601f60006001601c54612be8919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601c54905190927f522b374a854e9b59227e83e8b55a610861d2c90fe89fde0425766c4234a4a46591a3505050565b60228181548110612c5557600080fd5b600091825260209091206004909102018054600182015460028301546003909301549193509160ff169084565b3360009081526018602052604090205460ff16612cb15760405162461bcd60e51b815260040161117690614ffb565b601b546021548114612cd55760405162461bcd60e51b815260040161117690614db8565b601b546021612ce560018361513e565b81548110612cf557612cf5615217565b906000526020600020906003020160010160149054906101000a900460ff1615612d315760405162461bcd60e51b815260040161117690614f79565b600060216001601b54612d44919061513e565b81548110612d5457612d54615217565b90600052602060002090600302019050601e60006001601b54612d77919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16612db45760405162461bcd60e51b815260040161117690614fa6565b6001816002016000828254612dc9919061513e565b925050819055506000601e60006001601b54612de5919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601b54905190927f137e87fedbd5b7a4217039dbc94b8bd6638d1a41b4038f6bebcb324b6c7b3f0f91a3505050565b8060008111612e635760405162461bcd60e51b815260040161117690614d5a565b600f5481612e6f611571565b612e7991906150f3565b1115612e975760405162461bcd60e51b815260040161117690614e7d565b6008546001600160a01b031633146128b35760405162461bcd60e51b815260040161117690614e11565b6060612ecc82613836565b612f305760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611176565b6014546301000000900460ff16612fd357600c8054612f4e90615181565b80601f0160208091040260200160405190810160405280929190818152602001828054612f7a90615181565b8015612fc75780601f10612f9c57610100808354040283529160200191612fc7565b820191906000526020600020905b815481529060010190602001808311612faa57829003601f168201915b50505050509050919050565b6000612fdd6141c8565b90506000815111612ffd576040518060200160405280600081525061302b565b80613007846141d7565b600b60405160200161301b93929190614b98565b6040516020818303038152906040525b9392505050565b601454839060ff16156130575760405162461bcd60e51b815260040161117690614e46565b60008111801561306e575061306a6126d5565b8111155b61308a5760405162461bcd60e51b815260040161117690614d5a565b600f5481613096611571565b6130a091906150f3565b11156130be5760405162461bcd60e51b815260040161117690614e7d565b601454610100900460ff1661310a5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b6044820152606401611176565b60155461314f5760405162461bcd60e51b815260206004820152601360248201527213595c9adb1948149bdbdd081b9bdd081cd95d606a1b6044820152606401611176565b6040516bffffffffffffffffffffffff193360601b166020820152839060340160405160208183030381529060405280519060200120146131e45760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d656044820152683935b632903632b0b360b91b6064820152608401611176565b6131f160155484846142d4565b6132495760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201526272656560e81b6064820152608401611176565b83613252611316565b61325c919061511f565b3410156132a15760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401611176565b6132a9612537565b846132b333612558565b6132bd91906150f3565b11156132db5760405162461bcd60e51b815260040161117690614eab565b612a8733856140b6565b600080600060228054905084111561330f5760405162461bcd60e51b81526004016111769061501e565b6000602261331e60018761513e565b8154811061332e5761332e615217565b6000918252602090912060049091020160018101546002820154600390920154909760ff9092169650945092505050565b3360009081526018602052604090205460ff1661338e5760405162461bcd60e51b815260040161117690614ffb565b601b5460215481146133b25760405162461bcd60e51b815260040161117690614db8565b601b5460216133c260018361513e565b815481106133d2576133d2615217565b906000526020600020906003020160010160149054906101000a900460ff161561340e5760405162461bcd60e51b815260040161117690614f79565b601b54601e600061342060018461513e565b81526020808201929092526040908101600090812033825290925290205460ff161561345e5760405162461bcd60e51b815260040161117690614de3565b601e60006001601b54613471919061513e565b81526020808201929092526040908101600090812033825290925290205460ff16156134af5760405162461bcd60e51b815260040161117690614de3565b600060216001601b546134c2919061513e565b815481106134d2576134d2615217565b9060005260206000209060030201905060018160020160008282546134f791906150f3565b925050819055506001601e60006001601b54613513919061513e565b815260208082019290925260409081016000908120338083529352818120805460ff191694151594909417909355601b54905190927f7d4845cb7989d302732b5b83b397abec3a7e1013c3edd5f1a445730d71e6ab0191a350505050565b6008546001600160a01b0316331461359b5760405162461bcd60e51b815260040161117690614e11565b6014805491151563010000000263ff00000019909216919091179055565b601454829060ff16156135de5760405162461bcd60e51b815260040161117690614e46565b6000811180156135f557506135f16126d5565b8111155b6136115760405162461bcd60e51b815260040161117690614d5a565b600f548161361d611571565b61362791906150f3565b11156136455760405162461bcd60e51b815260040161117690614e7d565b6008546001600160a01b0316331461366f5760405162461bcd60e51b815260040161117690614e11565b61114782846140b6565b6008546001600160a01b031633146136a35760405162461bcd60e51b815260040161117690614e11565b6001600160a01b0381166137085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611176565b61189d81614064565b6008546001600160a01b0316331461373b5760405162461bcd60e51b815260040161117690614e11565b60165460ff16156137cf5760405162461bcd60e51b815260206004820152605260248201527f4f776e6572732063616e20626520736574206f6e6c79206f6e63652e20506c6560448201527f6173652072616973652061207265717565737420746f2075706461746520746860648201527132903830b93a34b1bab630b91037bbb732b960711b608482015260a401611176565b6137d8816142e1565b61189d6016805460ff19166001179055565b6008546001600160a01b031633146138145760405162461bcd60e51b815260040161117690614e11565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b60008160011115801561384a575060005482105b8015610fb8575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006138d682613f3d565b80519091506000906001600160a01b0316336001600160a01b03161480613904575081516139049033610e6d565b8061391f5750336139148461107a565b6001600160a01b0316145b90508061393f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146139745760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661399b57604051633a954ecd60e21b815260040160405180910390fd5b6139ab600084846000015161386f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116613a9557600054811015613a9557825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6008546001600160a01b03163314613b095760405162461bcd60e51b815260040161117690614e11565b601c546022548114613b2d5760405162461bcd60e51b815260040161117690614db8565b601c546022613b3d60018361513e565b81548110613b4d57613b4d615217565b600091825260209091206002600490920201015460ff1615613b815760405162461bcd60e51b815260040161117690614f79565b600060226001601c54613b94919061513e565b81548110613ba457613ba4615217565b9060005260206000209060040201905060195481600301541015613bda5760405162461bcd60e51b815260040161117690614fd0565b60028101805460ff19166001179055601c5460405133907f37605548c2760632e63060c14a3acc6bdad6536285ab9eb0b91c2f99320e456b90600090a3505050565b6008546001600160a01b03163314613c465760405162461bcd60e51b815260040161117690614e11565b601b546021548114613c6a5760405162461bcd60e51b815260040161117690614db8565b601b546021613c7a60018361513e565b81548110613c8a57613c8a615217565b906000526020600020906003020160010160149054906101000a900460ff1615613cc65760405162461bcd60e51b815260040161117690614f79565b600060216001601b54613cd9919061513e565b81548110613ce957613ce9615217565b9060005260206000209060030201905060195481600201541015613d1f5760405162461bcd60e51b815260040161117690614fd0565b60018101805460ff60a01b1916600160a01b179055601b5460405133907f2de58dbb393279e477a5337466666ff63011a1c94085c040f7e0d09e1be1714690600090a3505050565b6000805b601754811015613dc557826001600160a01b031660178281548110613d9257613d92615217565b6000918252602090912001546001600160a01b03161415613db35792915050565b80613dbd816151bc565b915050613d6b565b5060405162461bcd60e51b8152602060048201526009602482015268139bdd08119bdd5b9960ba1b6044820152606401611176565b6008546001600160a01b03163314613e245760405162461bcd60e51b815260040161117690614e11565b601a546020548114613e485760405162461bcd60e51b815260040161117690614db8565b601a546020613e5860018361513e565b81548110613e6857613e68615217565b6000918252602090912060029091020154600160a01b900460ff1615613ea05760405162461bcd60e51b815260040161117690614f79565b600060206001601a54613eb3919061513e565b81548110613ec357613ec3615217565b9060005260206000209060020201905060195481600101541015613ef95760405162461bcd60e51b815260040161117690614fd0565b805460ff60a01b1916600160a01b178155601a5460405133907f5445f318f4f5fcfb66592e68e0cc5822aa15664039bd5f0ffde24c5a8142b1ac90600090a3505050565b60408051606081018252600080825260208201819052918101919091528180600111158015613f6d575060005481105b1561404b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906140495780516001600160a01b031615613fe0579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215614044579392505050565b613fe0565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611374828260405180602001604052806000815250614430565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290614105903390899088908890600401614c5c565b602060405180830381600087803b15801561411f57600080fd5b505af192505050801561414f575060408051601f3d908101601f1916820190925261414c91810190614a38565b60015b6141aa573d80801561417d576040519150601f19603f3d011682016040523d82523d6000602084013e614182565b606091505b5080516141a2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610ff790615181565b6060816141fb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614225578061420f816151bc565b915061421e9050600a8361510b565b91506141ff565b6000816001600160401b0381111561423f5761423f61522d565b6040519080825280601f01601f191660200182016040528015614269576020820181803683370190505b5090505b84156141c05761427e60018361513e565b915061428b600a866151d7565b6142969060306150f3565b60f81b8183815181106142ab576142ab615217565b60200101906001600160f81b031916908160001a9053506142cd600a8661510b565b945061426d565b60006141c082858561443d565b60005b815181101561137457600082828151811061430157614301615217565b6020026020010151905060006001600160a01b0316816001600160a01b0316141561435e5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b6044820152606401611176565b6001600160a01b03811660009081526018602052604090205460ff16156143ba5760405162461bcd60e51b815260206004820152601060248201526f6f776e6572206e6f7420756e6971756560801b6044820152606401611176565b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556017805491820181559091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b031916909117905580614428816151bc565b9150506142e4565b6111478383836001614453565b60008261444a8584614623565b14949350505050565b6000546001600160a01b03851661447c57604051622e076360e81b815260040160405180910390fd5b8361449a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561454b57506001600160a01b0387163b15155b156145d4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461459c60008884806001019550886140d0565b6145b9576040516368d2bf6b60e11b815260040160405180910390fd5b808214156145515782600054146145cf57600080fd5b61461a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156145d5575b50600055613ad8565b600081815b84518110156146c757600085828151811061464557614645615217565b602002602001015190508083116146875760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506146b4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806146bf816151bc565b915050614628565b509392505050565b8280546146db90615181565b90600052602060002090601f0160209004810192826146fd5760008555614743565b82601f1061471657805160ff1916838001178555614743565b82800160010185558215614743579182015b82811115614743578251825591602001919060010190614728565b5061474f929150614753565b5090565b5b8082111561474f5760008155600101614754565b60006001600160401b038311156147815761478161522d565b614794601f8401601f19166020016150a0565b90508281528383830111156147a857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146147d657600080fd5b919050565b803580151581146147d657600080fd5b6000602082840312156147fd57600080fd5b61302b826147bf565b6000806040838503121561481957600080fd5b614822836147bf565b9150614830602084016147bf565b90509250929050565b60008060006060848603121561484e57600080fd5b614857846147bf565b9250614865602085016147bf565b9150604084013590509250925092565b6000806000806080858703121561488b57600080fd5b614894856147bf565b93506148a2602086016147bf565b92506040850135915060608501356001600160401b038111156148c457600080fd5b8501601f810187136148d557600080fd5b6148e487823560208401614768565b91505092959194509250565b6000806040838503121561490357600080fd5b61490c836147bf565b9150614830602084016147db565b6000806040838503121561492d57600080fd5b614936836147bf565b946020939093013593505050565b6000602080838503121561495757600080fd5b82356001600160401b0381111561496d57600080fd5b8301601f8101851361497e57600080fd5b803561499161498c826150d0565b6150a0565b80828252848201915084840188868560051b87010111156149b157600080fd5b600094505b838510156149db576149c7816147bf565b8352600194909401939185019185016149b6565b50979650505050505050565b6000602082840312156149f957600080fd5b61302b826147db565b600060208284031215614a1457600080fd5b5035919050565b600060208284031215614a2d57600080fd5b813561302b81615243565b600060208284031215614a4a57600080fd5b815161302b81615243565b600060208284031215614a6757600080fd5b81356001600160401b03811115614a7d57600080fd5b8201601f81018413614a8e57600080fd5b6141c084823560208401614768565b60008060408385031215614ab057600080fd5b82359150614830602084016147bf565b600080600060608486031215614ad557600080fd5b83359250602080850135925060408501356001600160401b03811115614afa57600080fd5b8501601f81018713614b0b57600080fd5b8035614b1961498c826150d0565b8082825284820191508484018a868560051b8701011115614b3957600080fd5b600094505b83851015614b5c578035835260019490940193918501918501614b3e565b5080955050505050509250925092565b60008151808452614b84816020860160208601615155565b601f01601f19169290920160200192915050565b600084516020614bab8285838a01615155565b855191840191614bbe8184848a01615155565b8554920191600090600181811c9080831680614bdb57607f831692505b858310811415614bf957634e487b7160e01b85526022600452602485fd5b808015614c0d5760018114614c1e57614c4b565b60ff19851688528388019550614c4b565b60008b81526020902060005b85811015614c435781548a820152908401908801614c2a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c8f90830184614b6c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cda5783516001600160a01b031683529284019291840191600101614cb5565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cda57835183529284019291840191600101614d02565b60208152600061302b6020830184614b6c565b6020808252600f908201526e1bdddb995c9cc81c995c5d5a5c9959608a1b604082015260600190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601690820152755472616e73616374696f6e206e6f7420666f756e642160501b604082015260600190565b6020808252601190820152701d1e08191bd95cc81b9bdd08195e1a5cdd607a1b604082015260600190565b6020808252601490820152731d1e08185b1c9958591e4818dbdb999a5c9b595960621b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526022908201527f4d6178206d696e7420616d6f756e74207065722077616c6c6574207265616368604082015261195960f21b606082015260800190565b60208082526024908201527f4e6f20616374697665207472616e73616374696f6e207265717565737420666f604082015263756e642160e01b606082015260800190565b60208082526028908201527f696e76616c6964206e756d626572206f6620726571756972656420636f6e6669604082015267726d6174696f6e7360c01b606082015260800190565b6020808252601390820152721d1e08185b1c9958591e48195e1958dd5d1959606a1b604082015260600190565b60208082526010908201526f1d1e081b9bdd0818dbdb999a5c9b595960821b604082015260600190565b6020808252601190820152700c6c2dcdcdee840caf0cac6eae8ca40e8f607b1b604082015260600190565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b6020808252602b908201527f496e64657820657863656564207468652063757272656e74207472616e73616360408201526a0e8d2dedc40d8cadccee8d60ab1b606082015260800190565b6020808252601d908201527f4d696e696d756d20636f6e6669726d6174696f6e206e6f74206d657421000000604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156150c8576150c861522d565b604052919050565b60006001600160401b038211156150e9576150e961522d565b5060051b60200190565b60008219821115615106576151066151eb565b500190565b60008261511a5761511a615201565b500490565b6000816000190483118215151615615139576151396151eb565b500290565b600082821015615150576151506151eb565b500390565b60005b83811015615170578181015183820152602001615158565b83811115612a875750506000910152565b600181811c9082168061519557607f821691505b602082108114156151b657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151d0576151d06151eb565b5060010190565b6000826151e6576151e6615201565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461189d57600080fdfea2646970667358221220716a0295c19528c3f3998358cb276fc8a1bc4a4c6636780f11ac2931e00dbfd964736f6c63430008070033

Deployed Bytecode Sourcemap

50076:22651:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32592:305;;;;;;;;;;-1:-1:-1;32592:305:0;;;;;:::i;:::-;;:::i;:::-;;;11743:14:1;;11736:22;11718:41;;11706:2;11691:18;32592:305:0;;;;;;;;52287:23;;;;;;;;;;-1:-1:-1;52287:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8919:32:1;;;8901:51;;8889:2;8874:18;52287:23:0;8755:203:1;35977:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37480:204::-;;;;;;;;;;-1:-1:-1;37480:204:0;;;;;:::i;:::-;;:::i;37043:371::-;;;;;;;;;;-1:-1:-1;37043:371:0;;;;;:::i;:::-;;:::i;:::-;;70645:89;;;;;;;;;;-1:-1:-1;70645:89:0;;;;;:::i;:::-;;:::i;59375:509::-;;;;;;;;;;-1:-1:-1;59375:509:0;;;;;:::i;:::-;;:::i;:::-;;;23658:25:1;;;23646:2;23631:18;59375:509:0;23512:177:1;53500:130:0;;;;;;;;;;;;;:::i;52440:32::-;;;;;;;;;;;;;;;;71606:106;;;;;;;;;;-1:-1:-1;71606:106:0;;;;;:::i;:::-;;:::i;71720:83::-;;;;;;;;;;-1:-1:-1;71720:83:0;;;;;:::i;:::-;;:::i;63616:455::-;;;;;;;;;;;;;:::i;31841:303::-;;;;;;;;;;;;;:::i;38337:170::-;;;;;;;;;;-1:-1:-1;38337:170:0;;;;;:::i;:::-;;:::i;59892:544::-;;;;;;;;;;-1:-1:-1;59892:544:0;;;;;:::i;:::-;;:::i;68947:1084::-;;;;;;;;;;-1:-1:-1;68947:1084:0;;;;;:::i;:::-;;:::i;65441:970::-;;;;;;;;;;-1:-1:-1;65441:970:0;;;;;:::i;:::-;;:::i;51603:40::-;;;;;;;;;;;;;;;;51733:44;;;;;;;;;;;;;;;;67871:528;;;;;;;;;;-1:-1:-1;67871:528:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10132:32:1;;;10114:51;;10208:14;;10201:22;10196:2;10181:18;;10174:50;10240:18;;;10233:34;10102:2;10087:18;67871:528:0;9918:355:1;67244:103:0;;;;;;;;;;-1:-1:-1;67320:12:0;:19;67244:103;;52317:39;;;;;;;;;;-1:-1:-1;52317:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;67355:508;;;;;;;;;;-1:-1:-1;67355:508:0;;;;;:::i;:::-;;:::i;58940:427::-;;;;;;;;;;;;;:::i;71811:795::-;;;;;;;;;;;;;:::i;38578:185::-;;;;;;;;;;-1:-1:-1;38578:185:0;;;;;:::i;:::-;;:::i;57673:695::-;;;;;;;;;;-1:-1:-1;57673:695:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52201:36::-;;;;;;;;;;-1:-1:-1;52201:36:0;;;;;;;;52479:33;;;;;;;;;;;;;;;;71032:148;;;;;;;;;;-1:-1:-1;71032:148:0;;;;;:::i;:::-;;:::i;61520:589::-;;;;;;;;;;;;;:::i;71346:138::-;;;;;;;;;;-1:-1:-1;71346:138:0;;;;;:::i;:::-;;:::i;52081:28::-;;;;;;;;;;-1:-1:-1;52081:28:0;;;;;;;;;;;52004:33;;;;;;;;;;-1:-1:-1;52004:33:0;;;;;;;;;;;52406:27;;;;;;;;;;;;;;;;51491:33;;;;;;;;;;;;;:::i;51884:44::-;;;;;;;;;;;;;;;;60444:487;;;;;;;;;;;;;:::i;70548:89::-;;;;;;;;;;-1:-1:-1;70548:89:0;;;;;:::i;:::-;;:::i;51972:25::-;;;;;;;;;;-1:-1:-1;51972:25:0;;;;;;;;70742:134;;;;;;;;;;-1:-1:-1;70742:134:0;;;;;:::i;:::-;;:::i;52244:36::-;;;;;;;;;;-1:-1:-1;52244:36:0;;;;;;;;;;;35786:124;;;;;;;;;;-1:-1:-1;35786:124:0;;;;;:::i;:::-;;:::i;53638:164::-;;;;;;;;;;;;;:::i;52044:30::-;;;;;;;;;;-1:-1:-1;52044:30:0;;;;;;;;;;;32961:206;;;;;;;;;;-1:-1:-1;32961:206:0;;;;;:::i;:::-;;:::i;9592:103::-;;;;;;;;;;;;;:::i;70234:104::-;;;;;;;;;;-1:-1:-1;70234:104:0;;;;;:::i;:::-;;:::i;71492:106::-;;;;;;;;;;-1:-1:-1;71492:106:0;;;;;:::i;:::-;;:::i;52906:60::-;;;;;;;;;;-1:-1:-1;52906:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;70346:92;;;;;;;;;;-1:-1:-1;70346:92:0;;;;;:::i;:::-;;:::i;51650:38::-;;;;;;;;;;;;;;;;8941:87;;;;;;;;;;-1:-1:-1;9014:6:0;;-1:-1:-1;;;;;9014:6:0;8941:87;;71188:150;;;;;;;;;;-1:-1:-1;71188:150:0;;;;;:::i;:::-;;:::i;70446:94::-;;;;;;;;;;-1:-1:-1;70446:94:0;;;;;:::i;:::-;;:::i;53045:66::-;;;;;;;;;;-1:-1:-1;53045:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;53810:172;;;;;;;;;;;;;:::i;36146:104::-;;;;;;;;;;;;;:::i;53118:33::-;;;;;;;;;;-1:-1:-1;53118:33:0;;;;;:::i;:::-;;:::i;55956:373::-;;;;;;:::i;:::-;;:::i;67144:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37756:279::-;;;;;;;;;;-1:-1:-1;37756:279:0;;;;;:::i;:::-;;:::i;53158:43::-;;;;;;;;;;-1:-1:-1;53158:43:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9244:15:1;;;9226:34;;9296:15;;;;9291:2;9276:18;;9269:43;9355:14;;9348:22;9328:18;;;9321:50;;;;9402:2;9387:18;;9380:34;9175:3;9160:19;53158:43:0;8963:457:1;51784:45:0;;;;;;;;;;;;;;;;51531:31;;;;;;;;;;;;;:::i;70884:140::-;;;;;;;;;;-1:-1:-1;70884:140:0;;;;;:::i;:::-;;:::i;38834:369::-;;;;;;;;;;-1:-1:-1;38834:369:0;;;;;:::i;:::-;;:::i;64618:545::-;;;;;;;;;;;;;:::i;53208:45::-;;;;;;;;;;-1:-1:-1;53208:45:0;;;;;:::i;:::-;;:::i;:::-;;;;24253:25:1;;;24309:2;24294:18;;24287:34;;;;24364:14;;24357:22;24337:18;;;24330:50;;;;24411:2;24396:18;;24389:34;24240:3;24225:19;53208:45:0;24028:401:1;64079:531:0;;;;;;;;;;;;;:::i;56510:144::-;;;;;;;;;;-1:-1:-1;56510:144:0;;;;;:::i;:::-;;:::i;58376:556::-;;;;;;;;;;-1:-1:-1;58376:556:0;;;;;:::i;:::-;;:::i;56662:821::-;;;;;;:::i;:::-;;:::i;52363:36::-;;;;;;;;;;;;;;;;68407:532;;;;;;;;;;-1:-1:-1;68407:532:0;;;;;:::i;:::-;;:::i;:::-;;;;23890:25:1;;;23958:14;;23951:22;23946:2;23931:18;;23924:50;23990:18;;;23983:34;23878:2;23863:18;68407:532:0;23694:329:1;51695:31:0;;;;;;;;;;;;;;;;60939:573;;;;;;;;;;;;;:::i;70039:87::-;;;;;;;;;;-1:-1:-1;70039:87:0;;;;;:::i;:::-;;:::i;38106:164::-;;;;;;;;;;-1:-1:-1;38106:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38227:25:0;;;38203:4;38227:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38106:164;52973:65;;;;;;;;;;-1:-1:-1;52973:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;56341:161;;;;;;;;;;-1:-1:-1;56341:161:0;;;;;:::i;:::-;;:::i;9850:201::-;;;;;;;;;;-1:-1:-1;9850:201:0;;;;;:::i;:::-;;:::i;65171:262::-;;;;;;;;;;-1:-1:-1;65171:262:0;;;;;:::i;:::-;;:::i;70134:92::-;;;;;;;;;;-1:-1:-1;70134:92:0;;;;;:::i;:::-;;:::i;51836:41::-;;;;;;;;;;;;;;;;32592:305;32694:4;-1:-1:-1;;;;;;32731:40:0;;-1:-1:-1;;;32731:40:0;;:105;;-1:-1:-1;;;;;;;32788:48:0;;-1:-1:-1;;;32788:48:0;32731:105;:158;;;-1:-1:-1;;;;;;;;;;21374:40:0;;;32853:36;32711:178;32592:305;-1:-1:-1;;32592:305:0:o;52287:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52287:23:0;;-1:-1:-1;52287:23:0;:::o;35977:100::-;36031:13;36064:5;36057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35977:100;:::o;37480:204::-;37548:7;37573:16;37581:7;37573;:16::i;:::-;37568:64;;37598:34;;-1:-1:-1;;;37598:34:0;;;;;;;;;;;37568:64;-1:-1:-1;37652:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37652:24:0;;37480:204::o;37043:371::-;37116:13;37132:24;37148:7;37132:15;:24::i;:::-;37116:40;;37177:5;-1:-1:-1;;;;;37171:11:0;:2;-1:-1:-1;;;;;37171:11:0;;37167:48;;;37191:24;;-1:-1:-1;;;37191:24:0;;;;;;;;;;;37167:48;7772:10;-1:-1:-1;;;;;37232:21:0;;;;;;:63;;-1:-1:-1;37258:37:0;37275:5;7772:10;38106:164;:::i;37258:37::-;37257:38;37232:63;37228:138;;;37319:35;;-1:-1:-1;;;37319:35:0;;;;;;;;;;;37228:138;37378:28;37387:2;37391:7;37400:5;37378:8;:28::i;:::-;37105:309;37043:371;;:::o;70645:89::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;;;;;;;;;70705:13:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;70705:21:0;;::::1;::::0;;;::::1;::::0;;70645:89::o;59375:509::-;9014:6;;59477:17;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;59522:17:::1;:24:::0;:28:::1;::::0;59549:1:::1;59522:28;:::i;:::-;59600:161;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;59600:161:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;59600:161:0;;;;;;;;;;;;59563:17:::1;:209:::0;;59600:161;59563:209;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;59563:209:0;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;59563:209:0::1;-1:-1:-1::0;;;;;;59563:209:0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;59783:13:::1;:15:::0;;59507:43;;-1:-1:-1;59783:13:0;:15:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;59824:52:0::1;::::0;-1:-1:-1;;;;;59824:52:0;;::::1;::::0;;;::::1;::::0;59853:10:::1;::::0;59824:52:::1;::::0;;;::::1;59375:509:::0;;;;:::o;53500:130::-;53559:13;;53536:7;;53559:13;;;;;53556:36;;;-1:-1:-1;53581:11:0;;;53500:130::o;53556:36::-;-1:-1:-1;53612:10:0;;;53500:130::o;71606:106::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71682:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;71606:106:::0;:::o;71720:83::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71780:6:::1;:15:::0;;-1:-1:-1;;71780:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71720:83::o;63616:455::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;63707:8:::1;::::0;54156:12:::1;:19:::0;54144:31;::::1;54136:61;;;;-1:-1:-1::0;;;54136:61:0::1;;;;;;;:::i;:::-;63738:8:::2;::::0;54569:12:::2;54582;54593:1;63738:8:::0;54582:12:::2;:::i;:::-;54569:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:35:::0;-1:-1:-1;;;54569:35:0;::::2;;;54568:36;54560:68;;;;-1:-1:-1::0;;;54560:68:0::2;;;;;;;:::i;:::-;63764:31:::3;63798:12;63822:1;63811:8;;:12;;;;:::i;:::-;63798:26;;;;;;;;:::i;:::-;;;;;;;;;;;63764:60;;63845:11;:25;63868:1;63857:8;;:12;;;;:::i;:::-;63845:25:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;63845:25:0;;;63871:10:::3;63845:37:::0;;;;;;;;::::3;;63837:66;;;;-1:-1:-1::0;;;63837:66:0::3;;;;;;;:::i;:::-;63948:1;63916:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;64000:5;63960:11;:25;63983:1;63972:8;;:12;;;;:::i;:::-;63960:25:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;63960:25:0;;;63986:10:::3;63960:37:::0;;;;;;;;:45;;-1:-1:-1;;63960:45:0::3;::::0;::::3;;::::0;;;::::3;::::0;;;64054:8:::3;::::0;64023:40;;64054:8;;64023:40:::3;::::0;::::3;63753:318;54208:1:::2;54075::::1;63616:455::o:0;31841:303::-;53483:1;32095:12;31885:7;32079:13;:28;-1:-1:-1;;32079:46:0;;31841:303::o;38337:170::-;38471:28;38481:4;38487:2;38491:7;38471:9;:28::i;59892:544::-;9014:6;;59980:17;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;60025:18:::1;:25:::0;:29:::1;::::0;60053:1:::1;60025:29;:::i;:::-;60105:184;::::0;;::::1;::::0;::::1;::::0;;60177:24:::1;::::0;60105:184;;::::1;::::0;::::1;::::0;;;-1:-1:-1;60105:184:0;;;;;;;;;;;;60067:18:::1;:233:::0;;60105:184;60067:233;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;;60067:233:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;;;;;;60311:14:::1;:16:::0;;60010:44;;-1:-1:-1;60311:14:0;:16:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;60395:24:0::1;::::0;60353:75:::1;::::0;60421:6;;60395:24;60383:10:::1;::::0;60353:75:::1;::::0;;;::::1;59892:544:::0;;;:::o;68947:1084::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;69028:16:::1;::::0;::::1;::::0;::::1;;;69025:999;;69070:24;:33:::0;69118:16:::1;:23:::0;;-1:-1:-1;;69118:23:0::1;;;::::0;;68947:1084::o;69025:999::-:1;69198:1;69181:14;;:18;69173:53;;;;-1:-1:-1::0;;;69173:53:0::1;;;;;;;:::i;:::-;69249:6;:13:::0;69241:45:::1;;;;-1:-1:-1::0;;;69241:45:0::1;;;;;;;:::i;:::-;69362:1;69335:24;;:28;:102;;;;-1:-1:-1::0;69424:6:0::1;:13:::0;69396:24:::1;::::0;:41:::1;;69335:102;69301:228;;;;-1:-1:-1::0;;;69301:228:0::1;;;;;;;:::i;:::-;69544:37;69584:18;69620:1;69603:14;;:18;;;;:::i;:::-;69584:38;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;69645:20;::::0;::::1;::::0;69584:38;;-1:-1:-1;69645:20:0::1;;:29;69637:78;;;;-1:-1:-1::0;;;69637:78:0::1;;;;;;;:::i;:::-;69770:24;;69738:11;:28;;;:56;;69730:98;;;;-1:-1:-1::0;;;69730:98:0::1;;;;;;;:::i;:::-;69869:6;69851:11;:14;;;:24;69843:73;;;::::0;-1:-1:-1;;;69843:73:0;;12196:2:1;69843:73:0::1;::::0;::::1;12178:21:1::0;12235:2;12215:18;;;12208:30;12274:34;12254:18;;;12247:62;-1:-1:-1;;;12325:18:1;;;12318:34;12369:19;;69843:73:0::1;11994:400:1::0;69843:73:0::1;69931:33;:31;:33::i;:::-;-1:-1:-1::0;69979:24:0::1;:33:::0;;;69025:999:::1;68947:1084:::0;:::o;65441:970::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;65539:1:::1;65523:13;;:17;65515:52;;;;-1:-1:-1::0;;;65515:52:0::1;;;;;;;:::i;:::-;65586:6;:13:::0;65578:45:::1;;;;-1:-1:-1::0;;;65578:45:0::1;;;;;;;:::i;:::-;65691:1;65664:24;;:28;:98;;;;-1:-1:-1::0;65749:6:0::1;:13:::0;65721:24:::1;::::0;:41:::1;;65664:98;65634:212;;;;-1:-1:-1::0;;;65634:212:0::1;;;;;;;:::i;:::-;65857:36;65896:17;65930:1;65914:13;;:17;;;;:::i;:::-;65896:36;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;65951:20;::::0;::::1;::::0;65896:36;;-1:-1:-1;;;;65951:20:0;::::1;;;:29;65943:78;;;;-1:-1:-1::0;;;65943:78:0::1;;;;;;;:::i;:::-;66072:24;;66040:11;:28;;;:56;;66032:98;;;;-1:-1:-1::0;;;66032:98:0::1;;;;;;;:::i;:::-;66149:14:::0;;-1:-1:-1;;;;;66149:21:0;;::::1;:14:::0;::::1;:21;66141:78;;;::::0;-1:-1:-1;;;66141:78:0;;15491:2:1;66141:78:0::1;::::0;::::1;15473:21:1::0;15530:2;15510:18;;;15503:30;15569:34;15549:18;;;15542:62;-1:-1:-1;;;15620:18:1;;;15613:42;15672:19;;66141:78:0::1;15289:408:1::0;66141:78:0::1;66230:32;:30;:32::i;:::-;66273:13;66289:22;66305:5;66289:15;:22::i;:::-;66273:38;;66338:3;66322:6;66329:5;66322:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:19:::0;;-1:-1:-1;;;;;;66322:19:0::1;-1:-1:-1::0;;;;;66322:19:0;;::::1;;::::0;;66359:14;;::::1;::::0;;:7:::1;:14:::0;;;;;;;66352:21;;-1:-1:-1;;66352:21:0;;::::1;::::0;;;66384:12;;;::::1;::::0;;;;;:19;;;;::::1;-1:-1:-1::0;66384:19:0::1;::::0;;;-1:-1:-1;;65441:970:0:o;67871:528::-;67977:10;68002:13;68030:21;68093:17;:24;;;;68082:8;:35;68079:93;;;68119:53;;-1:-1:-1;;;68119:53:0;;;;;;;:::i;68079:93::-;68183:36;68222:17;68240:12;68251:1;68240:8;:12;:::i;:::-;68222:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;68288:14;;;68317:20;;;68352:28;;;;;-1:-1:-1;;;;;68288:14:0;;;;-1:-1:-1;;;68317:20:0;;;;;;-1:-1:-1;68352:28:0;-1:-1:-1;67871:528:0;-1:-1:-1;;;67871:528:0:o;67355:508::-;67456:10;67481:13;67509:21;67572:12;:19;;;;67561:8;:30;67558:88;;;67593:53;;-1:-1:-1;;;67593:53:0;;;;;;;:::i;67558:88::-;67657:31;67691:12;67704;67715:1;67704:8;:12;:::i;:::-;67691:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;67752:14;;;67816:28;;;;-1:-1:-1;;;;;67752:14:0;;;-1:-1:-1;;;67781:20:0;;;;;;-1:-1:-1;67816:28:0;-1:-1:-1;67355:508:0;-1:-1:-1;;;67355:508:0:o;58940:427::-;9014:6;;58995:12;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;59030:12:::1;:19:::0;:23:::1;::::0;59052:1:::1;59030:23;:::i;:::-;59078:9;::::0;59132:126:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;59078:9:0;;::::1;59132:126:::0;;;59064:11:::1;59100:12;59132:126:::0;;::::1;::::0;;;;;;;;;59100:169;;59078:9;59100:169;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;-1:-1:-1::0;;;59100:169:0::1;-1:-1:-1::0;;;;;;59100:169:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;59280:8:::1;:10:::0;;59020:33;;-1:-1:-1;59078:9:0;;59280:10;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;59316:43:0::1;::::0;-1:-1:-1;;;;;59316:43:0;::::1;::::0;59346:7;;59334:10:::1;::::0;59316:43:::1;::::0;;;::::1;59009:358;58940:427:::0;:::o;71811:795::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71891:1:::1;71867:21;:25;71859:50;;;::::0;-1:-1:-1;;;71859:50:0;;16592:2:1;71859:50:0::1;::::0;::::1;16574:21:1::0;16631:2;16611:18;;;16604:30;-1:-1:-1;;;16650:18:1;;;16643:42;16702:18;;71859:50:0::1;16390:336:1::0;71859:50:0::1;71939:1;71928:8;;:12;71920:47;;;;-1:-1:-1::0;;;71920:47:0::1;;;;;;;:::i;:::-;71986:6;:13:::0;71978:45:::1;;;;-1:-1:-1::0;;;71978:45:0::1;;;;;;;:::i;:::-;72087:1;72060:24;;:28;:94;;;;-1:-1:-1::0;72141:6:0::1;:13:::0;72113:24:::1;::::0;:41:::1;;72060:94;72034:196;;;;-1:-1:-1::0;;;72034:196:0::1;;;;;;;:::i;:::-;72241:31;72275:12;72299:1;72288:8;;:12;;;;:::i;:::-;72275:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;72320:20:::0;;72275:26;;-1:-1:-1;;;;72320:20:0;::::1;;;:29;72312:78;;;;-1:-1:-1::0;;;72312:78:0::1;;;;;;;:::i;:::-;72441:24;;72409:11;:28;;;:56;;72401:98;;;;-1:-1:-1::0;;;72401:98:0::1;;;;;;;:::i;:::-;72510:27;:25;:27::i;:::-;72556:9;::::0;72548:50:::1;::::0;-1:-1:-1;;;;;72556:9:0;;::::1;::::0;72576:21:::1;72548:50:::0;::::1;;;::::0;72556:9:::1;72548:50:::0;72556:9;72548:50;72576:21;72556:9;72548:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;38578:185:::0;38716:39;38733:4;38739:2;38743:7;38716:39;;;;;;;;;;;;:16;:39::i;57673:695::-;57760:16;57794:23;57820:17;57830:6;57820:9;:17::i;:::-;57794:43;;57848:30;57895:15;-1:-1:-1;;;;;57881:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57881:30:0;-1:-1:-1;57848:63:0;-1:-1:-1;57947:1:0;57922:22;57999:329;58024:15;58006;:33;:64;;;;;58061:9;;58043:14;:27;;58006:64;57999:329;;;58083:25;58111:23;58119:14;58111:7;:23::i;:::-;58083:51;;58172:6;-1:-1:-1;;;;;58151:27:0;:17;-1:-1:-1;;;;;58151:27:0;;58147:141;;;58228:14;58195:13;58209:15;58195:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;58259:17;;;;:::i;:::-;;;;58147:141;58300:16;;;;:::i;:::-;;;;58072:256;57999:329;;;-1:-1:-1;58347:13:0;;57673:695;-1:-1:-1;;;;57673:695:0:o;71032:148::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71126:24:::1;:46:::0;71032:148::o;61520:589::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;61623:14:::1;::::0;54438:18:::1;:25:::0;54426:37;::::1;54418:67;;;;-1:-1:-1::0;;;54418:67:0::1;;;;;;;:::i;:::-;61666:14:::2;::::0;54871:18:::2;54890:12;54901:1;61666:14:::0;54890:12:::2;:::i;:::-;54871:32;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:41:::2;:32;::::0;;::::2;;:41;::::0;::::2;;54870:42;54862:74;;;;-1:-1:-1::0;;;54862:74:0::2;;;;;;;:::i;:::-;61710:14:::3;::::0;55331:17:::3;:31;55349:12;55360:1;61710:14:::0;55349:12:::3;:::i;:::-;55331:31:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;55331:31:0;;;55363:10:::3;55331:43:::0;;;;;;;;::::3;;55330:44;55322:77;;;;-1:-1:-1::0;;;55322:77:0::3;;;;;;;:::i;:::-;61751:17:::4;:37;61786:1;61769:14;;:18;;;;:::i;:::-;61751:37:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;61751:37:0;;;61789:10:::4;61751:49:::0;;;;;;;;::::4;;61750:50;61742:83;;;;-1:-1:-1::0;;;61742:83:0::4;;;;;;;:::i;:::-;61836:37;61876:18;61912:1;61895:14;;:18;;;;:::i;:::-;61876:38;;;;;;;;:::i;:::-;;;;;;;;;;;61836:78;;61957:1;61925:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;62021:4;61969:17;:37;62004:1;61987:14;;:18;;;;:::i;:::-;61969:37:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;61969:37:0;;;62007:10:::4;61969:49:::0;;;;;;;;:56;;-1:-1:-1;;61969:56:0::4;::::0;::::4;;::::0;;;::::4;::::0;;;62086:14:::4;::::0;62043:58;;62086:14;;62043:58:::4;::::0;::::4;61731:378;54947:1:::3;54496::::2;54075::::1;61520:589::o:0;71346:138::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71438:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;51491:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60444:487::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;60535:8:::1;::::0;54156:12:::1;:19:::0;54144:31;::::1;54136:61;;;;-1:-1:-1::0;;;54136:61:0::1;;;;;;;:::i;:::-;60566:8:::2;::::0;54569:12:::2;54582;54593:1;60566:8:::0;54582:12:::2;:::i;:::-;54569:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:35:::0;-1:-1:-1;;;54569:35:0;::::2;;;54568:36;54560:68;;;;-1:-1:-1::0;;;54560:68:0::2;;;;;;;:::i;:::-;60598:8:::3;::::0;55021:11:::3;:25;55033:12;55044:1;60598:8:::0;55033:12:::3;:::i;:::-;55021:25:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;55021:25:0;;;55047:10:::3;55021:37:::0;;;;;;;;::::3;;55020:38;55012:71;;;;-1:-1:-1::0;;;55012:71:0::3;;;;;;;:::i;:::-;60633:11:::4;:25;60656:1;60645:8;;:12;;;;:::i;:::-;60633:25:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;60633:25:0;;;60659:10:::4;60633:37:::0;;;;;;;;::::4;;60632:38;60624:71;;;;-1:-1:-1::0;;;60624:71:0::4;;;;;;;:::i;:::-;60706:31;60740:12;60764:1;60753:8;;:12;;;;:::i;:::-;60740:26;;;;;;;;:::i;:::-;;;;;;;;;;;60706:60;;60809:1;60777:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;60861:4;60821:11;:25;60844:1;60833:8;;:12;;;;:::i;:::-;60821:25:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;60821:25:0;;;60847:10:::4;60821:37:::0;;;;;;;;:44;;-1:-1:-1;;60821:44:0::4;::::0;::::4;;::::0;;;::::4;::::0;;;60914:8:::4;::::0;60883:40;;60914:8;;60883:40:::4;::::0;::::4;60613:318;54639:1:::3;54208::::2;54075::::1;60444:487::o:0;70548:89::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70611:10:::1;:18:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;70611:18:0;;::::1;::::0;;;::::1;::::0;;70548:89::o;70742:134::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70829:21:::1;:39:::0;70742:134::o;35786:124::-;35850:7;35877:20;35889:7;35877:11;:20::i;:::-;:25;;35786:124;-1:-1:-1;;35786:124:0:o;53638:164::-;53707:13;;53684:7;;53707:13;;;;;53704:46;;;-1:-1:-1;53729:21:0;;;53638:164::o;53704:46::-;-1:-1:-1;53770:24:0;;;53638:164::o;32961:206::-;33025:7;-1:-1:-1;;;;;33049:19:0;;33045:60;;33077:28;;-1:-1:-1;;;33077:28:0;;;;;;;;;;;33045:60;-1:-1:-1;;;;;;33131:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33131:27:0;;32961:206::o;9592:103::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;9657:30:::1;9684:1;9657:18;:30::i;:::-;9592:103::o:0;70234:104::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70306:10:::1;:24:::0;70234:104::o;71492:106::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71568:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;70346:92::-:0;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70412:10:::1;:18:::0;70346:92::o;71188:150::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;71283:25:::1;:47:::0;71188:150::o;70446:94::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70513:11:::1;:19:::0;70446:94::o;53810:172::-;53883:13;;53860:7;;53883:13;;;;;53880:50;;;-1:-1:-1;53905:25:0;;;53810:172::o;53880:50::-;-1:-1:-1;53950:24:0;;;53810:172::o;36146:104::-;36202:13;36235:7;36228:14;;;;;:::i;53118:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53118:33:0;;;-1:-1:-1;;;;53118:33:0;;;;;;;:::o;55956:373::-;55492:6;;56021:11;;55492:6;;55491:7;55483:43;;;;-1:-1:-1;;;55483:43:0;;;;;;;:::i;:::-;55559:1;55545:11;:15;:54;;;;;55579:20;:18;:20::i;:::-;55564:11;:35;;55545:54;55537:87;;;;-1:-1:-1;;;55537:87:0;;;;;;;:::i;:::-;55674:9;;55659:11;55643:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;55635:73;;;;-1:-1:-1;;;55635:73:0;;;;;;;:::i;:::-;56053:10:::1;::::0;;;::::1;;;56045:42;;;::::0;-1:-1:-1;;;56045:42:0;;14383:2:1;56045:42:0::1;::::0;::::1;14365:21:1::0;14422:2;14402:18;;;14395:30;-1:-1:-1;;;14441:18:1;;;14434:48;14499:18;;56045:42:0::1;14181:342:1::0;56045:42:0::1;56128:11;56119:6;:4;:6::i;:::-;:20;;;;:::i;:::-;56106:9;:33;;56098:65;;;::::0;-1:-1:-1;;;56098:65:0;;22962:2:1;56098:65:0::1;::::0;::::1;22944:21:1::0;23001:2;22981:18;;;22974:30;-1:-1:-1;;;23020:18:1;;;23013:49;23079:18;;56098:65:0::1;22760:343:1::0;56098:65:0::1;56221:16;:14;:16::i;:::-;56206:11;56182:21;56192:10;56182:9;:21::i;:::-;:35;;;;:::i;:::-;:55;;56174:102;;;;-1:-1:-1::0;;;56174:102:0::1;;;;;;;:::i;:::-;56287:34;56297:10;56309:11;56287:9;:34::i;67144:92::-:0;67186:16;67222:6;67215:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67215:13:0;;;;;;;;;;;;;;;;;;;;;;67144:92;:::o;37756:279::-;-1:-1:-1;;;;;37847:24:0;;7772:10;37847:24;37843:54;;;37880:17;;-1:-1:-1;;;37880:17:0;;;;;;;;;;;37843:54;7772:10;37910:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37910:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37910:53:0;;;;;;;;;;37979:48;;11718:41:1;;;37910:42:0;;7772:10;37979:48;;11691:18:1;37979:48:0;;;;;;;37756:279;;:::o;53158:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53158:43:0;;;;-1:-1:-1;53158:43:0;;;;-1:-1:-1;;;53158:43:0;;;;;;:::o;51531:31::-;;;;;;;:::i;70884:140::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70974:24:::1;:42:::0;70884:140::o;38834:369::-;39001:28;39011:4;39017:2;39021:7;39001:9;:28::i;:::-;-1:-1:-1;;;;;39044:13:0;;11525:20;11573:8;;39044:76;;;;;39064:56;39095:4;39101:2;39105:7;39114:5;39064:30;:56::i;:::-;39063:57;39044:76;39040:156;;;39144:40;;-1:-1:-1;;;39144:40:0;;;;;;;;;;;39040:156;38834:369;;;;:::o;64618:545::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;64721:14:::1;::::0;54438:18:::1;:25:::0;54426:37;::::1;54418:67;;;;-1:-1:-1::0;;;54418:67:0::1;;;;;;;:::i;:::-;64764:14:::2;::::0;54871:18:::2;54890:12;54901:1;64764:14:::0;54890:12:::2;:::i;:::-;54871:32;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:41:::2;:32;::::0;;::::2;;:41;::::0;::::2;;54870:42;54862:74;;;;-1:-1:-1::0;;;54862:74:0::2;;;;;;;:::i;:::-;64796:37:::3;64836:18;64872:1;64855:14;;:18;;;;:::i;:::-;64836:38;;;;;;;;:::i;:::-;;;;;;;;;;;64796:78;;64895:17;:37;64930:1;64913:14;;:18;;;;:::i;:::-;64895:37:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;64895:37:0;;;64933:10:::3;64895:49:::0;;;;;;;;::::3;;64887:78;;;;-1:-1:-1::0;;;64887:78:0::3;;;;;;;:::i;:::-;65010:1;64978:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;65074:5;65022:17;:37;65057:1;65040:14;;:18;;;;:::i;:::-;65022:37:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;65022:37:0;;;65060:10:::3;65022:49:::0;;;;;;;;:57;;-1:-1:-1;;65022:57:0::3;::::0;::::3;;::::0;;;::::3;::::0;;;65140:14:::3;::::0;65097:58;;65140:14;;65097:58:::3;::::0;::::3;64785:378;54496:1:::2;54075::::1;64618:545::o:0;53208:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53208:45:0;;;;;:::o;64079:531::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;64180:13:::1;::::0;54294:17:::1;:24:::0;54282:36;::::1;54274:66;;;;-1:-1:-1::0;;;54274:66:0::1;;;;;;;:::i;:::-;64221:13:::2;::::0;54717:17:::2;54735:12;54746:1;64221:13:::0;54735:12:::2;:::i;:::-;54717:31;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;;;;;;;;;;54716:41;54708:73;;;;-1:-1:-1::0;;;54708:73:0::2;;;;;;;:::i;:::-;64252:36:::3;64291:17;64325:1;64309:13;;:17;;;;:::i;:::-;64291:36;;;;;;;;:::i;:::-;;;;;;;;;;;64252:75;;64348:16;:35;64381:1;64365:13;;:17;;;;:::i;:::-;64348:35:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;64348:35:0;;;64384:10:::3;64348:47:::0;;;;;;;;::::3;;64340:76;;;;-1:-1:-1::0;;;64340:76:0::3;;;;;;;:::i;:::-;64461:1;64429:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;64523:5;64473:16;:35;64506:1;64490:13;;:17;;;;:::i;:::-;64473:35:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;64473:35:0;;;64509:10:::3;64473:47:::0;;;;;;;;:55;;-1:-1:-1;;64473:55:0::3;::::0;::::3;;::::0;;;::::3;::::0;;;64588:13:::3;::::0;64546:56;;64588:13;;64546:56:::3;::::0;::::3;64241:369;54351:1:::2;54075::::1;64079:531::o:0;56510:144::-;56578:11;55818:1;55804:11;:15;55796:48;;;;-1:-1:-1;;;55796:48:0;;;;;;;:::i;:::-;55894:9;;55879:11;55863:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;55855:73;;;;-1:-1:-1;;;55855:73:0;;;;;;;:::i;:::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23:::1;9153:68;;;;-1:-1:-1::0;;;9153:68:0::1;;;;;;;:::i;58376:556::-:0;58495:13;58544:17;58552:8;58544:7;:17::i;:::-;58526:106;;;;-1:-1:-1;;;58526:106:0;;18343:2:1;58526:106:0;;;18325:21:1;18382:2;18362:18;;;18355:30;18421:34;18401:18;;;18394:62;-1:-1:-1;;;18472:18:1;;;18465:45;18527:19;;58526:106:0;18141:411:1;58526:106:0;58649:8;;;;;;;58645:70;;58686:17;58679:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58376:556;;;:::o;58645:70::-;58727:28;58758:10;:8;:10::i;:::-;58727:41;;58817:1;58792:14;58786:28;:32;:138;;;;;;;;;;;;;;;;;58858:14;58874:19;:8;:17;:19::i;:::-;58895:9;58841:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58786:138;58779:145;58376:556;-1:-1:-1;;;58376:556:0:o;56662:821::-;55492:6;;56776:11;;55492:6;;55491:7;55483:43;;;;-1:-1:-1;;;55483:43:0;;;;;;;:::i;:::-;55559:1;55545:11;:15;:54;;;;;55579:20;:18;:20::i;:::-;55564:11;:35;;55545:54;55537:87;;;;-1:-1:-1;;;55537:87:0;;;;;;;:::i;:::-;55674:9;;55659:11;55643:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;55635:73;;;;-1:-1:-1;;;55635:73:0;;;;;;;:::i;:::-;56808:13:::1;::::0;::::1;::::0;::::1;;;56800:45;;;::::0;-1:-1:-1;;;56800:45:0;;14383:2:1;56800:45:0::1;::::0;::::1;14365:21:1::0;14422:2;14402:18;;;14395:30;-1:-1:-1;;;14441:18:1;;;14434:48;14499:18;;56800:45:0::1;14181:342:1::0;56800:45:0::1;56864:10;::::0;56856:48:::1;;;::::0;-1:-1:-1;;;56856:48:0;;17282:2:1;56856:48:0::1;::::0;::::1;17264:21:1::0;17321:2;17301:18;;;17294:30;-1:-1:-1;;;17340:18:1;;;17333:49;17399:18;;56856:48:0::1;17080:343:1::0;56856:48:0::1;57004:28;::::0;-1:-1:-1;;57021:10:0::1;6886:2:1::0;6882:15;6878:53;57004:28:0::1;::::0;::::1;6866:66:1::0;57037:4:0;;6948:12:1;;57004:28:0::1;;;;;;;;;;;;56994:39;;;;;;:47;56986:101;;;::::0;-1:-1:-1;;;56986:101:0;;15081:2:1;56986:101:0::1;::::0;::::1;15063:21:1::0;15120:2;15100:18;;;15093:30;15159:34;15139:18;;;15132:62;-1:-1:-1;;;15210:18:1;;;15203:39;15259:19;;56986:101:0::1;14879:405:1::0;56986:101:0::1;57170:31;57177:10;;57189:4;57195:5;57170:6;:31::i;:::-;57162:79;;;::::0;-1:-1:-1;;;57162:79:0;;23310:2:1;57162:79:0::1;::::0;::::1;23292:21:1::0;23349:2;23329:18;;;23322:30;23388:34;23368:18;;;23361:62;-1:-1:-1;;;23439:18:1;;;23432:33;23482:19;;57162:79:0::1;23108:399:1::0;57162:79:0::1;57282:11;57273:6;:4;:6::i;:::-;:20;;;;:::i;:::-;57260:9;:33;;57252:65;;;::::0;-1:-1:-1;;;57252:65:0;;22962:2:1;57252:65:0::1;::::0;::::1;22944:21:1::0;23001:2;22981:18;;;22974:30;-1:-1:-1;;;23020:18:1;;;23013:49;23079:18;;57252:65:0::1;22760:343:1::0;57252:65:0::1;57375:16;:14;:16::i;:::-;57360:11;57336:21;57346:10;57336:9;:21::i;:::-;:35;;;;:::i;:::-;:55;;57328:102;;;;-1:-1:-1::0;;;57328:102:0::1;;;;;;;:::i;:::-;57441:34;57451:10;57463:11;57441:9;:34::i;68407:532::-:0;68514:10;68539:13;68567:21;68630:18;:25;;;;68619:8;:36;68616:94;;;68657:53;;-1:-1:-1;;;68657:53:0;;;;;;;:::i;68616:94::-;68721:37;68761:18;68780:12;68791:1;68780:8;:12;:::i;:::-;68761:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;68828:14;;;;68857:20;;;;68892:28;;;;;68828:14;;68857:20;;;;;-1:-1:-1;68892:28:0;-1:-1:-1;68407:532:0;-1:-1:-1;;;68407:532:0:o;60939:573::-;54039:10;54031:19;;;;:7;:19;;;;;;;;54023:41;;;;-1:-1:-1;;;54023:41:0;;;;;;;:::i;:::-;61040:13:::1;::::0;54294:17:::1;:24:::0;54282:36;::::1;54274:66;;;;-1:-1:-1::0;;;54274:66:0::1;;;;;;;:::i;:::-;61081:13:::2;::::0;54717:17:::2;54735:12;54746:1;61081:13:::0;54735:12:::2;:::i;:::-;54717:31;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;;;;;;;;;;54716:41;54708:73;;;;-1:-1:-1::0;;;54708:73:0::2;;;;;;;:::i;:::-;61123:13:::3;::::0;55173:16:::3;:30;55190:12;55201:1;61123:13:::0;55190:12:::3;:::i;:::-;55173:30:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;55173:30:0;;;55204:10:::3;55173:42:::0;;;;;;;;::::3;;55172:43;55164:76;;;;-1:-1:-1::0;;;55164:76:0::3;;;;;;;:::i;:::-;61163:16:::4;:35;61196:1;61180:13;;:17;;;;:::i;:::-;61163:35:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;61163:35:0;;;61199:10:::4;61163:47:::0;;;;;;;;::::4;;61162:48;61154:81;;;;-1:-1:-1::0;;;61154:81:0::4;;;;;;;:::i;:::-;61246:36;61285:17;61319:1;61303:13;;:17;;;;:::i;:::-;61285:36;;;;;;;;:::i;:::-;;;;;;;;;;;61246:75;;61364:1;61332:11;:28;;;:33;;;;;;;:::i;:::-;;;;;;;;61426:4;61376:16;:35;61409:1;61393:13;;:17;;;;:::i;:::-;61376:35:::0;;::::4;::::0;;::::4;::::0;;;;;;;;-1:-1:-1;61376:35:0;;;61412:10:::4;61376:47:::0;;;;;;;;:54;;-1:-1:-1;;61376:54:0::4;::::0;::::4;;::::0;;;::::4;::::0;;;61490:13:::4;::::0;61448:56;;61490:13;;61448:56:::4;::::0;::::4;61143:369;54792:1:::3;54351::::2;54075::::1;60939:573::o:0;70039:87::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70101:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;70101:17:0;;::::1;::::0;;;::::1;::::0;;70039:87::o;56341:161::-;55492:6;;56427:11;;55492:6;;55491:7;55483:43;;;;-1:-1:-1;;;55483:43:0;;;;;;;:::i;:::-;55559:1;55545:11;:15;:54;;;;;55579:20;:18;:20::i;:::-;55564:11;:35;;55545:54;55537:87;;;;-1:-1:-1;;;55537:87:0;;;;;;;:::i;:::-;55674:9;;55659:11;55643:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;55635:73;;;;-1:-1:-1;;;55635:73:0;;;;;;;:::i;:::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23:::1;9153:68;;;;-1:-1:-1::0;;;9153:68:0::1;;;;;;;:::i;:::-;56461:33:::2;56471:9;56482:11;56461:9;:33::i;9850:201::-:0;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9939:22:0;::::1;9931:73;;;::::0;-1:-1:-1;;;9931:73:0;;13283:2:1;9931:73:0::1;::::0;::::1;13265:21:1::0;13322:2;13302:18;;;13295:30;13361:34;13341:18;;;13334:62;-1:-1:-1;;;13412:18:1;;;13405:36;13458:19;;9931:73:0::1;13081:402:1::0;9931:73:0::1;10015:28;10034:8;10015:18;:28::i;65171:262::-:0;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;65252:16:::1;::::0;::::1;;:25;65244:120;;;::::0;-1:-1:-1;;;65244:120:0;;18759:2:1;65244:120:0::1;::::0;::::1;18741:21:1::0;18798:2;18778:18;;;18771:30;18837:34;18817:18;;;18810:62;18908:34;18888:18;;;18881:62;-1:-1:-1;;;18959:19:1;;;18952:49;19018:19;;65244:120:0::1;18557:486:1::0;65244:120:0::1;65375:21;65388:7;65375:12;:21::i;:::-;65407:18;67105:16:::0;:23;;-1:-1:-1;;67105:23:0;67124:4;67105:23;;;67057:79;70134:92;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;70200:9:::1;:18:::0;;-1:-1:-1;;;;;;70200:18:0::1;-1:-1:-1::0;;;;;70200:18:0;;;::::1;::::0;;;::::1;::::0;;70134:92::o;39458:187::-;39515:4;39558:7;53483:1;39539:26;;:53;;;;;39579:13;;39569:7;:23;39539:53;:98;;;;-1:-1:-1;;39610:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;39610:27:0;;;;39609:28;;39458:187::o;47069:196::-;47184:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;47184:29:0;-1:-1:-1;;;;;47184:29:0;;;;;;;;;47229:28;;47184:24;;47229:28;;;;;;;47069:196;;;:::o;42571:2112::-;42686:35;42724:20;42736:7;42724:11;:20::i;:::-;42799:18;;42686:58;;-1:-1:-1;42757:22:0;;-1:-1:-1;;;;;42783:34:0;7772:10;-1:-1:-1;;;;;42783:34:0;;:101;;;-1:-1:-1;42851:18:0;;42834:50;;7772:10;38106:164;:::i;42834:50::-;42783:154;;;-1:-1:-1;7772:10:0;42901:20;42913:7;42901:11;:20::i;:::-;-1:-1:-1;;;;;42901:36:0;;42783:154;42757:181;;42956:17;42951:66;;42982:35;;-1:-1:-1;;;42982:35:0;;;;;;;;;;;42951:66;43054:4;-1:-1:-1;;;;;43032:26:0;:13;:18;;;-1:-1:-1;;;;;43032:26:0;;43028:67;;43067:28;;-1:-1:-1;;;43067:28:0;;;;;;;;;;;43028:67;-1:-1:-1;;;;;43110:16:0;;43106:52;;43135:23;;-1:-1:-1;;;43135:23:0;;;;;;;;;;;43106:52;43279:49;43296:1;43300:7;43309:13;:18;;;43279:8;:49::i;:::-;-1:-1:-1;;;;;43624:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;43624:31:0;;;-1:-1:-1;;;;;43624:31:0;;;-1:-1:-1;;43624:31:0;;;;;;;43670:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;43670:29:0;;;;;;;;;;;43716:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;43761:61:0;;;;-1:-1:-1;;;43806:15:0;43761:61;;;;;;;;;;;44096:11;;;44126:24;;;;;:29;44096:11;;44126:29;44122:445;;44351:13;;44337:11;:27;44333:219;;;44421:18;;;44389:24;;;:11;:24;;;;;;;;:50;;44504:28;;;;-1:-1:-1;;;;;44462:70:0;-1:-1:-1;;;44462:70:0;-1:-1:-1;;;;;;44462:70:0;;;-1:-1:-1;;;;;44389:50:0;;;44462:70;;;;;;;44333:219;43599:979;44614:7;44610:2;-1:-1:-1;;;;;44595:27:0;44604:4;-1:-1:-1;;;;;44595:27:0;;;;;;;;;;;44633:42;42675:2008;;42571:2112;;;:::o;63091:517::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;63195:14:::1;::::0;54438:18:::1;:25:::0;54426:37;::::1;54418:67;;;;-1:-1:-1::0;;;54418:67:0::1;;;;;;;:::i;:::-;63238:14:::2;::::0;54871:18:::2;54890:12;54901:1;63238:14:::0;54890:12:::2;:::i;:::-;54871:32;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:41:::2;:32;::::0;;::::2;;:41;::::0;::::2;;54870:42;54862:74;;;;-1:-1:-1::0;;;54862:74:0::2;;;;;;;:::i;:::-;63270:37:::3;63310:18;63346:1;63329:14;;:18;;;;:::i;:::-;63310:38;;;;;;;;:::i;:::-;;;;;;;;;;;63270:78;;63415:24;;63383:11;:28;;;:56;;63361:123;;;;-1:-1:-1::0;;;63361:123:0::3;;;;;;;:::i;:::-;63497:20;::::0;::::3;:27:::0;;-1:-1:-1;;63497:27:0::3;63520:4;63497:27;::::0;;63585:14:::3;::::0;63542:58:::3;::::0;63573:10:::3;::::0;63542:58:::3;::::0;63497:20:::3;::::0;63542:58:::3;63259:349;54496:1:::2;9232::::1;63091:517::o:0;62576:507::-;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;62678:13:::1;::::0;54294:17:::1;:24:::0;54282:36;::::1;54274:66;;;;-1:-1:-1::0;;;54274:66:0::1;;;;;;;:::i;:::-;62719:13:::2;::::0;54717:17:::2;54735:12;54746:1;62719:13:::0;54735:12:::2;:::i;:::-;54717:31;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;;;;;;;;;;54716:41;54708:73;;;;-1:-1:-1::0;;;54708:73:0::2;;;;;;;:::i;:::-;62750:36:::3;62789:17;62823:1;62807:13;;:17;;;;:::i;:::-;62789:36;;;;;;;;:::i;:::-;;;;;;;;;;;62750:75;;62892:24;;62860:11;:28;;;:56;;62838:123;;;;-1:-1:-1::0;;;62838:123:0::3;;;;;;;:::i;:::-;62997:4;62974:20:::0;::::3;:27:::0;;-1:-1:-1;;;;62974:27:0::3;-1:-1:-1::0;;;62974:27:0::3;::::0;;63061:13:::3;::::0;63019:56:::3;::::0;63049:10:::3;::::0;63019:56:::3;::::0;62974:27;;63019:56:::3;62739:344;54351:1:::2;9232::::1;62576:507::o:0;66419:260::-;66482:7;;66502:138;66526:6;:13;66522:17;;66502:138;;;66578:6;-1:-1:-1;;;;;66565:19:0;:6;66572:1;66565:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;66565:9:0;:19;66561:68;;;66612:1;66419:260;-1:-1:-1;;66419:260:0:o;66561:68::-;66541:3;;;;:::i;:::-;;;;66502:138;;;-1:-1:-1;66652:19:0;;-1:-1:-1;;;66652:19:0;;12946:2:1;66652:19:0;;;12928:21:1;12985:1;12965:18;;;12958:29;-1:-1:-1;;;13003:18:1;;;12996:39;13052:18;;66652:19:0;12744:332:1;62117:451:0;9014:6;;-1:-1:-1;;;;;9014:6:0;7772:10;9161:23;9153:68;;;;-1:-1:-1;;;9153:68:0;;;;;;;:::i;:::-;62209:8:::1;::::0;54156:12:::1;:19:::0;54144:31;::::1;54136:61;;;;-1:-1:-1::0;;;54136:61:0::1;;;;;;;:::i;:::-;62240:8:::2;::::0;54569:12:::2;54582;54593:1;62240:8:::0;54582:12:::2;:::i;:::-;54569:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:35:::0;-1:-1:-1;;;54569:35:0;::::2;;;54568:36;54560:68;;;;-1:-1:-1::0;;;54560:68:0::2;;;;;;;:::i;:::-;62266:31:::3;62300:12;62324:1;62313:8;;:12;;;;:::i;:::-;62300:26;;;;;;;;:::i;:::-;;;;;;;;;;;62266:60;;62393:24;;62361:11;:28;;;:56;;62339:123;;;;-1:-1:-1::0;;;62339:123:0::3;;;;;;;:::i;:::-;62475:27:::0;;-1:-1:-1;;;;62475:27:0::3;-1:-1:-1::0;;;62475:27:0::3;::::0;;62551:8:::3;::::0;62520:40:::3;::::0;62539:10:::3;::::0;62520:40:::3;::::0;62475:20:::3;::::0;62520:40:::3;62255:313;54208:1:::2;9232::::1;62117:451::o:0;34616:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;34726:7:0;;53483:1;34775:23;;:47;;;;;34809:13;;34802:4;:20;34775:47;34771:886;;;34843:31;34877:17;;;:11;:17;;;;;;;;;34843:51;;;;;;;;;-1:-1:-1;;;;;34843:51:0;;;;-1:-1:-1;;;34843:51:0;;-1:-1:-1;;;;;34843:51:0;;;;;;;;-1:-1:-1;;;34843:51:0;;;;;;;;;;;;;;34913:729;;34963:14;;-1:-1:-1;;;;;34963:28:0;;34959:101;;35027:9;34616:1108;-1:-1:-1;;;34616:1108:0:o;34959:101::-;-1:-1:-1;;;35402:6:0;35447:17;;;;:11;:17;;;;;;;;;35435:29;;;;;;;;;-1:-1:-1;;;;;35435:29:0;;;;;-1:-1:-1;;;35435:29:0;;-1:-1:-1;;;;;35435:29:0;;;;;;;;-1:-1:-1;;;35435:29:0;;;;;;;;;;;;;35495:28;35491:109;;35563:9;34616:1108;-1:-1:-1;;;34616:1108:0:o;35491:109::-;35362:261;;;34824:833;34771:886;35685:31;;-1:-1:-1;;;35685:31:0;;;;;;;;;;;10211:191;10304:6;;;-1:-1:-1;;;;;10321:17:0;;;-1:-1:-1;;;;;;10321:17:0;;;;;;;10354:40;;10304:6;;;10321:17;10304:6;;10354:40;;10285:16;;10354:40;10274:128;10211:191;:::o;39653:104::-;39722:27;39732:2;39736:8;39722:27;;;;;;;;;;;;:9;:27::i;47757:667::-;47941:72;;-1:-1:-1;;;47941:72:0;;47920:4;;-1:-1:-1;;;;;47941:36:0;;;;;:72;;7772:10;;47992:4;;47998:7;;48007:5;;47941:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47941:72:0;;;;;;;;-1:-1:-1;;47941:72:0;;;;;;;;;;;;:::i;:::-;;;47937:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48175:13:0;;48171:235;;48221:40;;-1:-1:-1;;;48221:40:0;;;;;;;;;;;48171:235;48364:6;48358:13;48349:6;48345:2;48341:15;48334:38;47937:480;-1:-1:-1;;;;;;48060:55:0;-1:-1:-1;;;48060:55:0;;-1:-1:-1;47937:480:0;47757:667;;;;;;:::o;72614:110::-;72674:13;72707:9;72700:16;;;;;:::i;5281:723::-;5337:13;5558:10;5554:53;;-1:-1:-1;;5585:10:0;;;;;;;;;;;;-1:-1:-1;;;5585:10:0;;;;;5281:723::o;5554:53::-;5632:5;5617:12;5673:78;5680:9;;5673:78;;5706:8;;;;:::i;:::-;;-1:-1:-1;5729:10:0;;-1:-1:-1;5737:2:0;5729:10;;:::i;:::-;;;5673:78;;;5761:19;5793:6;-1:-1:-1;;;;;5783:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5783:17:0;;5761:39;;5811:154;5818:10;;5811:154;;5845:11;5855:1;5845:11;;:::i;:::-;;-1:-1:-1;5914:10:0;5922:2;5914:5;:10;:::i;:::-;5901:24;;:2;:24;:::i;:::-;5888:39;;5871:6;5878;5871:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5871:56:0;;;;;;;;-1:-1:-1;5942:11:0;5951:2;5942:11;;:::i;:::-;;;5811:154;;57491:174;57589:4;57613:44;57632:5;57639:11;57652:4;57613:18;:44::i;66687:362::-;66760:6;66755:287;66776:7;:14;66772:1;:18;66755:287;;;66812:13;66828:7;66836:1;66828:10;;;;;;;;:::i;:::-;;;;;;;66812:26;;66880:1;-1:-1:-1;;;;;66863:19:0;:5;-1:-1:-1;;;;;66863:19:0;;;66855:45;;;;-1:-1:-1;;;66855:45:0;;15904:2:1;66855:45:0;;;15886:21:1;15943:2;15923:18;;;15916:30;-1:-1:-1;;;15962:18:1;;;15955:43;16015:18;;66855:45:0;15702:337:1;66855:45:0;-1:-1:-1;;;;;66924:14:0;;;;;;:7;:14;;;;;;;;66923:15;66915:44;;;;-1:-1:-1;;;66915:44:0;;12601:2:1;66915:44:0;;;12583:21:1;12640:2;12620:18;;;12613:30;-1:-1:-1;;;12659:18:1;;;12652:46;12715:18;;66915:44:0;12399:340:1;66915:44:0;-1:-1:-1;;;;;66976:14:0;;;;;:7;:14;;;;;:21;;-1:-1:-1;;66976:21:0;66993:4;66976:21;;;;;;67012:6;:18;;;;;;;;;;;;;;-1:-1:-1;;;;;;67012:18:0;;;;;;66792:3;;;;:::i;:::-;;;;66755:287;;40120:163;40243:32;40249:2;40253:8;40263:5;40270:4;40243:5;:32::i;3683:190::-;3808:4;3861;3832:25;3845:5;3852:4;3832:12;:25::i;:::-;:33;;3683:190;-1:-1:-1;;;;3683:190:0:o;40542:1775::-;40681:20;40704:13;-1:-1:-1;;;;;40732:16:0;;40728:48;;40757:19;;-1:-1:-1;;;40757:19:0;;;;;;;;;;;40728:48;40791:13;40787:44;;40813:18;;-1:-1:-1;;;40813:18:0;;;;;;;;;;;40787:44;-1:-1:-1;;;;;41182:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;41241:49:0;;-1:-1:-1;;;;;41182:44:0;;;;;;;41241:49;;;;-1:-1:-1;;41182:44:0;;;;;;41241:49;;;;;;;;;;;;;;;;41307:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;41357:66:0;;;;-1:-1:-1;;;41407:15:0;41357:66;;;;;;;;;;41307:25;41504:23;;;41548:4;:23;;;;-1:-1:-1;;;;;;41556:13:0;;11525:20;11573:8;;41556:15;41544:641;;;41592:314;41623:38;;41648:12;;-1:-1:-1;;;;;41623:38:0;;;41640:1;;41623:38;;41640:1;;41623:38;41689:69;41728:1;41732:2;41736:14;;;;;;41752:5;41689:30;:69::i;:::-;41684:174;;41794:40;;-1:-1:-1;;;41794:40:0;;;;;;;;;;;41684:174;41901:3;41885:12;:19;;41592:314;;41987:12;41970:13;;:29;41966:43;;42001:8;;;41966:43;41544:641;;;42050:120;42081:40;;42106:14;;;;;-1:-1:-1;;;;;42081:40:0;;;42098:1;;42081:40;;42098:1;;42081:40;42165:3;42149:12;:19;;42050:120;;41544:641;-1:-1:-1;42199:13:0;:28;42249:60;38834:369;4235:701;4318:7;4361:4;4318:7;4376:523;4400:5;:12;4396:1;:16;4376:523;;;4434:20;4457:5;4463:1;4457:8;;;;;;;;:::i;:::-;;;;;;;4434:31;;4500:12;4484;:28;4480:408;;4637:44;;;;;;7128:19:1;;;7163:12;;;7156:28;;;7200:12;;4637:44:0;;;;;;;;;;;;4627:55;;;;;;4612:70;;4480:408;;;4827:44;;;;;;7128:19:1;;;7163:12;;;7156:28;;;7200:12;;4827:44:0;;;;;;;;;;;;4817:55;;;;;;4802:70;;4480:408;-1:-1:-1;4414:3:0;;;;:::i;:::-;;;;4376:523;;;-1:-1:-1;4916:12:0;4235:701;-1:-1:-1;;;4235:701:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;-1:-1:-1;;;;;1976:6:1;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:908::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;-1:-1:-1;;;;;2985:6:1;2982:30;2979:50;;;3025:1;3022;3015:12;2979:50;3048:22;;3101:4;3093:13;;3089:27;-1:-1:-1;3079:55:1;;3130:1;3127;3120:12;3079:55;3166:2;3153:16;3189:60;3205:43;3245:2;3205:43;:::i;:::-;3189:60;:::i;:::-;3271:3;3295:2;3290:3;3283:15;3323:2;3318:3;3314:12;3307:19;;3354:2;3350;3346:11;3402:7;3397:2;3391;3388:1;3384:10;3380:2;3376:19;3372:28;3369:41;3366:61;;;3423:1;3420;3413:12;3366:61;3445:1;3436:10;;3455:169;3469:2;3466:1;3463:9;3455:169;;;3526:23;3545:3;3526:23;:::i;:::-;3514:36;;3487:1;3480:9;;;;;3570:12;;;;3602;;3455:169;;;-1:-1:-1;3643:5:1;2746:908;-1:-1:-1;;;;;;;2746:908:1:o;3659:180::-;3715:6;3768:2;3756:9;3747:7;3743:23;3739:32;3736:52;;;3784:1;3781;3774:12;3736:52;3807:26;3823:9;3807:26;:::i;3844:180::-;3903:6;3956:2;3944:9;3935:7;3931:23;3927:32;3924:52;;;3972:1;3969;3962:12;3924:52;-1:-1:-1;3995:23:1;;3844:180;-1:-1:-1;3844:180:1:o;4029:245::-;4087:6;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4195:9;4182:23;4214:30;4238:5;4214:30;:::i;4279:249::-;4348:6;4401:2;4389:9;4380:7;4376:23;4372:32;4369:52;;;4417:1;4414;4407:12;4369:52;4449:9;4443:16;4468:30;4492:5;4468:30;:::i;4533:450::-;4602:6;4655:2;4643:9;4634:7;4630:23;4626:32;4623:52;;;4671:1;4668;4661:12;4623:52;4711:9;4698:23;-1:-1:-1;;;;;4736:6:1;4733:30;4730:50;;;4776:1;4773;4766:12;4730:50;4799:22;;4852:4;4844:13;;4840:27;-1:-1:-1;4830:55:1;;4881:1;4878;4871:12;4830:55;4904:73;4969:7;4964:2;4951:16;4946:2;4942;4938:11;4904:73;:::i;5173:254::-;5241:6;5249;5302:2;5290:9;5281:7;5277:23;5273:32;5270:52;;;5318:1;5315;5308:12;5270:52;5354:9;5341:23;5331:33;;5383:38;5417:2;5406:9;5402:18;5383:38;:::i;5432:1038::-;5534:6;5542;5550;5603:2;5591:9;5582:7;5578:23;5574:32;5571:52;;;5619:1;5616;5609:12;5571:52;5655:9;5642:23;5632:33;;5684:2;5733;5722:9;5718:18;5705:32;5695:42;;5788:2;5777:9;5773:18;5760:32;-1:-1:-1;;;;;5807:6:1;5804:30;5801:50;;;5847:1;5844;5837:12;5801:50;5870:22;;5923:4;5915:13;;5911:27;-1:-1:-1;5901:55:1;;5952:1;5949;5942:12;5901:55;5988:2;5975:16;6011:60;6027:43;6067:2;6027:43;:::i;6011:60::-;6093:3;6117:2;6112:3;6105:15;6145:2;6140:3;6136:12;6129:19;;6176:2;6172;6168:11;6224:7;6219:2;6213;6210:1;6206:10;6202:2;6198:19;6194:28;6191:41;6188:61;;;6245:1;6242;6235:12;6188:61;6267:1;6258:10;;6277:163;6291:2;6288:1;6285:9;6277:163;;;6348:17;;6336:30;;6309:1;6302:9;;;;;6386:12;;;;6418;;6277:163;;;6281:3;6459:5;6449:15;;;;;;;5432:1038;;;;;:::o;6475:257::-;6516:3;6554:5;6548:12;6581:6;6576:3;6569:19;6597:63;6653:6;6646:4;6641:3;6637:14;6630:4;6623:5;6619:16;6597:63;:::i;:::-;6714:2;6693:15;-1:-1:-1;;6689:29:1;6680:39;;;;6721:4;6676:50;;6475:257;-1:-1:-1;;6475:257:1:o;7223:1527::-;7447:3;7485:6;7479:13;7511:4;7524:51;7568:6;7563:3;7558:2;7550:6;7546:15;7524:51;:::i;:::-;7638:13;;7597:16;;;;7660:55;7638:13;7597:16;7682:15;;;7660:55;:::i;:::-;7804:13;;7737:20;;;7777:1;;7864;7886:18;;;;7939;;;;7966:93;;8044:4;8034:8;8030:19;8018:31;;7966:93;8107:2;8097:8;8094:16;8074:18;8071:40;8068:167;;;-1:-1:-1;;;8134:33:1;;8190:4;8187:1;8180:15;8220:4;8141:3;8208:17;8068:167;8251:18;8278:110;;;;8402:1;8397:328;;;;8244:481;;8278:110;-1:-1:-1;;8313:24:1;;8299:39;;8358:20;;;;-1:-1:-1;8278:110:1;;8397:328;24975:1;24968:14;;;25012:4;24999:18;;8492:1;8506:169;8520:8;8517:1;8514:15;8506:169;;;8602:14;;8587:13;;;8580:37;8645:16;;;;8537:10;;8506:169;;;8510:3;;8706:8;8699:5;8695:20;8688:27;;8244:481;-1:-1:-1;8741:3:1;;7223:1527;-1:-1:-1;;;;;;;;;;;7223:1527:1:o;9425:488::-;-1:-1:-1;;;;;9694:15:1;;;9676:34;;9746:15;;9741:2;9726:18;;9719:43;9793:2;9778:18;;9771:34;;;9841:3;9836:2;9821:18;;9814:31;;;9619:4;;9862:45;;9887:19;;9879:6;9862:45;:::i;:::-;9854:53;9425:488;-1:-1:-1;;;;;;9425:488:1:o;10278:658::-;10449:2;10501:21;;;10571:13;;10474:18;;;10593:22;;;10420:4;;10449:2;10672:15;;;;10646:2;10631:18;;;10420:4;10715:195;10729:6;10726:1;10723:13;10715:195;;;10794:13;;-1:-1:-1;;;;;10790:39:1;10778:52;;10885:15;;;;10850:12;;;;10826:1;10744:9;10715:195;;;-1:-1:-1;10927:3:1;;10278:658;-1:-1:-1;;;;;;10278:658:1:o;10941:632::-;11112:2;11164:21;;;11234:13;;11137:18;;;11256:22;;;11083:4;;11112:2;11335:15;;;;11309:2;11294:18;;;11083:4;11378:169;11392:6;11389:1;11386:13;11378:169;;;11453:13;;11441:26;;11522:15;;;;11487:12;;;;11414:1;11407:9;11378:169;;11770:219;11919:2;11908:9;11901:21;11882:4;11939:44;11979:2;11968:9;11964:18;11956:6;11939:44;:::i;13488:339::-;13690:2;13672:21;;;13729:2;13709:18;;;13702:30;-1:-1:-1;;;13763:2:1;13748:18;;13741:45;13818:2;13803:18;;13488:339::o;13832:344::-;14034:2;14016:21;;;14073:2;14053:18;;;14046:30;-1:-1:-1;;;14107:2:1;14092:18;;14085:50;14167:2;14152:18;;13832:344::o;14528:346::-;14730:2;14712:21;;;14769:2;14749:18;;;14742:30;-1:-1:-1;;;14803:2:1;14788:18;;14781:52;14865:2;14850:18;;14528:346::o;16044:341::-;16246:2;16228:21;;;16285:2;16265:18;;;16258:30;-1:-1:-1;;;16319:2:1;16304:18;;16297:47;16376:2;16361:18;;16044:341::o;16731:344::-;16933:2;16915:21;;;16972:2;16952:18;;;16945:30;-1:-1:-1;;;17006:2:1;16991:18;;16984:50;17066:2;17051:18;;16731:344::o;17428:356::-;17630:2;17612:21;;;17649:18;;;17642:30;17708:34;17703:2;17688:18;;17681:62;17775:2;17760:18;;17428:356::o;17789:347::-;17991:2;17973:21;;;18030:2;18010:18;;;18003:30;18069:25;18064:2;18049:18;;18042:53;18127:2;18112:18;;17789:347::o;19048:344::-;19250:2;19232:21;;;19289:2;19269:18;;;19262:30;-1:-1:-1;;;19323:2:1;19308:18;;19301:50;19383:2;19368:18;;19048:344::o;19397:398::-;19599:2;19581:21;;;19638:2;19618:18;;;19611:30;19677:34;19672:2;19657:18;;19650:62;-1:-1:-1;;;19743:2:1;19728:18;;19721:32;19785:3;19770:19;;19397:398::o;19800:400::-;20002:2;19984:21;;;20041:2;20021:18;;;20014:30;20080:34;20075:2;20060:18;;20053:62;-1:-1:-1;;;20146:2:1;20131:18;;20124:34;20190:3;20175:19;;19800:400::o;20205:404::-;20407:2;20389:21;;;20446:2;20426:18;;;20419:30;20485:34;20480:2;20465:18;;20458:62;-1:-1:-1;;;20551:2:1;20536:18;;20529:38;20599:3;20584:19;;20205:404::o;20614:343::-;20816:2;20798:21;;;20855:2;20835:18;;;20828:30;-1:-1:-1;;;20889:2:1;20874:18;;20867:49;20948:2;20933:18;;20614:343::o;20962:340::-;21164:2;21146:21;;;21203:2;21183:18;;;21176:30;-1:-1:-1;;;21237:2:1;21222:18;;21215:46;21293:2;21278:18;;20962:340::o;21307:341::-;21509:2;21491:21;;;21548:2;21528:18;;;21521:30;-1:-1:-1;;;21582:2:1;21567:18;;21560:47;21639:2;21624:18;;21307:341::o;21653:332::-;21855:2;21837:21;;;21894:1;21874:18;;;21867:29;-1:-1:-1;;;21927:2:1;21912:18;;21905:39;21976:2;21961:18;;21653:332::o;21990:407::-;22192:2;22174:21;;;22231:2;22211:18;;;22204:30;22270:34;22265:2;22250:18;;22243:62;-1:-1:-1;;;22336:2:1;22321:18;;22314:41;22387:3;22372:19;;21990:407::o;22402:353::-;22604:2;22586:21;;;22643:2;22623:18;;;22616:30;22682:31;22677:2;22662:18;;22655:59;22746:2;22731:18;;22402:353::o;24434:275::-;24505:2;24499:9;24570:2;24551:13;;-1:-1:-1;;24547:27:1;24535:40;;-1:-1:-1;;;;;24590:34:1;;24626:22;;;24587:62;24584:88;;;24652:18;;:::i;:::-;24688:2;24681:22;24434:275;;-1:-1:-1;24434:275:1:o;24714:183::-;24774:4;-1:-1:-1;;;;;24799:6:1;24796:30;24793:56;;;24829:18;;:::i;:::-;-1:-1:-1;24874:1:1;24870:14;24886:4;24866:25;;24714:183::o;25028:128::-;25068:3;25099:1;25095:6;25092:1;25089:13;25086:39;;;25105:18;;:::i;:::-;-1:-1:-1;25141:9:1;;25028:128::o;25161:120::-;25201:1;25227;25217:35;;25232:18;;:::i;:::-;-1:-1:-1;25266:9:1;;25161:120::o;25286:168::-;25326:7;25392:1;25388;25384:6;25380:14;25377:1;25374:21;25369:1;25362:9;25355:17;25351:45;25348:71;;;25399:18;;:::i;:::-;-1:-1:-1;25439:9:1;;25286:168::o;25459:125::-;25499:4;25527:1;25524;25521:8;25518:34;;;25532:18;;:::i;:::-;-1:-1:-1;25569:9:1;;25459:125::o;25589:258::-;25661:1;25671:113;25685:6;25682:1;25679:13;25671:113;;;25761:11;;;25755:18;25742:11;;;25735:39;25707:2;25700:10;25671:113;;;25802:6;25799:1;25796:13;25793:48;;;-1:-1:-1;;25837:1:1;25819:16;;25812:27;25589:258::o;25852:380::-;25931:1;25927:12;;;;25974;;;25995:61;;26049:4;26041:6;26037:17;26027:27;;25995:61;26102:2;26094:6;26091:14;26071:18;26068:38;26065:161;;;26148:10;26143:3;26139:20;26136:1;26129:31;26183:4;26180:1;26173:15;26211:4;26208:1;26201:15;26065:161;;25852:380;;;:::o;26237:135::-;26276:3;-1:-1:-1;;26297:17:1;;26294:43;;;26317:18;;:::i;:::-;-1:-1:-1;26364:1:1;26353:13;;26237:135::o;26377:112::-;26409:1;26435;26425:35;;26440:18;;:::i;:::-;-1:-1:-1;26474:9:1;;26377:112::o;26494:127::-;26555:10;26550:3;26546:20;26543:1;26536:31;26586:4;26583:1;26576:15;26610:4;26607:1;26600:15;26626:127;26687:10;26682:3;26678:20;26675:1;26668:31;26718:4;26715:1;26708:15;26742:4;26739:1;26732:15;26758:127;26819:10;26814:3;26810:20;26807:1;26800:31;26850:4;26847:1;26840:15;26874:4;26871:1;26864:15;26890:127;26951:10;26946:3;26942:20;26939:1;26932:31;26982:4;26979:1;26972:15;27006:4;27003:1;26996:15;27022:131;-1:-1:-1;;;;;;27096:32:1;;27086:43;;27076:71;;27143:1;27140;27133:12

Swarm Source

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