ETH Price: $3,416.08 (+1.83%)

Token

DiamondHands (DH)
 

Overview

Max Total Supply

11,111 DH

Holders

2,228

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mattomalley.eth
Balance
2 DH
0x0f7a2eb5dfe07f58b73f2a61094bbd3541d3c520
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Diamond Hands is a collection of 11,111 programmatically, randomly generated NFTs on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondHands

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-01
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

pragma solidity ^0.8.0;

/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File: NFT.sol


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

contract DiamondHands is ERC721Enumerable, Ownable{
    using Strings for uint256;
    using SafeMath for uint;
    
    string public baseURI;

    uint256 public constant TOTAL_SUPPLY = 11111;
    
    uint256 public constant NFT_MINT_PRICE = 0.09 ether;
    
    uint256 public constant MAX_BULK_TOKEN = 20;
    
    bool public saleActivated;

    constructor()
        ERC721("DiamondHands", "DH")
    {
    }
    
    function setSaleActivatedPauseOrUnpause(bool _value) public onlyOwner{
        saleActivated = _value;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner{
        baseURI = _newBaseURI;
    }

    function bulkMint(uint256 _amount) public payable {
        require(saleActivated, "bulkMint: Mint process is pause");
        
        require(_amount > 0, "bulkMint: amount cannot be 0");
        require(totalSupply() < TOTAL_SUPPLY, "bulkMint: sale has already ended");
        require(totalSupply().add(_amount) <= TOTAL_SUPPLY, "bulkMint: sale has already ended");
        require(_amount <= MAX_BULK_TOKEN, "bulkMint: You may not buy more than MAX_BULK_TOKEN NFTs at once");
        require(msg.value == _amount.mul(NFT_MINT_PRICE), "bulkMint: Ether value sent is not correct");
        for (uint256 i = 0; i < _amount; i++) {
            uint idx = totalSupply();
            if(totalSupply() < TOTAL_SUPPLY){
                _safeMint(msg.sender, idx);
            }
        }
    }
    
    function assignNFT(address[] calldata destinations, uint256 _amount) public onlyOwner{

        require(_amount > 0, "assignNFT: amount cannot be 0");
        require(totalSupply() < TOTAL_SUPPLY, "assignNFT: sale has already ended");
        require(totalSupply().add(_amount) <= TOTAL_SUPPLY, "assignNFT: sale has already ended");
        require(_amount <= MAX_BULK_TOKEN, "assignNFT: You may not buy more than MAX_BULK_TOKEN NFTs at once");
        require(destinations.length > 0, "assignNFT: destinations list cannot be empty");
        for(uint256 k = 0; k < destinations.length; k++){
            for (uint256 i = 0; i < _amount; i++) {
                uint idx = totalSupply();
                if(totalSupply() < TOTAL_SUPPLY){
                    _safeMint(destinations[k], idx);
                }
            }
        }
    }
    
    function tokenOwnedByUser(address _owner) public view returns (uint256[] memory){
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i = 0; i < ownerTokenCount; i++) {
          tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
          _exists(tokenId),
          "ERC721Metadata: URI query for nonexistent token"
        );
    
        return bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : "";
    }

    function withdrawFund(address destination) public onlyOwner returns(bool){
        uint balance = address(this).balance;
        (bool success, ) = destination.call{value:balance}("");
        return success;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_BULK_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"destinations","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"assignNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"bulkMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActivated","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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setSaleActivatedPauseOrUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokenOwnedByUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"}],"name":"withdrawFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f4469616d6f6e6448616e647300000000000000000000000000000000000000008152506040518060400160405280600281526020017f4448000000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61467680620002cb6000396000f3fe6080604052600436106101cc5760003560e01c80636c0360eb116100f75780639cd3948111610095578063dc9b125d11610064578063dc9b125d1461068c578063e985e9c5146106b7578063f2fde38b146106f4578063fdc4da341461071d576101cc565b80639cd39481146105d2578063a22cb465146105fd578063b88d4fde14610626578063c87b56dd1461064f576101cc565b80638da5cb5b116100d15780638da5cb5b14610528578063902d55a5146105535780639146b8251461057e57806395d89b41146105a7576101cc565b80636c0360eb146104a957806370a08231146104d4578063715018a614610511576101cc565b80632f745c591161016f57806355f804b31161013e57806355f804b3146103ef5780635bde758f146104185780635c041b33146104435780636352211e1461046c576101cc565b80632f745c591461030f57806342842e0e1461034c5780634f6ccce7146103755780635376f1a3146103b2576101cc565b8063081812fc116101ab578063081812fc14610255578063095ea7b31461029257806318160ddd146102bb57806323b872dd146102e6576101cc565b8062bc653c146101d157806301ffc9a7146101ed57806306fdde031461022a575b600080fd5b6101eb60048036038101906101e69190613150565b61075a565b005b3480156101f957600080fd5b50610214600480360381019061020f91906130bd565b610980565b6040516102219190613dbb565b60405180910390f35b34801561023657600080fd5b5061023f6109fa565b60405161024c9190613dd6565b60405180910390f35b34801561026157600080fd5b5061027c60048036038101906102779190613150565b610a8c565b6040516102899190613d32565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613000565b610b11565b005b3480156102c757600080fd5b506102d0610c29565b6040516102dd9190614158565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612efa565b610c36565b005b34801561031b57600080fd5b5061033660048036038101906103319190613000565b610c96565b6040516103439190614158565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612efa565b610d3b565b005b34801561038157600080fd5b5061039c60048036038101906103979190613150565b610d5b565b6040516103a99190614158565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612e95565b610df2565b6040516103e69190613dbb565b60405180910390f35b3480156103fb57600080fd5b506104166004803603810190610411919061310f565b610eeb565b005b34801561042457600080fd5b5061042d610f81565b60405161043a9190614158565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061303c565b610f86565b005b34801561047857600080fd5b50610493600480360381019061048e9190613150565b611234565b6040516104a09190613d32565b60405180910390f35b3480156104b557600080fd5b506104be6112e6565b6040516104cb9190613dd6565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e95565b611374565b6040516105089190614158565b60405180910390f35b34801561051d57600080fd5b5061052661142c565b005b34801561053457600080fd5b5061053d6114b4565b60405161054a9190613d32565b60405180910390f35b34801561055f57600080fd5b506105686114de565b6040516105759190614158565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613094565b6114e4565b005b3480156105b357600080fd5b506105bc61157d565b6040516105c99190613dd6565b60405180910390f35b3480156105de57600080fd5b506105e761160f565b6040516105f49190614158565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612fc4565b61161b565b005b34801561063257600080fd5b5061064d60048036038101906106489190612f49565b61179c565b005b34801561065b57600080fd5b5061067660048036038101906106719190613150565b6117fe565b6040516106839190613dd6565b60405180910390f35b34801561069857600080fd5b506106a16118a6565b6040516106ae9190613dbb565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190612ebe565b6118b9565b6040516106eb9190613dbb565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190612e95565b61194d565b005b34801561072957600080fd5b50610744600480360381019061073f9190612e95565b611a45565b6040516107519190613d99565b60405180910390f35b600c60009054906101000a900460ff166107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090614058565b60405180910390fd5b600081116107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e390614098565b60405180910390fd5b612b676107f7610c29565b10610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90614118565b60405180910390fd5b612b6761085482610846610c29565b611b3f90919063ffffffff16565b1115610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c90614118565b60405180910390fd5b60148111156108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090613e38565b60405180910390fd5b6108f467013fbe85edc9000082611b5590919063ffffffff16565b3414610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613f58565b60405180910390fd5b60005b8181101561097c57600061094a610c29565b9050612b67610957610c29565b1015610968576109673382611b6b565b5b5080806109749061449d565b915050610938565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f357506109f282611b89565b5b9050919050565b606060008054610a099061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a359061446b565b8015610a825780601f10610a5757610100808354040283529160200191610a82565b820191906000526020600020905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b6000610a9782611c6b565b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613fb8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1c82611234565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8490614078565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bac611cd7565b73ffffffffffffffffffffffffffffffffffffffff161480610bdb5750610bda81610bd5611cd7565b6118b9565b5b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613ef8565b60405180910390fd5b610c248383611cdf565b505050565b6000600880549050905090565b610c47610c41611cd7565b82611d98565b610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d906140d8565b60405180910390fd5b610c91838383611e76565b505050565b6000610ca183611374565b8210610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613df8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d568383836040518060200160405280600081525061179c565b505050565b6000610d65610c29565b8210610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906140f8565b60405180910390fd5b60088281548110610de0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610dfc611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610e1a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6790613fd8565b60405180910390fd5b600047905060008373ffffffffffffffffffffffffffffffffffffffff1682604051610e9b90613d1d565b60006040518083038185875af1925050503d8060008114610ed8576040519150601f19603f3d011682016040523d82523d6000602084013e610edd565b606091505b505090508092505050919050565b610ef3611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610f116114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90613fd8565b60405180910390fd5b80600b9080519060200190610f7d929190612c6f565b5050565b601481565b610f8e611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610fac6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613fd8565b60405180910390fd5b60008111611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614138565b60405180910390fd5b612b67611050610c29565b10611090576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611087906140b8565b60405180910390fd5b612b676110ad8261109f610c29565b611b3f90919063ffffffff16565b11156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e5906140b8565b60405180910390fd5b6014811115611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614038565b60405180910390fd5b60008383905011611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90613f78565b60405180910390fd5b60005b8383905081101561122e5760005b8281101561121a57600061119b610c29565b9050612b676111a8610c29565b1015611206576112058686858181106111ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906111ff9190612e95565b82611b6b565b5b5080806112129061449d565b915050611189565b5080806112269061449d565b91505061117b565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d490613f38565b60405180910390fd5b80915050919050565b600b80546112f39061446b565b80601f016020809104026020016040519081016040528092919081815260200182805461131f9061446b565b801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613f18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611434611cd7565b73ffffffffffffffffffffffffffffffffffffffff166114526114b4565b73ffffffffffffffffffffffffffffffffffffffff16146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613fd8565b60405180910390fd5b6114b260006120d2565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612b6781565b6114ec611cd7565b73ffffffffffffffffffffffffffffffffffffffff1661150a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790613fd8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606001805461158c9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546115b89061446b565b80156116055780601f106115da57610100808354040283529160200191611605565b820191906000526020600020905b8154815290600101906020018083116115e857829003601f168201915b5050505050905090565b67013fbe85edc9000081565b611623611cd7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613eb8565b60405180910390fd5b806005600061169e611cd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174b611cd7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117909190613dbb565b60405180910390a35050565b6117ad6117a7611cd7565b83611d98565b6117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e3906140d8565b60405180910390fd5b6117f884848484612198565b50505050565b606061180982611c6b565b611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90614018565b60405180910390fd5b6000600b80546118579061446b565b905011611873576040518060200160405280600081525061189f565b600b61187e836121f4565b60405160200161188f929190613cf9565b6040516020818303038152906040525b9050919050565b600c60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611955611cd7565b73ffffffffffffffffffffffffffffffffffffffff166119736114b4565b73ffffffffffffffffffffffffffffffffffffffff16146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c090613fd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090613e58565b60405180910390fd5b611a42816120d2565b50565b60606000611a5283611374565b905060008167ffffffffffffffff811115611a96577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ac45781602001602082028036833780820191505090505b50905060005b82811015611b3457611adc8582610c96565b828281518110611b15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611b2c9061449d565b915050611aca565b508092505050919050565b60008183611b4d91906142a0565b905092915050565b60008183611b639190614327565b905092915050565b611b858282604051806020016040528060008152506123a1565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c645750611c63826123fc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5283611234565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611da382611c6b565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613ed8565b60405180910390fd5b6000611ded83611234565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5c57508373ffffffffffffffffffffffffffffffffffffffff16611e4484610a8c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e6d5750611e6c81856118b9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9682611234565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390613ff8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390613e98565b60405180910390fd5b611f67838383612466565b611f72600082611cdf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc29190614381565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201991906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121a3848484611e76565b6121af8484848461257a565b6121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e590613e18565b60405180910390fd5b50505050565b6060600082141561223c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061239c565b600082905060005b6000821461226e5780806122579061449d565b915050600a8261226791906142f6565b9150612244565b60008167ffffffffffffffff8111156122b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122e25781602001600182028036833780820191505090505b5090505b60008514612395576001826122fb9190614381565b9150600a8561230a91906144e6565b603061231691906142a0565b60f81b818381518110612352577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561238e91906142f6565b94506122e6565b8093505050505b919050565b6123ab8383612711565b6123b8600084848461257a565b6123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90613e18565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124718383836128df565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124b4576124af816128e4565b6124f3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124f2576124f1838261292d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125365761253181612a9a565b612575565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612574576125738282612bdd565b5b5b505050565b600061259b8473ffffffffffffffffffffffffffffffffffffffff16612c5c565b15612704578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125c4611cd7565b8786866040518563ffffffff1660e01b81526004016125e69493929190613d4d565b602060405180830381600087803b15801561260057600080fd5b505af192505050801561263157506040513d601f19601f8201168201806040525081019061262e91906130e6565b60015b6126b4573d8060008114612661576040519150601f19603f3d011682016040523d82523d6000602084013e612666565b606091505b506000815114156126ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a390613e18565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612709565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613f98565b60405180910390fd5b61278a81611c6b565b156127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190613e78565b60405180910390fd5b6127d660008383612466565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282691906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161293a84611374565b6129449190614381565b9050600060076000848152602001908152602001600020549050818114612a29576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aae9190614381565b9050600060096000848152602001908152602001600020549050600060088381548110612b04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612be883611374565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612c7b9061446b565b90600052602060002090601f016020900481019282612c9d5760008555612ce4565b82601f10612cb657805160ff1916838001178555612ce4565b82800160010185558215612ce4579182015b82811115612ce3578251825591602001919060010190612cc8565b5b509050612cf19190612cf5565b5090565b5b80821115612d0e576000816000905550600101612cf6565b5090565b6000612d25612d20846141a4565b614173565b905082815260208101848484011115612d3d57600080fd5b612d48848285614429565b509392505050565b6000612d63612d5e846141d4565b614173565b905082815260208101848484011115612d7b57600080fd5b612d86848285614429565b509392505050565b600081359050612d9d816145e4565b92915050565b60008083601f840112612db557600080fd5b8235905067ffffffffffffffff811115612dce57600080fd5b602083019150836020820283011115612de657600080fd5b9250929050565b600081359050612dfc816145fb565b92915050565b600081359050612e1181614612565b92915050565b600081519050612e2681614612565b92915050565b600082601f830112612e3d57600080fd5b8135612e4d848260208601612d12565b91505092915050565b600082601f830112612e6757600080fd5b8135612e77848260208601612d50565b91505092915050565b600081359050612e8f81614629565b92915050565b600060208284031215612ea757600080fd5b6000612eb584828501612d8e565b91505092915050565b60008060408385031215612ed157600080fd5b6000612edf85828601612d8e565b9250506020612ef085828601612d8e565b9150509250929050565b600080600060608486031215612f0f57600080fd5b6000612f1d86828701612d8e565b9350506020612f2e86828701612d8e565b9250506040612f3f86828701612e80565b9150509250925092565b60008060008060808587031215612f5f57600080fd5b6000612f6d87828801612d8e565b9450506020612f7e87828801612d8e565b9350506040612f8f87828801612e80565b925050606085013567ffffffffffffffff811115612fac57600080fd5b612fb887828801612e2c565b91505092959194509250565b60008060408385031215612fd757600080fd5b6000612fe585828601612d8e565b9250506020612ff685828601612ded565b9150509250929050565b6000806040838503121561301357600080fd5b600061302185828601612d8e565b925050602061303285828601612e80565b9150509250929050565b60008060006040848603121561305157600080fd5b600084013567ffffffffffffffff81111561306b57600080fd5b61307786828701612da3565b9350935050602061308a86828701612e80565b9150509250925092565b6000602082840312156130a657600080fd5b60006130b484828501612ded565b91505092915050565b6000602082840312156130cf57600080fd5b60006130dd84828501612e02565b91505092915050565b6000602082840312156130f857600080fd5b600061310684828501612e17565b91505092915050565b60006020828403121561312157600080fd5b600082013567ffffffffffffffff81111561313b57600080fd5b61314784828501612e56565b91505092915050565b60006020828403121561316257600080fd5b600061317084828501612e80565b91505092915050565b60006131858383613cdb565b60208301905092915050565b61319a816143b5565b82525050565b60006131ab82614229565b6131b58185614257565b93506131c083614204565b8060005b838110156131f15781516131d88882613179565b97506131e38361424a565b9250506001810190506131c4565b5085935050505092915050565b613207816143c7565b82525050565b600061321882614234565b6132228185614268565b9350613232818560208601614438565b61323b816145d3565b840191505092915050565b60006132518261423f565b61325b8185614284565b935061326b818560208601614438565b613274816145d3565b840191505092915050565b600061328a8261423f565b6132948185614295565b93506132a4818560208601614438565b80840191505092915050565b600081546132bd8161446b565b6132c78186614295565b945060018216600081146132e257600181146132f357613326565b60ff19831686528186019350613326565b6132fc85614214565b60005b8381101561331e578154818901526001820191506020810190506132ff565b838801955050505b50505092915050565b600061333c602b83614284565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006133a2603283614284565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613408603f83614284565b91507f62756c6b4d696e743a20596f75206d6179206e6f7420627579206d6f7265207460008301527f68616e204d41585f42554c4b5f544f4b454e204e465473206174206f6e6365006020830152604082019050919050565b600061346e602683614284565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d4601c83614284565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613514602483614284565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061357a601983614284565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006135ba602c83614284565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613620603883614284565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613686602a83614284565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ec602983614284565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613752602983614284565b91507f62756c6b4d696e743a2045746865722076616c75652073656e74206973206e6f60008301527f7420636f727265637400000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b8602c83614284565b91507f61737369676e4e46543a2064657374696e6174696f6e73206c6973742063616e60008301527f6e6f7420626520656d70747900000000000000000000000000000000000000006020830152604082019050919050565b600061381e602083614284565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061385e602c83614284565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138c4602083614284565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613904602983614284565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061396a602f83614284565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006139d0604083614284565b91507f61737369676e4e46543a20596f75206d6179206e6f7420627579206d6f72652060008301527f7468616e204d41585f42554c4b5f544f4b454e204e465473206174206f6e63656020830152604082019050919050565b6000613a36601f83614284565b91507f62756c6b4d696e743a204d696e742070726f63657373206973207061757365006000830152602082019050919050565b6000613a76602183614284565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613adc601c83614284565b91507f62756c6b4d696e743a20616d6f756e742063616e6e6f742062652030000000006000830152602082019050919050565b6000613b1c602183614284565b91507f61737369676e4e46543a2073616c652068617320616c726561647920656e646560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b82600083614279565b9150600082019050919050565b6000613b9c603183614284565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613c02602c83614284565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613c68602083614284565b91507f62756c6b4d696e743a2073616c652068617320616c726561647920656e6465646000830152602082019050919050565b6000613ca8601d83614284565b91507f61737369676e4e46543a20616d6f756e742063616e6e6f7420626520300000006000830152602082019050919050565b613ce48161441f565b82525050565b613cf38161441f565b82525050565b6000613d0582856132b0565b9150613d11828461327f565b91508190509392505050565b6000613d2882613b75565b9150819050919050565b6000602082019050613d476000830184613191565b92915050565b6000608082019050613d626000830187613191565b613d6f6020830186613191565b613d7c6040830185613cea565b8181036060830152613d8e818461320d565b905095945050505050565b60006020820190508181036000830152613db381846131a0565b905092915050565b6000602082019050613dd060008301846131fe565b92915050565b60006020820190508181036000830152613df08184613246565b905092915050565b60006020820190508181036000830152613e118161332f565b9050919050565b60006020820190508181036000830152613e3181613395565b9050919050565b60006020820190508181036000830152613e51816133fb565b9050919050565b60006020820190508181036000830152613e7181613461565b9050919050565b60006020820190508181036000830152613e91816134c7565b9050919050565b60006020820190508181036000830152613eb181613507565b9050919050565b60006020820190508181036000830152613ed18161356d565b9050919050565b60006020820190508181036000830152613ef1816135ad565b9050919050565b60006020820190508181036000830152613f1181613613565b9050919050565b60006020820190508181036000830152613f3181613679565b9050919050565b60006020820190508181036000830152613f51816136df565b9050919050565b60006020820190508181036000830152613f7181613745565b9050919050565b60006020820190508181036000830152613f91816137ab565b9050919050565b60006020820190508181036000830152613fb181613811565b9050919050565b60006020820190508181036000830152613fd181613851565b9050919050565b60006020820190508181036000830152613ff1816138b7565b9050919050565b60006020820190508181036000830152614011816138f7565b9050919050565b600060208201905081810360008301526140318161395d565b9050919050565b60006020820190508181036000830152614051816139c3565b9050919050565b6000602082019050818103600083015261407181613a29565b9050919050565b6000602082019050818103600083015261409181613a69565b9050919050565b600060208201905081810360008301526140b181613acf565b9050919050565b600060208201905081810360008301526140d181613b0f565b9050919050565b600060208201905081810360008301526140f181613b8f565b9050919050565b6000602082019050818103600083015261411181613bf5565b9050919050565b6000602082019050818103600083015261413181613c5b565b9050919050565b6000602082019050818103600083015261415181613c9b565b9050919050565b600060208201905061416d6000830184613cea565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561419a576141996145a4565b5b8060405250919050565b600067ffffffffffffffff8211156141bf576141be6145a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156141ef576141ee6145a4565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ab8261441f565b91506142b68361441f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142eb576142ea614517565b5b828201905092915050565b60006143018261441f565b915061430c8361441f565b92508261431c5761431b614546565b5b828204905092915050565b60006143328261441f565b915061433d8361441f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561437657614375614517565b5b828202905092915050565b600061438c8261441f565b91506143978361441f565b9250828210156143aa576143a9614517565b5b828203905092915050565b60006143c0826143ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561445657808201518184015260208101905061443b565b83811115614465576000848401525b50505050565b6000600282049050600182168061448357607f821691505b6020821081141561449757614496614575565b5b50919050565b60006144a88261441f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144db576144da614517565b5b600182019050919050565b60006144f18261441f565b91506144fc8361441f565b92508261450c5761450b614546565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6145ed816143b5565b81146145f857600080fd5b50565b614604816143c7565b811461460f57600080fd5b50565b61461b816143d3565b811461462657600080fd5b50565b6146328161441f565b811461463d57600080fd5b5056fea2646970667358221220da2a8e1a6205a88bd6eb2e6527cc9c7b9364b1c5beef8c6146365f38f2e8b46364736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101cc5760003560e01c80636c0360eb116100f75780639cd3948111610095578063dc9b125d11610064578063dc9b125d1461068c578063e985e9c5146106b7578063f2fde38b146106f4578063fdc4da341461071d576101cc565b80639cd39481146105d2578063a22cb465146105fd578063b88d4fde14610626578063c87b56dd1461064f576101cc565b80638da5cb5b116100d15780638da5cb5b14610528578063902d55a5146105535780639146b8251461057e57806395d89b41146105a7576101cc565b80636c0360eb146104a957806370a08231146104d4578063715018a614610511576101cc565b80632f745c591161016f57806355f804b31161013e57806355f804b3146103ef5780635bde758f146104185780635c041b33146104435780636352211e1461046c576101cc565b80632f745c591461030f57806342842e0e1461034c5780634f6ccce7146103755780635376f1a3146103b2576101cc565b8063081812fc116101ab578063081812fc14610255578063095ea7b31461029257806318160ddd146102bb57806323b872dd146102e6576101cc565b8062bc653c146101d157806301ffc9a7146101ed57806306fdde031461022a575b600080fd5b6101eb60048036038101906101e69190613150565b61075a565b005b3480156101f957600080fd5b50610214600480360381019061020f91906130bd565b610980565b6040516102219190613dbb565b60405180910390f35b34801561023657600080fd5b5061023f6109fa565b60405161024c9190613dd6565b60405180910390f35b34801561026157600080fd5b5061027c60048036038101906102779190613150565b610a8c565b6040516102899190613d32565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613000565b610b11565b005b3480156102c757600080fd5b506102d0610c29565b6040516102dd9190614158565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612efa565b610c36565b005b34801561031b57600080fd5b5061033660048036038101906103319190613000565b610c96565b6040516103439190614158565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612efa565b610d3b565b005b34801561038157600080fd5b5061039c60048036038101906103979190613150565b610d5b565b6040516103a99190614158565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190612e95565b610df2565b6040516103e69190613dbb565b60405180910390f35b3480156103fb57600080fd5b506104166004803603810190610411919061310f565b610eeb565b005b34801561042457600080fd5b5061042d610f81565b60405161043a9190614158565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061303c565b610f86565b005b34801561047857600080fd5b50610493600480360381019061048e9190613150565b611234565b6040516104a09190613d32565b60405180910390f35b3480156104b557600080fd5b506104be6112e6565b6040516104cb9190613dd6565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e95565b611374565b6040516105089190614158565b60405180910390f35b34801561051d57600080fd5b5061052661142c565b005b34801561053457600080fd5b5061053d6114b4565b60405161054a9190613d32565b60405180910390f35b34801561055f57600080fd5b506105686114de565b6040516105759190614158565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613094565b6114e4565b005b3480156105b357600080fd5b506105bc61157d565b6040516105c99190613dd6565b60405180910390f35b3480156105de57600080fd5b506105e761160f565b6040516105f49190614158565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612fc4565b61161b565b005b34801561063257600080fd5b5061064d60048036038101906106489190612f49565b61179c565b005b34801561065b57600080fd5b5061067660048036038101906106719190613150565b6117fe565b6040516106839190613dd6565b60405180910390f35b34801561069857600080fd5b506106a16118a6565b6040516106ae9190613dbb565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d99190612ebe565b6118b9565b6040516106eb9190613dbb565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190612e95565b61194d565b005b34801561072957600080fd5b50610744600480360381019061073f9190612e95565b611a45565b6040516107519190613d99565b60405180910390f35b600c60009054906101000a900460ff166107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090614058565b60405180910390fd5b600081116107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e390614098565b60405180910390fd5b612b676107f7610c29565b10610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90614118565b60405180910390fd5b612b6761085482610846610c29565b611b3f90919063ffffffff16565b1115610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c90614118565b60405180910390fd5b60148111156108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090613e38565b60405180910390fd5b6108f467013fbe85edc9000082611b5590919063ffffffff16565b3414610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613f58565b60405180910390fd5b60005b8181101561097c57600061094a610c29565b9050612b67610957610c29565b1015610968576109673382611b6b565b5b5080806109749061449d565b915050610938565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f357506109f282611b89565b5b9050919050565b606060008054610a099061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a359061446b565b8015610a825780601f10610a5757610100808354040283529160200191610a82565b820191906000526020600020905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b6000610a9782611c6b565b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613fb8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1c82611234565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8490614078565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bac611cd7565b73ffffffffffffffffffffffffffffffffffffffff161480610bdb5750610bda81610bd5611cd7565b6118b9565b5b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613ef8565b60405180910390fd5b610c248383611cdf565b505050565b6000600880549050905090565b610c47610c41611cd7565b82611d98565b610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d906140d8565b60405180910390fd5b610c91838383611e76565b505050565b6000610ca183611374565b8210610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613df8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d568383836040518060200160405280600081525061179c565b505050565b6000610d65610c29565b8210610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906140f8565b60405180910390fd5b60088281548110610de0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610dfc611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610e1a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6790613fd8565b60405180910390fd5b600047905060008373ffffffffffffffffffffffffffffffffffffffff1682604051610e9b90613d1d565b60006040518083038185875af1925050503d8060008114610ed8576040519150601f19603f3d011682016040523d82523d6000602084013e610edd565b606091505b505090508092505050919050565b610ef3611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610f116114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90613fd8565b60405180910390fd5b80600b9080519060200190610f7d929190612c6f565b5050565b601481565b610f8e611cd7565b73ffffffffffffffffffffffffffffffffffffffff16610fac6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613fd8565b60405180910390fd5b60008111611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614138565b60405180910390fd5b612b67611050610c29565b10611090576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611087906140b8565b60405180910390fd5b612b676110ad8261109f610c29565b611b3f90919063ffffffff16565b11156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e5906140b8565b60405180910390fd5b6014811115611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614038565b60405180910390fd5b60008383905011611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90613f78565b60405180910390fd5b60005b8383905081101561122e5760005b8281101561121a57600061119b610c29565b9050612b676111a8610c29565b1015611206576112058686858181106111ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906111ff9190612e95565b82611b6b565b5b5080806112129061449d565b915050611189565b5080806112269061449d565b91505061117b565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d490613f38565b60405180910390fd5b80915050919050565b600b80546112f39061446b565b80601f016020809104026020016040519081016040528092919081815260200182805461131f9061446b565b801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613f18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611434611cd7565b73ffffffffffffffffffffffffffffffffffffffff166114526114b4565b73ffffffffffffffffffffffffffffffffffffffff16146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90613fd8565b60405180910390fd5b6114b260006120d2565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612b6781565b6114ec611cd7565b73ffffffffffffffffffffffffffffffffffffffff1661150a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790613fd8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606001805461158c9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546115b89061446b565b80156116055780601f106115da57610100808354040283529160200191611605565b820191906000526020600020905b8154815290600101906020018083116115e857829003601f168201915b5050505050905090565b67013fbe85edc9000081565b611623611cd7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613eb8565b60405180910390fd5b806005600061169e611cd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174b611cd7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117909190613dbb565b60405180910390a35050565b6117ad6117a7611cd7565b83611d98565b6117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e3906140d8565b60405180910390fd5b6117f884848484612198565b50505050565b606061180982611c6b565b611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90614018565b60405180910390fd5b6000600b80546118579061446b565b905011611873576040518060200160405280600081525061189f565b600b61187e836121f4565b60405160200161188f929190613cf9565b6040516020818303038152906040525b9050919050565b600c60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611955611cd7565b73ffffffffffffffffffffffffffffffffffffffff166119736114b4565b73ffffffffffffffffffffffffffffffffffffffff16146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c090613fd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090613e58565b60405180910390fd5b611a42816120d2565b50565b60606000611a5283611374565b905060008167ffffffffffffffff811115611a96577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ac45781602001602082028036833780820191505090505b50905060005b82811015611b3457611adc8582610c96565b828281518110611b15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611b2c9061449d565b915050611aca565b508092505050919050565b60008183611b4d91906142a0565b905092915050565b60008183611b639190614327565b905092915050565b611b858282604051806020016040528060008152506123a1565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c645750611c63826123fc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5283611234565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611da382611c6b565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990613ed8565b60405180910390fd5b6000611ded83611234565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5c57508373ffffffffffffffffffffffffffffffffffffffff16611e4484610a8c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e6d5750611e6c81856118b9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9682611234565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390613ff8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390613e98565b60405180910390fd5b611f67838383612466565b611f72600082611cdf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc29190614381565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201991906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121a3848484611e76565b6121af8484848461257a565b6121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e590613e18565b60405180910390fd5b50505050565b6060600082141561223c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061239c565b600082905060005b6000821461226e5780806122579061449d565b915050600a8261226791906142f6565b9150612244565b60008167ffffffffffffffff8111156122b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122e25781602001600182028036833780820191505090505b5090505b60008514612395576001826122fb9190614381565b9150600a8561230a91906144e6565b603061231691906142a0565b60f81b818381518110612352577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561238e91906142f6565b94506122e6565b8093505050505b919050565b6123ab8383612711565b6123b8600084848461257a565b6123f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ee90613e18565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124718383836128df565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124b4576124af816128e4565b6124f3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124f2576124f1838261292d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125365761253181612a9a565b612575565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612574576125738282612bdd565b5b5b505050565b600061259b8473ffffffffffffffffffffffffffffffffffffffff16612c5c565b15612704578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125c4611cd7565b8786866040518563ffffffff1660e01b81526004016125e69493929190613d4d565b602060405180830381600087803b15801561260057600080fd5b505af192505050801561263157506040513d601f19601f8201168201806040525081019061262e91906130e6565b60015b6126b4573d8060008114612661576040519150601f19603f3d011682016040523d82523d6000602084013e612666565b606091505b506000815114156126ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a390613e18565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612709565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613f98565b60405180910390fd5b61278a81611c6b565b156127ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c190613e78565b60405180910390fd5b6127d660008383612466565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282691906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161293a84611374565b6129449190614381565b9050600060076000848152602001908152602001600020549050818114612a29576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aae9190614381565b9050600060096000848152602001908152602001600020549050600060088381548110612b04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612be883611374565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612c7b9061446b565b90600052602060002090601f016020900481019282612c9d5760008555612ce4565b82601f10612cb657805160ff1916838001178555612ce4565b82800160010185558215612ce4579182015b82811115612ce3578251825591602001919060010190612cc8565b5b509050612cf19190612cf5565b5090565b5b80821115612d0e576000816000905550600101612cf6565b5090565b6000612d25612d20846141a4565b614173565b905082815260208101848484011115612d3d57600080fd5b612d48848285614429565b509392505050565b6000612d63612d5e846141d4565b614173565b905082815260208101848484011115612d7b57600080fd5b612d86848285614429565b509392505050565b600081359050612d9d816145e4565b92915050565b60008083601f840112612db557600080fd5b8235905067ffffffffffffffff811115612dce57600080fd5b602083019150836020820283011115612de657600080fd5b9250929050565b600081359050612dfc816145fb565b92915050565b600081359050612e1181614612565b92915050565b600081519050612e2681614612565b92915050565b600082601f830112612e3d57600080fd5b8135612e4d848260208601612d12565b91505092915050565b600082601f830112612e6757600080fd5b8135612e77848260208601612d50565b91505092915050565b600081359050612e8f81614629565b92915050565b600060208284031215612ea757600080fd5b6000612eb584828501612d8e565b91505092915050565b60008060408385031215612ed157600080fd5b6000612edf85828601612d8e565b9250506020612ef085828601612d8e565b9150509250929050565b600080600060608486031215612f0f57600080fd5b6000612f1d86828701612d8e565b9350506020612f2e86828701612d8e565b9250506040612f3f86828701612e80565b9150509250925092565b60008060008060808587031215612f5f57600080fd5b6000612f6d87828801612d8e565b9450506020612f7e87828801612d8e565b9350506040612f8f87828801612e80565b925050606085013567ffffffffffffffff811115612fac57600080fd5b612fb887828801612e2c565b91505092959194509250565b60008060408385031215612fd757600080fd5b6000612fe585828601612d8e565b9250506020612ff685828601612ded565b9150509250929050565b6000806040838503121561301357600080fd5b600061302185828601612d8e565b925050602061303285828601612e80565b9150509250929050565b60008060006040848603121561305157600080fd5b600084013567ffffffffffffffff81111561306b57600080fd5b61307786828701612da3565b9350935050602061308a86828701612e80565b9150509250925092565b6000602082840312156130a657600080fd5b60006130b484828501612ded565b91505092915050565b6000602082840312156130cf57600080fd5b60006130dd84828501612e02565b91505092915050565b6000602082840312156130f857600080fd5b600061310684828501612e17565b91505092915050565b60006020828403121561312157600080fd5b600082013567ffffffffffffffff81111561313b57600080fd5b61314784828501612e56565b91505092915050565b60006020828403121561316257600080fd5b600061317084828501612e80565b91505092915050565b60006131858383613cdb565b60208301905092915050565b61319a816143b5565b82525050565b60006131ab82614229565b6131b58185614257565b93506131c083614204565b8060005b838110156131f15781516131d88882613179565b97506131e38361424a565b9250506001810190506131c4565b5085935050505092915050565b613207816143c7565b82525050565b600061321882614234565b6132228185614268565b9350613232818560208601614438565b61323b816145d3565b840191505092915050565b60006132518261423f565b61325b8185614284565b935061326b818560208601614438565b613274816145d3565b840191505092915050565b600061328a8261423f565b6132948185614295565b93506132a4818560208601614438565b80840191505092915050565b600081546132bd8161446b565b6132c78186614295565b945060018216600081146132e257600181146132f357613326565b60ff19831686528186019350613326565b6132fc85614214565b60005b8381101561331e578154818901526001820191506020810190506132ff565b838801955050505b50505092915050565b600061333c602b83614284565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006133a2603283614284565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613408603f83614284565b91507f62756c6b4d696e743a20596f75206d6179206e6f7420627579206d6f7265207460008301527f68616e204d41585f42554c4b5f544f4b454e204e465473206174206f6e6365006020830152604082019050919050565b600061346e602683614284565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134d4601c83614284565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613514602483614284565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061357a601983614284565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006135ba602c83614284565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613620603883614284565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613686602a83614284565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ec602983614284565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613752602983614284565b91507f62756c6b4d696e743a2045746865722076616c75652073656e74206973206e6f60008301527f7420636f727265637400000000000000000000000000000000000000000000006020830152604082019050919050565b60006137b8602c83614284565b91507f61737369676e4e46543a2064657374696e6174696f6e73206c6973742063616e60008301527f6e6f7420626520656d70747900000000000000000000000000000000000000006020830152604082019050919050565b600061381e602083614284565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061385e602c83614284565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138c4602083614284565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613904602983614284565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061396a602f83614284565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006139d0604083614284565b91507f61737369676e4e46543a20596f75206d6179206e6f7420627579206d6f72652060008301527f7468616e204d41585f42554c4b5f544f4b454e204e465473206174206f6e63656020830152604082019050919050565b6000613a36601f83614284565b91507f62756c6b4d696e743a204d696e742070726f63657373206973207061757365006000830152602082019050919050565b6000613a76602183614284565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613adc601c83614284565b91507f62756c6b4d696e743a20616d6f756e742063616e6e6f742062652030000000006000830152602082019050919050565b6000613b1c602183614284565b91507f61737369676e4e46543a2073616c652068617320616c726561647920656e646560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b82600083614279565b9150600082019050919050565b6000613b9c603183614284565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613c02602c83614284565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613c68602083614284565b91507f62756c6b4d696e743a2073616c652068617320616c726561647920656e6465646000830152602082019050919050565b6000613ca8601d83614284565b91507f61737369676e4e46543a20616d6f756e742063616e6e6f7420626520300000006000830152602082019050919050565b613ce48161441f565b82525050565b613cf38161441f565b82525050565b6000613d0582856132b0565b9150613d11828461327f565b91508190509392505050565b6000613d2882613b75565b9150819050919050565b6000602082019050613d476000830184613191565b92915050565b6000608082019050613d626000830187613191565b613d6f6020830186613191565b613d7c6040830185613cea565b8181036060830152613d8e818461320d565b905095945050505050565b60006020820190508181036000830152613db381846131a0565b905092915050565b6000602082019050613dd060008301846131fe565b92915050565b60006020820190508181036000830152613df08184613246565b905092915050565b60006020820190508181036000830152613e118161332f565b9050919050565b60006020820190508181036000830152613e3181613395565b9050919050565b60006020820190508181036000830152613e51816133fb565b9050919050565b60006020820190508181036000830152613e7181613461565b9050919050565b60006020820190508181036000830152613e91816134c7565b9050919050565b60006020820190508181036000830152613eb181613507565b9050919050565b60006020820190508181036000830152613ed18161356d565b9050919050565b60006020820190508181036000830152613ef1816135ad565b9050919050565b60006020820190508181036000830152613f1181613613565b9050919050565b60006020820190508181036000830152613f3181613679565b9050919050565b60006020820190508181036000830152613f51816136df565b9050919050565b60006020820190508181036000830152613f7181613745565b9050919050565b60006020820190508181036000830152613f91816137ab565b9050919050565b60006020820190508181036000830152613fb181613811565b9050919050565b60006020820190508181036000830152613fd181613851565b9050919050565b60006020820190508181036000830152613ff1816138b7565b9050919050565b60006020820190508181036000830152614011816138f7565b9050919050565b600060208201905081810360008301526140318161395d565b9050919050565b60006020820190508181036000830152614051816139c3565b9050919050565b6000602082019050818103600083015261407181613a29565b9050919050565b6000602082019050818103600083015261409181613a69565b9050919050565b600060208201905081810360008301526140b181613acf565b9050919050565b600060208201905081810360008301526140d181613b0f565b9050919050565b600060208201905081810360008301526140f181613b8f565b9050919050565b6000602082019050818103600083015261411181613bf5565b9050919050565b6000602082019050818103600083015261413181613c5b565b9050919050565b6000602082019050818103600083015261415181613c9b565b9050919050565b600060208201905061416d6000830184613cea565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561419a576141996145a4565b5b8060405250919050565b600067ffffffffffffffff8211156141bf576141be6145a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156141ef576141ee6145a4565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ab8261441f565b91506142b68361441f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142eb576142ea614517565b5b828201905092915050565b60006143018261441f565b915061430c8361441f565b92508261431c5761431b614546565b5b828204905092915050565b60006143328261441f565b915061433d8361441f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561437657614375614517565b5b828202905092915050565b600061438c8261441f565b91506143978361441f565b9250828210156143aa576143a9614517565b5b828203905092915050565b60006143c0826143ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561445657808201518184015260208101905061443b565b83811115614465576000848401525b50505050565b6000600282049050600182168061448357607f821691505b6020821081141561449757614496614575565b5b50919050565b60006144a88261441f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144db576144da614517565b5b600182019050919050565b60006144f18261441f565b91506144fc8361441f565b92508261450c5761450b614546565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6145ed816143b5565b81146145f857600080fd5b50565b614604816143c7565b811461460f57600080fd5b50565b61461b816143d3565b811461462657600080fd5b50565b6146328161441f565b811461463d57600080fd5b5056fea2646970667358221220da2a8e1a6205a88bd6eb2e6527cc9c7b9364b1c5beef8c6146365f38f2e8b46364736f6c63430008000033

Deployed Bytecode Sourcemap

52026:3353:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52698:804;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43438:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28593:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30152:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29675:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44078:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31042:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43746:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31452:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44268:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55158:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52587:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52302:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53514:852;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28287:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52151:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28017:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51209:103;;;;;;;;;;;;;:::i;:::-;;50558:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52181:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52469:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28762:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52238:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30445:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31708:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54748:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52358:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30811:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51467:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54378:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52698:804;52767:13;;;;;;;;;;;52759:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52855:1;52845:7;:11;52837:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:5;52908:13;:11;:13::i;:::-;:28;52900:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:5;52992:26;53010:7;52992:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:42;;52984:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52343:2;53090:7;:25;;53082:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;53215:27;52279:10;53215:7;:11;;:27;;;;:::i;:::-;53202:9;:40;53194:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;53304:9;53299:196;53323:7;53319:1;:11;53299:196;;;53352:8;53363:13;:11;:13::i;:::-;53352:24;;52220:5;53394:13;:11;:13::i;:::-;:28;53391:93;;;53442:26;53452:10;53464:3;53442:9;:26::i;:::-;53391:93;53299:196;53332:3;;;;;:::i;:::-;;;;53299:196;;;;52698:804;:::o;43438:224::-;43540:4;43579:35;43564:50;;;:11;:50;;;;:90;;;;43618:36;43642:11;43618:23;:36::i;:::-;43564:90;43557:97;;43438:224;;;:::o;28593:100::-;28647:13;28680:5;28673:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28593:100;:::o;30152:221::-;30228:7;30256:16;30264:7;30256;:16::i;:::-;30248:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30341:15;:24;30357:7;30341:24;;;;;;;;;;;;;;;;;;;;;30334:31;;30152:221;;;:::o;29675:411::-;29756:13;29772:23;29787:7;29772:14;:23::i;:::-;29756:39;;29820:5;29814:11;;:2;:11;;;;29806:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29914:5;29898:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29923:37;29940:5;29947:12;:10;:12::i;:::-;29923:16;:37::i;:::-;29898:62;29876:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30057:21;30066:2;30070:7;30057:8;:21::i;:::-;29675:411;;;:::o;44078:113::-;44139:7;44166:10;:17;;;;44159:24;;44078:113;:::o;31042:339::-;31237:41;31256:12;:10;:12::i;:::-;31270:7;31237:18;:41::i;:::-;31229:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31345:28;31355:4;31361:2;31365:7;31345:9;:28::i;:::-;31042:339;;;:::o;43746:256::-;43843:7;43879:23;43896:5;43879:16;:23::i;:::-;43871:5;:31;43863:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43968:12;:19;43981:5;43968:19;;;;;;;;;;;;;;;:26;43988:5;43968:26;;;;;;;;;;;;43961:33;;43746:256;;;;:::o;31452:185::-;31590:39;31607:4;31613:2;31617:7;31590:39;;;;;;;;;;;;:16;:39::i;:::-;31452:185;;;:::o;44268:233::-;44343:7;44379:30;:28;:30::i;:::-;44371:5;:38;44363:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44476:10;44487:5;44476:17;;;;;;;;;;;;;;;;;;;;;;;;44469:24;;44268:233;;;:::o;55158:218::-;55226:4;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55242:12:::1;55257:21;55242:36;;55290:12;55308:11;:16;;55331:7;55308:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55289:54;;;55361:7;55354:14;;;;55158:218:::0;;;:::o;52587:103::-;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52671:11:::1;52661:7;:21;;;;;;;;;;;;:::i;:::-;;52587:103:::0;:::o;52302:43::-;52343:2;52302:43;:::o;53514:852::-;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53630:1:::1;53620:7;:11;53612:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:5;53684:13;:11;:13::i;:::-;:28;53676:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:5;53769:26;53787:7;53769:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:42;;53761:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;52343:2;53868:7;:25;;53860:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54003:1;53981:12;;:19;;:23;53973:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;54068:9;54064:295;54087:12;;:19;;54083:1;:23;54064:295;;;54132:9;54127:221;54151:7;54147:1;:11;54127:221;;;54184:8;54195:13;:11;:13::i;:::-;54184:24;;52220:5;54230:13;:11;:13::i;:::-;:28;54227:106;;;54282:31;54292:12;;54305:1;54292:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54309:3;54282:9;:31::i;:::-;54227:106;54127:221;54160:3;;;;;:::i;:::-;;;;54127:221;;;;54108:3;;;;;:::i;:::-;;;;54064:295;;;;53514:852:::0;;;:::o;28287:239::-;28359:7;28379:13;28395:7;:16;28403:7;28395:16;;;;;;;;;;;;;;;;;;;;;28379:32;;28447:1;28430:19;;:5;:19;;;;28422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28513:5;28506:12;;;28287:239;;;:::o;52151:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28017:208::-;28089:7;28134:1;28117:19;;:5;:19;;;;28109:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28201:9;:16;28211:5;28201:16;;;;;;;;;;;;;;;;28194:23;;28017:208;;;:::o;51209:103::-;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51274:30:::1;51301:1;51274:18;:30::i;:::-;51209:103::o:0;50558:87::-;50604:7;50631:6;;;;;;;;;;;50624:13;;50558:87;:::o;52181:44::-;52220:5;52181:44;:::o;52469:110::-;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52565:6:::1;52549:13;;:22;;;;;;;;;;;;;;;;;;52469:110:::0;:::o;28762:104::-;28818:13;28851:7;28844:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28762:104;:::o;52238:51::-;52279:10;52238:51;:::o;30445:295::-;30560:12;:10;:12::i;:::-;30548:24;;:8;:24;;;;30540:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30660:8;30615:18;:32;30634:12;:10;:12::i;:::-;30615:32;;;;;;;;;;;;;;;:42;30648:8;30615:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30713:8;30684:48;;30699:12;:10;:12::i;:::-;30684:48;;;30723:8;30684:48;;;;;;:::i;:::-;;;;;;;;30445:295;;:::o;31708:328::-;31883:41;31902:12;:10;:12::i;:::-;31916:7;31883:18;:41::i;:::-;31875:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31989:39;32003:4;32009:2;32013:7;32022:5;31989:13;:39::i;:::-;31708:328;;;;:::o;54748:402::-;54866:13;54917:16;54925:7;54917;:16::i;:::-;54897:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;55054:1;55036:7;55030:21;;;;;:::i;:::-;;;:25;:112;;;;;;;;;;;;;;;;;55095:7;55104:18;:7;:16;:18::i;:::-;55078:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55030:112;55023:119;;54748:402;;;:::o;52358:25::-;;;;;;;;;;;;;:::o;30811:164::-;30908:4;30932:18;:25;30951:5;30932:25;;;;;;;;;;;;;;;:35;30958:8;30932:35;;;;;;;;;;;;;;;;;;;;;;;;;30925:42;;30811:164;;;;:::o;51467:201::-;50789:12;:10;:12::i;:::-;50778:23;;:7;:5;:7::i;:::-;:23;;;50770:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51576:1:::1;51556:22;;:8;:22;;;;51548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51632:28;51651:8;51632:18;:28::i;:::-;51467:201:::0;:::o;54378:362::-;54441:16;54469:23;54495:17;54505:6;54495:9;:17::i;:::-;54469:43;;54523:25;54565:15;54551:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54523:58;;54597:9;54592:115;54616:15;54612:1;:19;54592:115;;;54665:30;54685:6;54693:1;54665:19;:30::i;:::-;54651:8;54660:1;54651:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;54633:3;;;;;:::i;:::-;;;;54592:115;;;;54724:8;54717:15;;;;54378:362;;;:::o;2413:98::-;2471:7;2502:1;2498;:5;;;;:::i;:::-;2491:12;;2413:98;;;;:::o;3151:::-;3209:7;3240:1;3236;:5;;;;:::i;:::-;3229:12;;3151:98;;;;:::o;34530:110::-;34606:26;34616:2;34620:7;34606:26;;;;;;;;;;;;:9;:26::i;:::-;34530:110;;:::o;27648:305::-;27750:4;27802:25;27787:40;;;:11;:40;;;;:105;;;;27859:33;27844:48;;;:11;:48;;;;27787:105;:158;;;;27909:36;27933:11;27909:23;:36::i;:::-;27787:158;27767:178;;27648:305;;;:::o;33546:127::-;33611:4;33663:1;33635:30;;:7;:16;33643:7;33635:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33628:37;;33546:127;;;:::o;11278:98::-;11331:7;11358:10;11351:17;;11278:98;:::o;37528:174::-;37630:2;37603:15;:24;37619:7;37603:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37686:7;37682:2;37648:46;;37657:23;37672:7;37657:14;:23::i;:::-;37648:46;;;;;;;;;;;;37528:174;;:::o;33840:348::-;33933:4;33958:16;33966:7;33958;:16::i;:::-;33950:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34034:13;34050:23;34065:7;34050:14;:23::i;:::-;34034:39;;34103:5;34092:16;;:7;:16;;;:51;;;;34136:7;34112:31;;:20;34124:7;34112:11;:20::i;:::-;:31;;;34092:51;:87;;;;34147:32;34164:5;34171:7;34147:16;:32::i;:::-;34092:87;34084:96;;;33840:348;;;;:::o;36832:578::-;36991:4;36964:31;;:23;36979:7;36964:14;:23::i;:::-;:31;;;36956:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37074:1;37060:16;;:2;:16;;;;37052:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37130:39;37151:4;37157:2;37161:7;37130:20;:39::i;:::-;37234:29;37251:1;37255:7;37234:8;:29::i;:::-;37295:1;37276:9;:15;37286:4;37276:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37324:1;37307:9;:13;37317:2;37307:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37355:2;37336:7;:16;37344:7;37336:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37394:7;37390:2;37375:27;;37384:4;37375:27;;;;;;;;;;;;36832:578;;;:::o;51828:191::-;51902:16;51921:6;;;;;;;;;;;51902:25;;51947:8;51938:6;;:17;;;;;;;;;;;;;;;;;;52002:8;51971:40;;51992:8;51971:40;;;;;;;;;;;;51828:191;;:::o;32918:315::-;33075:28;33085:4;33091:2;33095:7;33075:9;:28::i;:::-;33122:48;33145:4;33151:2;33155:7;33164:5;33122:22;:48::i;:::-;33114:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32918:315;;;;:::o;8845:723::-;8901:13;9131:1;9122:5;:10;9118:53;;;9149:10;;;;;;;;;;;;;;;;;;;;;9118:53;9181:12;9196:5;9181:20;;9212:14;9237:78;9252:1;9244:4;:9;9237:78;;9270:8;;;;;:::i;:::-;;;;9301:2;9293:10;;;;;:::i;:::-;;;9237:78;;;9325:19;9357:6;9347:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9325:39;;9375:154;9391:1;9382:5;:10;9375:154;;9419:1;9409:11;;;;;:::i;:::-;;;9486:2;9478:5;:10;;;;:::i;:::-;9465:2;:24;;;;:::i;:::-;9452:39;;9435:6;9442;9435:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9515:2;9506:11;;;;;:::i;:::-;;;9375:154;;;9553:6;9539:21;;;;;8845:723;;;;:::o;34867:321::-;34997:18;35003:2;35007:7;34997:5;:18::i;:::-;35048:54;35079:1;35083:2;35087:7;35096:5;35048:22;:54::i;:::-;35026:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34867:321;;;:::o;8321:157::-;8406:4;8445:25;8430:40;;;:11;:40;;;;8423:47;;8321:157;;;:::o;45114:589::-;45258:45;45285:4;45291:2;45295:7;45258:26;:45::i;:::-;45336:1;45320:18;;:4;:18;;;45316:187;;;45355:40;45387:7;45355:31;:40::i;:::-;45316:187;;;45425:2;45417:10;;:4;:10;;;45413:90;;45444:47;45477:4;45483:7;45444:32;:47::i;:::-;45413:90;45316:187;45531:1;45517:16;;:2;:16;;;45513:183;;;45550:45;45587:7;45550:36;:45::i;:::-;45513:183;;;45623:4;45617:10;;:2;:10;;;45613:83;;45644:40;45672:2;45676:7;45644:27;:40::i;:::-;45613:83;45513:183;45114:589;;;:::o;38267:799::-;38422:4;38443:15;:2;:13;;;:15::i;:::-;38439:620;;;38495:2;38479:36;;;38516:12;:10;:12::i;:::-;38530:4;38536:7;38545:5;38479:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38475:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38738:1;38721:6;:13;:18;38717:272;;;38764:60;;;;;;;;;;:::i;:::-;;;;;;;;38717:272;38939:6;38933:13;38924:6;38920:2;38916:15;38909:38;38475:529;38612:41;;;38602:51;;;:6;:51;;;;38595:58;;;;;38439:620;39043:4;39036:11;;38267:799;;;;;;;:::o;35524:382::-;35618:1;35604:16;;:2;:16;;;;35596:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:16;35685:7;35677;:16::i;:::-;35676:17;35668:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35739:45;35768:1;35772:2;35776:7;35739:20;:45::i;:::-;35814:1;35797:9;:13;35807:2;35797:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35845:2;35826:7;:16;35834:7;35826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35890:7;35886:2;35865:33;;35882:1;35865:33;;;;;;;;;;;;35524:382;;:::o;39638:126::-;;;;:::o;46426:164::-;46530:10;:17;;;;46503:15;:24;46519:7;46503:24;;;;;;;;;;;:44;;;;46558:10;46574:7;46558:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46426:164;:::o;47217:988::-;47483:22;47533:1;47508:22;47525:4;47508:16;:22::i;:::-;:26;;;;:::i;:::-;47483:51;;47545:18;47566:17;:26;47584:7;47566:26;;;;;;;;;;;;47545:47;;47713:14;47699:10;:28;47695:328;;47744:19;47766:12;:18;47779:4;47766:18;;;;;;;;;;;;;;;:34;47785:14;47766:34;;;;;;;;;;;;47744:56;;47850:11;47817:12;:18;47830:4;47817:18;;;;;;;;;;;;;;;:30;47836:10;47817:30;;;;;;;;;;;:44;;;;47967:10;47934:17;:30;47952:11;47934:30;;;;;;;;;;;:43;;;;47695:328;;48119:17;:26;48137:7;48119:26;;;;;;;;;;;48112:33;;;48163:12;:18;48176:4;48163:18;;;;;;;;;;;;;;;:34;48182:14;48163:34;;;;;;;;;;;48156:41;;;47217:988;;;;:::o;48500:1079::-;48753:22;48798:1;48778:10;:17;;;;:21;;;;:::i;:::-;48753:46;;48810:18;48831:15;:24;48847:7;48831:24;;;;;;;;;;;;48810:45;;49182:19;49204:10;49215:14;49204:26;;;;;;;;;;;;;;;;;;;;;;;;49182:48;;49268:11;49243:10;49254;49243:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49379:10;49348:15;:28;49364:11;49348:28;;;;;;;;;;;:41;;;;49520:15;:24;49536:7;49520:24;;;;;;;;;;;49513:31;;;49555:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48500:1079;;;;:::o;46004:221::-;46089:14;46106:20;46123:2;46106:16;:20::i;:::-;46089:37;;46164:7;46137:12;:16;46150:2;46137:16;;;;;;;;;;;;;;;:24;46154:6;46137:24;;;;;;;;;;;:34;;;;46211:6;46182:17;:26;46200:7;46182:26;;;;;;;;;;;:35;;;;46004:221;;;:::o;12307:387::-;12367:4;12575:12;12642:7;12630:20;12622:28;;12685:1;12678:4;:8;12671:15;;;12307:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:262::-;;2505:2;2493:9;2484:7;2480:23;2476:32;2473:2;;;2521:1;2518;2511:12;2473:2;2564:1;2589:53;2634:7;2625:6;2614:9;2610:22;2589:53;:::i;:::-;2579:63;;2535:117;2463:196;;;;:::o;2665:407::-;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2806:1;2803;2796:12;2758:2;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2976:2;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2947:118;2748:324;;;;;:::o;3078:552::-;;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3534:2;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3505:118;3178:452;;;;;:::o;3636:809::-;;;;;3804:3;3792:9;3783:7;3779:23;3775:33;3772:2;;;3821:1;3818;3811:12;3772:2;3864:1;3889:53;3934:7;3925:6;3914:9;3910:22;3889:53;:::i;:::-;3879:63;;3835:117;3991:2;4017:53;4062:7;4053:6;4042:9;4038:22;4017:53;:::i;:::-;4007:63;;3962:118;4119:2;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4090:118;4275:2;4264:9;4260:18;4247:32;4306:18;4298:6;4295:30;4292:2;;;4338:1;4335;4328:12;4292:2;4366:62;4420:7;4411:6;4400:9;4396:22;4366:62;:::i;:::-;4356:72;;4218:220;3762:683;;;;;;;:::o;4451:401::-;;;4573:2;4561:9;4552:7;4548:23;4544:32;4541:2;;;4589:1;4586;4579:12;4541:2;4632:1;4657:53;4702:7;4693:6;4682:9;4678:22;4657:53;:::i;:::-;4647:63;;4603:117;4759:2;4785:50;4827:7;4818:6;4807:9;4803:22;4785:50;:::i;:::-;4775:60;;4730:115;4531:321;;;;;:::o;4858:407::-;;;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;4941:324;;;;;:::o;5271:570::-;;;;5431:2;5419:9;5410:7;5406:23;5402:32;5399:2;;;5447:1;5444;5437:12;5399:2;5518:1;5507:9;5503:17;5490:31;5548:18;5540:6;5537:30;5534:2;;;5580:1;5577;5570:12;5534:2;5616:80;5688:7;5679:6;5668:9;5664:22;5616:80;:::i;:::-;5598:98;;;;5461:245;5745:2;5771:53;5816:7;5807:6;5796:9;5792:22;5771:53;:::i;:::-;5761:63;;5716:118;5389:452;;;;;:::o;5847:256::-;;5952:2;5940:9;5931:7;5927:23;5923:32;5920:2;;;5968:1;5965;5958:12;5920:2;6011:1;6036:50;6078:7;6069:6;6058:9;6054:22;6036:50;:::i;:::-;6026:60;;5982:114;5910:193;;;;:::o;6109:260::-;;6216:2;6204:9;6195:7;6191:23;6187:32;6184:2;;;6232:1;6229;6222:12;6184:2;6275:1;6300:52;6344:7;6335:6;6324:9;6320:22;6300:52;:::i;:::-;6290:62;;6246:116;6174:195;;;;:::o;6375:282::-;;6493:2;6481:9;6472:7;6468:23;6464:32;6461:2;;;6509:1;6506;6499:12;6461:2;6552:1;6577:63;6632:7;6623:6;6612:9;6608:22;6577:63;:::i;:::-;6567:73;;6523:127;6451:206;;;;:::o;6663:375::-;;6781:2;6769:9;6760:7;6756:23;6752:32;6749:2;;;6797:1;6794;6787:12;6749:2;6868:1;6857:9;6853:17;6840:31;6898:18;6890:6;6887:30;6884:2;;;6930:1;6927;6920:12;6884:2;6958:63;7013:7;7004:6;6993:9;6989:22;6958:63;:::i;:::-;6948:73;;6811:220;6739:299;;;;:::o;7044:262::-;;7152:2;7140:9;7131:7;7127:23;7123:32;7120:2;;;7168:1;7165;7158:12;7120:2;7211:1;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7182:117;7110:196;;;;:::o;7312:179::-;;7402:46;7444:3;7436:6;7402:46;:::i;:::-;7480:4;7475:3;7471:14;7457:28;;7392:99;;;;:::o;7497:118::-;7584:24;7602:5;7584:24;:::i;:::-;7579:3;7572:37;7562:53;;:::o;7651:732::-;;7799:54;7847:5;7799:54;:::i;:::-;7869:86;7948:6;7943:3;7869:86;:::i;:::-;7862:93;;7979:56;8029:5;7979:56;:::i;:::-;8058:7;8089:1;8074:284;8099:6;8096:1;8093:13;8074:284;;;8175:6;8169:13;8202:63;8261:3;8246:13;8202:63;:::i;:::-;8195:70;;8288:60;8341:6;8288:60;:::i;:::-;8278:70;;8134:224;8121:1;8118;8114:9;8109:14;;8074:284;;;8078:14;8374:3;8367:10;;7775:608;;;;;;;:::o;8389:109::-;8470:21;8485:5;8470:21;:::i;:::-;8465:3;8458:34;8448:50;;:::o;8504:360::-;;8618:38;8650:5;8618:38;:::i;:::-;8672:70;8735:6;8730:3;8672:70;:::i;:::-;8665:77;;8751:52;8796:6;8791:3;8784:4;8777:5;8773:16;8751:52;:::i;:::-;8828:29;8850:6;8828:29;:::i;:::-;8823:3;8819:39;8812:46;;8594:270;;;;;:::o;8870:364::-;;8986:39;9019:5;8986:39;:::i;:::-;9041:71;9105:6;9100:3;9041:71;:::i;:::-;9034:78;;9121:52;9166:6;9161:3;9154:4;9147:5;9143:16;9121:52;:::i;:::-;9198:29;9220:6;9198:29;:::i;:::-;9193:3;9189:39;9182:46;;8962:272;;;;;:::o;9240:377::-;;9374:39;9407:5;9374:39;:::i;:::-;9429:89;9511:6;9506:3;9429:89;:::i;:::-;9422:96;;9527:52;9572:6;9567:3;9560:4;9553:5;9549:16;9527:52;:::i;:::-;9604:6;9599:3;9595:16;9588:23;;9350:267;;;;;:::o;9647:845::-;;9787:5;9781:12;9816:36;9842:9;9816:36;:::i;:::-;9868:89;9950:6;9945:3;9868:89;:::i;:::-;9861:96;;9988:1;9977:9;9973:17;10004:1;9999:137;;;;10150:1;10145:341;;;;9966:520;;9999:137;10083:4;10079:9;10068;10064:25;10059:3;10052:38;10119:6;10114:3;10110:16;10103:23;;9999:137;;10145:341;10212:38;10244:5;10212:38;:::i;:::-;10272:1;10286:154;10300:6;10297:1;10294:13;10286:154;;;10374:7;10368:14;10364:1;10359:3;10355:11;10348:35;10424:1;10415:7;10411:15;10400:26;;10322:4;10319:1;10315:12;10310:17;;10286:154;;;10469:6;10464:3;10460:16;10453:23;;10152:334;;9966:520;;9754:738;;;;;;:::o;10498:375::-;;10661:67;10725:2;10720:3;10661:67;:::i;:::-;10654:74;;10758:34;10754:1;10749:3;10745:11;10738:55;10824:13;10819:2;10814:3;10810:12;10803:35;10864:2;10859:3;10855:12;10848:19;;10644:229;;;:::o;10879:382::-;;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11139:34;11135:1;11130:3;11126:11;11119:55;11205:20;11200:2;11195:3;11191:12;11184:42;11252:2;11247:3;11243:12;11236:19;;11025:236;;;:::o;11267:395::-;;11430:67;11494:2;11489:3;11430:67;:::i;:::-;11423:74;;11527:34;11523:1;11518:3;11514:11;11507:55;11593:33;11588:2;11583:3;11579:12;11572:55;11653:2;11648:3;11644:12;11637:19;;11413:249;;;:::o;11668:370::-;;11831:67;11895:2;11890:3;11831:67;:::i;:::-;11824:74;;11928:34;11924:1;11919:3;11915:11;11908:55;11994:8;11989:2;11984:3;11980:12;11973:30;12029:2;12024:3;12020:12;12013:19;;11814:224;;;:::o;12044:326::-;;12207:67;12271:2;12266:3;12207:67;:::i;:::-;12200:74;;12304:30;12300:1;12295:3;12291:11;12284:51;12361:2;12356:3;12352:12;12345:19;;12190:180;;;:::o;12376:368::-;;12539:67;12603:2;12598:3;12539:67;:::i;:::-;12532:74;;12636:34;12632:1;12627:3;12623:11;12616:55;12702:6;12697:2;12692:3;12688:12;12681:28;12735:2;12730:3;12726:12;12719:19;;12522:222;;;:::o;12750:323::-;;12913:67;12977:2;12972:3;12913:67;:::i;:::-;12906:74;;13010:27;13006:1;13001:3;12997:11;12990:48;13064:2;13059:3;13055:12;13048:19;;12896:177;;;:::o;13079:376::-;;13242:67;13306:2;13301:3;13242:67;:::i;:::-;13235:74;;13339:34;13335:1;13330:3;13326:11;13319:55;13405:14;13400:2;13395:3;13391:12;13384:36;13446:2;13441:3;13437:12;13430:19;;13225:230;;;:::o;13461:388::-;;13624:67;13688:2;13683:3;13624:67;:::i;:::-;13617:74;;13721:34;13717:1;13712:3;13708:11;13701:55;13787:26;13782:2;13777:3;13773:12;13766:48;13840:2;13835:3;13831:12;13824:19;;13607:242;;;:::o;13855:374::-;;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14115:34;14111:1;14106:3;14102:11;14095:55;14181:12;14176:2;14171:3;14167:12;14160:34;14220:2;14215:3;14211:12;14204:19;;14001:228;;;:::o;14235:373::-;;14398:67;14462:2;14457:3;14398:67;:::i;:::-;14391:74;;14495:34;14491:1;14486:3;14482:11;14475:55;14561:11;14556:2;14551:3;14547:12;14540:33;14599:2;14594:3;14590:12;14583:19;;14381:227;;;:::o;14614:373::-;;14777:67;14841:2;14836:3;14777:67;:::i;:::-;14770:74;;14874:34;14870:1;14865:3;14861:11;14854:55;14940:11;14935:2;14930:3;14926:12;14919:33;14978:2;14973:3;14969:12;14962:19;;14760:227;;;:::o;14993:376::-;;15156:67;15220:2;15215:3;15156:67;:::i;:::-;15149:74;;15253:34;15249:1;15244:3;15240:11;15233:55;15319:14;15314:2;15309:3;15305:12;15298:36;15360:2;15355:3;15351:12;15344:19;;15139:230;;;:::o;15375:330::-;;15538:67;15602:2;15597:3;15538:67;:::i;:::-;15531:74;;15635:34;15631:1;15626:3;15622:11;15615:55;15696:2;15691:3;15687:12;15680:19;;15521:184;;;:::o;15711:376::-;;15874:67;15938:2;15933:3;15874:67;:::i;:::-;15867:74;;15971:34;15967:1;15962:3;15958:11;15951:55;16037:14;16032:2;16027:3;16023:12;16016:36;16078:2;16073:3;16069:12;16062:19;;15857:230;;;:::o;16093:330::-;;16256:67;16320:2;16315:3;16256:67;:::i;:::-;16249:74;;16353:34;16349:1;16344:3;16340:11;16333:55;16414:2;16409:3;16405:12;16398:19;;16239:184;;;:::o;16429:373::-;;16592:67;16656:2;16651:3;16592:67;:::i;:::-;16585:74;;16689:34;16685:1;16680:3;16676:11;16669:55;16755:11;16750:2;16745:3;16741:12;16734:33;16793:2;16788:3;16784:12;16777:19;;16575:227;;;:::o;16808:379::-;;16971:67;17035:2;17030:3;16971:67;:::i;:::-;16964:74;;17068:34;17064:1;17059:3;17055:11;17048:55;17134:17;17129:2;17124:3;17120:12;17113:39;17178:2;17173:3;17169:12;17162:19;;16954:233;;;:::o;17193:396::-;;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17453:34;17449:1;17444:3;17440:11;17433:55;17519:34;17514:2;17509:3;17505:12;17498:56;17580:2;17575:3;17571:12;17564:19;;17339:250;;;:::o;17595:329::-;;17758:67;17822:2;17817:3;17758:67;:::i;:::-;17751:74;;17855:33;17851:1;17846:3;17842:11;17835:54;17915:2;17910:3;17906:12;17899:19;;17741:183;;;:::o;17930:365::-;;18093:67;18157:2;18152:3;18093:67;:::i;:::-;18086:74;;18190:34;18186:1;18181:3;18177:11;18170:55;18256:3;18251:2;18246:3;18242:12;18235:25;18286:2;18281:3;18277:12;18270:19;;18076:219;;;:::o;18301:326::-;;18464:67;18528:2;18523:3;18464:67;:::i;:::-;18457:74;;18561:30;18557:1;18552:3;18548:11;18541:51;18618:2;18613:3;18609:12;18602:19;;18447:180;;;:::o;18633:365::-;;18796:67;18860:2;18855:3;18796:67;:::i;:::-;18789:74;;18893:34;18889:1;18884:3;18880:11;18873:55;18959:3;18954:2;18949:3;18945:12;18938:25;18989:2;18984:3;18980:12;18973:19;;18779:219;;;:::o;19004:297::-;;19184:83;19265:1;19260:3;19184:83;:::i;:::-;19177:90;;19293:1;19288:3;19284:11;19277:18;;19167:134;;;:::o;19307:381::-;;19470:67;19534:2;19529:3;19470:67;:::i;:::-;19463:74;;19567:34;19563:1;19558:3;19554:11;19547:55;19633:19;19628:2;19623:3;19619:12;19612:41;19679:2;19674:3;19670:12;19663:19;;19453:235;;;:::o;19694:376::-;;19857:67;19921:2;19916:3;19857:67;:::i;:::-;19850:74;;19954:34;19950:1;19945:3;19941:11;19934:55;20020:14;20015:2;20010:3;20006:12;19999:36;20061:2;20056:3;20052:12;20045:19;;19840:230;;;:::o;20076:330::-;;20239:67;20303:2;20298:3;20239:67;:::i;:::-;20232:74;;20336:34;20332:1;20327:3;20323:11;20316:55;20397:2;20392:3;20388:12;20381:19;;20222:184;;;:::o;20412:327::-;;20575:67;20639:2;20634:3;20575:67;:::i;:::-;20568:74;;20672:31;20668:1;20663:3;20659:11;20652:52;20730:2;20725:3;20721:12;20714:19;;20558:181;;;:::o;20745:108::-;20822:24;20840:5;20822:24;:::i;:::-;20817:3;20810:37;20800:53;;:::o;20859:118::-;20946:24;20964:5;20946:24;:::i;:::-;20941:3;20934:37;20924:53;;:::o;20983:429::-;;21182:92;21270:3;21261:6;21182:92;:::i;:::-;21175:99;;21291:95;21382:3;21373:6;21291:95;:::i;:::-;21284:102;;21403:3;21396:10;;21164:248;;;;;:::o;21418:379::-;;21624:147;21767:3;21624:147;:::i;:::-;21617:154;;21788:3;21781:10;;21606:191;;;:::o;21803:222::-;;21934:2;21923:9;21919:18;21911:26;;21947:71;22015:1;22004:9;22000:17;21991:6;21947:71;:::i;:::-;21901:124;;;;:::o;22031:640::-;;22264:3;22253:9;22249:19;22241:27;;22278:71;22346:1;22335:9;22331:17;22322:6;22278:71;:::i;:::-;22359:72;22427:2;22416:9;22412:18;22403:6;22359:72;:::i;:::-;22441;22509:2;22498:9;22494:18;22485:6;22441:72;:::i;:::-;22560:9;22554:4;22550:20;22545:2;22534:9;22530:18;22523:48;22588:76;22659:4;22650:6;22588:76;:::i;:::-;22580:84;;22231:440;;;;;;;:::o;22677:373::-;;22858:2;22847:9;22843:18;22835:26;;22907:9;22901:4;22897:20;22893:1;22882:9;22878:17;22871:47;22935:108;23038:4;23029:6;22935:108;:::i;:::-;22927:116;;22825:225;;;;:::o;23056:210::-;;23181:2;23170:9;23166:18;23158:26;;23194:65;23256:1;23245:9;23241:17;23232:6;23194:65;:::i;:::-;23148:118;;;;:::o;23272:313::-;;23423:2;23412:9;23408:18;23400:26;;23472:9;23466:4;23462:20;23458:1;23447:9;23443:17;23436:47;23500:78;23573:4;23564:6;23500:78;:::i;:::-;23492:86;;23390:195;;;;:::o;23591:419::-;;23795:2;23784:9;23780:18;23772:26;;23844:9;23838:4;23834:20;23830:1;23819:9;23815:17;23808:47;23872:131;23998:4;23872:131;:::i;:::-;23864:139;;23762:248;;;:::o;24016:419::-;;24220:2;24209:9;24205:18;24197:26;;24269:9;24263:4;24259:20;24255:1;24244:9;24240:17;24233:47;24297:131;24423:4;24297:131;:::i;:::-;24289:139;;24187:248;;;:::o;24441:419::-;;24645:2;24634:9;24630:18;24622:26;;24694:9;24688:4;24684:20;24680:1;24669:9;24665:17;24658:47;24722:131;24848:4;24722:131;:::i;:::-;24714:139;;24612:248;;;:::o;24866:419::-;;25070:2;25059:9;25055:18;25047:26;;25119:9;25113:4;25109:20;25105:1;25094:9;25090:17;25083:47;25147:131;25273:4;25147:131;:::i;:::-;25139:139;;25037:248;;;:::o;25291:419::-;;25495:2;25484:9;25480:18;25472:26;;25544:9;25538:4;25534:20;25530:1;25519:9;25515:17;25508:47;25572:131;25698:4;25572:131;:::i;:::-;25564:139;;25462:248;;;:::o;25716:419::-;;25920:2;25909:9;25905:18;25897:26;;25969:9;25963:4;25959:20;25955:1;25944:9;25940:17;25933:47;25997:131;26123:4;25997:131;:::i;:::-;25989:139;;25887:248;;;:::o;26141:419::-;;26345:2;26334:9;26330:18;26322:26;;26394:9;26388:4;26384:20;26380:1;26369:9;26365:17;26358:47;26422:131;26548:4;26422:131;:::i;:::-;26414:139;;26312:248;;;:::o;26566:419::-;;26770:2;26759:9;26755:18;26747:26;;26819:9;26813:4;26809:20;26805:1;26794:9;26790:17;26783:47;26847:131;26973:4;26847:131;:::i;:::-;26839:139;;26737:248;;;:::o;26991:419::-;;27195:2;27184:9;27180:18;27172:26;;27244:9;27238:4;27234:20;27230:1;27219:9;27215:17;27208:47;27272:131;27398:4;27272:131;:::i;:::-;27264:139;;27162:248;;;:::o;27416:419::-;;27620:2;27609:9;27605:18;27597:26;;27669:9;27663:4;27659:20;27655:1;27644:9;27640:17;27633:47;27697:131;27823:4;27697:131;:::i;:::-;27689:139;;27587:248;;;:::o;27841:419::-;;28045:2;28034:9;28030:18;28022:26;;28094:9;28088:4;28084:20;28080:1;28069:9;28065:17;28058:47;28122:131;28248:4;28122:131;:::i;:::-;28114:139;;28012:248;;;:::o;28266:419::-;;28470:2;28459:9;28455:18;28447:26;;28519:9;28513:4;28509:20;28505:1;28494:9;28490:17;28483:47;28547:131;28673:4;28547:131;:::i;:::-;28539:139;;28437:248;;;:::o;28691:419::-;;28895:2;28884:9;28880:18;28872:26;;28944:9;28938:4;28934:20;28930:1;28919:9;28915:17;28908:47;28972:131;29098:4;28972:131;:::i;:::-;28964:139;;28862:248;;;:::o;29116:419::-;;29320:2;29309:9;29305:18;29297:26;;29369:9;29363:4;29359:20;29355:1;29344:9;29340:17;29333:47;29397:131;29523:4;29397:131;:::i;:::-;29389:139;;29287:248;;;:::o;29541:419::-;;29745:2;29734:9;29730:18;29722:26;;29794:9;29788:4;29784:20;29780:1;29769:9;29765:17;29758:47;29822:131;29948:4;29822:131;:::i;:::-;29814:139;;29712:248;;;:::o;29966:419::-;;30170:2;30159:9;30155:18;30147:26;;30219:9;30213:4;30209:20;30205:1;30194:9;30190:17;30183:47;30247:131;30373:4;30247:131;:::i;:::-;30239:139;;30137:248;;;:::o;30391:419::-;;30595:2;30584:9;30580:18;30572:26;;30644:9;30638:4;30634:20;30630:1;30619:9;30615:17;30608:47;30672:131;30798:4;30672:131;:::i;:::-;30664:139;;30562:248;;;:::o;30816:419::-;;31020:2;31009:9;31005:18;30997:26;;31069:9;31063:4;31059:20;31055:1;31044:9;31040:17;31033:47;31097:131;31223:4;31097:131;:::i;:::-;31089:139;;30987:248;;;:::o;31241:419::-;;31445:2;31434:9;31430:18;31422:26;;31494:9;31488:4;31484:20;31480:1;31469:9;31465:17;31458:47;31522:131;31648:4;31522:131;:::i;:::-;31514:139;;31412:248;;;:::o;31666:419::-;;31870:2;31859:9;31855:18;31847:26;;31919:9;31913:4;31909:20;31905:1;31894:9;31890:17;31883:47;31947:131;32073:4;31947:131;:::i;:::-;31939:139;;31837:248;;;:::o;32091:419::-;;32295:2;32284:9;32280:18;32272:26;;32344:9;32338:4;32334:20;32330:1;32319:9;32315:17;32308:47;32372:131;32498:4;32372:131;:::i;:::-;32364:139;;32262:248;;;:::o;32516:419::-;;32720:2;32709:9;32705:18;32697:26;;32769:9;32763:4;32759:20;32755:1;32744:9;32740:17;32733:47;32797:131;32923:4;32797:131;:::i;:::-;32789:139;;32687:248;;;:::o;32941:419::-;;33145:2;33134:9;33130:18;33122:26;;33194:9;33188:4;33184:20;33180:1;33169:9;33165:17;33158:47;33222:131;33348:4;33222:131;:::i;:::-;33214:139;;33112:248;;;:::o;33366:419::-;;33570:2;33559:9;33555:18;33547:26;;33619:9;33613:4;33609:20;33605:1;33594:9;33590:17;33583:47;33647:131;33773:4;33647:131;:::i;:::-;33639:139;;33537:248;;;:::o;33791:419::-;;33995:2;33984:9;33980:18;33972:26;;34044:9;34038:4;34034:20;34030:1;34019:9;34015:17;34008:47;34072:131;34198:4;34072:131;:::i;:::-;34064:139;;33962:248;;;:::o;34216:419::-;;34420:2;34409:9;34405:18;34397:26;;34469:9;34463:4;34459:20;34455:1;34444:9;34440:17;34433:47;34497:131;34623:4;34497:131;:::i;:::-;34489:139;;34387:248;;;:::o;34641:419::-;;34845:2;34834:9;34830:18;34822:26;;34894:9;34888:4;34884:20;34880:1;34869:9;34865:17;34858:47;34922:131;35048:4;34922:131;:::i;:::-;34914:139;;34812:248;;;:::o;35066:222::-;;35197:2;35186:9;35182:18;35174:26;;35210:71;35278:1;35267:9;35263:17;35254:6;35210:71;:::i;:::-;35164:124;;;;:::o;35294:283::-;;35360:2;35354:9;35344:19;;35402:4;35394:6;35390:17;35509:6;35497:10;35494:22;35473:18;35461:10;35458:34;35455:62;35452:2;;;35520:18;;:::i;:::-;35452:2;35560:10;35556:2;35549:22;35334:243;;;;:::o;35583:331::-;;35734:18;35726:6;35723:30;35720:2;;;35756:18;;:::i;:::-;35720:2;35841:4;35837:9;35830:4;35822:6;35818:17;35814:33;35806:41;;35902:4;35896;35892:15;35884:23;;35649:265;;;:::o;35920:332::-;;36072:18;36064:6;36061:30;36058:2;;;36094:18;;:::i;:::-;36058:2;36179:4;36175:9;36168:4;36160:6;36156:17;36152:33;36144:41;;36240:4;36234;36230:15;36222:23;;35987:265;;;:::o;36258:132::-;;36348:3;36340:11;;36378:4;36373:3;36369:14;36361:22;;36330:60;;;:::o;36396:141::-;;36468:3;36460:11;;36491:3;36488:1;36481:14;36525:4;36522:1;36512:18;36504:26;;36450:87;;;:::o;36543:114::-;;36644:5;36638:12;36628:22;;36617:40;;;:::o;36663:98::-;;36748:5;36742:12;36732:22;;36721:40;;;:::o;36767:99::-;;36853:5;36847:12;36837:22;;36826:40;;;:::o;36872:113::-;;36974:4;36969:3;36965:14;36957:22;;36947:38;;;:::o;36991:184::-;;37124:6;37119:3;37112:19;37164:4;37159:3;37155:14;37140:29;;37102:73;;;;:::o;37181:168::-;;37298:6;37293:3;37286:19;37338:4;37333:3;37329:14;37314:29;;37276:73;;;;:::o;37355:147::-;;37493:3;37478:18;;37468:34;;;;:::o;37508:169::-;;37626:6;37621:3;37614:19;37666:4;37661:3;37657:14;37642:29;;37604:73;;;;:::o;37683:148::-;;37822:3;37807:18;;37797:34;;;;:::o;37837:305::-;;37896:20;37914:1;37896:20;:::i;:::-;37891:25;;37930:20;37948:1;37930:20;:::i;:::-;37925:25;;38084:1;38016:66;38012:74;38009:1;38006:81;38003:2;;;38090:18;;:::i;:::-;38003:2;38134:1;38131;38127:9;38120:16;;37881:261;;;;:::o;38148:185::-;;38205:20;38223:1;38205:20;:::i;:::-;38200:25;;38239:20;38257:1;38239:20;:::i;:::-;38234:25;;38278:1;38268:2;;38283:18;;:::i;:::-;38268:2;38325:1;38322;38318:9;38313:14;;38190:143;;;;:::o;38339:348::-;;38402:20;38420:1;38402:20;:::i;:::-;38397:25;;38436:20;38454:1;38436:20;:::i;:::-;38431:25;;38624:1;38556:66;38552:74;38549:1;38546:81;38541:1;38534:9;38527:17;38523:105;38520:2;;;38631:18;;:::i;:::-;38520:2;38679:1;38676;38672:9;38661:20;;38387:300;;;;:::o;38693:191::-;;38753:20;38771:1;38753:20;:::i;:::-;38748:25;;38787:20;38805:1;38787:20;:::i;:::-;38782:25;;38826:1;38823;38820:8;38817:2;;;38831:18;;:::i;:::-;38817:2;38876:1;38873;38869:9;38861:17;;38738:146;;;;:::o;38890:96::-;;38956:24;38974:5;38956:24;:::i;:::-;38945:35;;38935:51;;;:::o;38992:90::-;;39069:5;39062:13;39055:21;39044:32;;39034:48;;;:::o;39088:149::-;;39164:66;39157:5;39153:78;39142:89;;39132:105;;;:::o;39243:126::-;;39320:42;39313:5;39309:54;39298:65;;39288:81;;;:::o;39375:77::-;;39441:5;39430:16;;39420:32;;;:::o;39458:154::-;39542:6;39537:3;39532;39519:30;39604:1;39595:6;39590:3;39586:16;39579:27;39509:103;;;:::o;39618:307::-;39686:1;39696:113;39710:6;39707:1;39704:13;39696:113;;;39795:1;39790:3;39786:11;39780:18;39776:1;39771:3;39767:11;39760:39;39732:2;39729:1;39725:10;39720:15;;39696:113;;;39827:6;39824:1;39821:13;39818:2;;;39907:1;39898:6;39893:3;39889:16;39882:27;39818:2;39667:258;;;;:::o;39931:320::-;;40012:1;40006:4;40002:12;39992:22;;40059:1;40053:4;40049:12;40080:18;40070:2;;40136:4;40128:6;40124:17;40114:27;;40070:2;40198;40190:6;40187:14;40167:18;40164:38;40161:2;;;40217:18;;:::i;:::-;40161:2;39982:269;;;;:::o;40257:233::-;;40319:24;40337:5;40319:24;:::i;:::-;40310:33;;40365:66;40358:5;40355:77;40352:2;;;40435:18;;:::i;:::-;40352:2;40482:1;40475:5;40471:13;40464:20;;40300:190;;;:::o;40496:176::-;;40545:20;40563:1;40545:20;:::i;:::-;40540:25;;40579:20;40597:1;40579:20;:::i;:::-;40574:25;;40618:1;40608:2;;40623:18;;:::i;:::-;40608:2;40664:1;40661;40657:9;40652:14;;40530:142;;;;:::o;40678:180::-;40726:77;40723:1;40716:88;40823:4;40820:1;40813:15;40847:4;40844:1;40837:15;40864:180;40912:77;40909:1;40902:88;41009:4;41006:1;40999:15;41033:4;41030:1;41023:15;41050:180;41098:77;41095:1;41088:88;41195:4;41192:1;41185:15;41219:4;41216:1;41209:15;41236:180;41284:77;41281:1;41274:88;41381:4;41378:1;41371:15;41405:4;41402:1;41395:15;41422:102;;41514:2;41510:7;41505:2;41498:5;41494:14;41490:28;41480:38;;41470:54;;;:::o;41530:122::-;41603:24;41621:5;41603:24;:::i;:::-;41596:5;41593:35;41583:2;;41642:1;41639;41632:12;41583:2;41573:79;:::o;41658:116::-;41728:21;41743:5;41728:21;:::i;:::-;41721:5;41718:32;41708:2;;41764:1;41761;41754:12;41708:2;41698:76;:::o;41780:120::-;41852:23;41869:5;41852:23;:::i;:::-;41845:5;41842:34;41832:2;;41890:1;41887;41880:12;41832:2;41822:78;:::o;41906:122::-;41979:24;41997:5;41979:24;:::i;:::-;41972:5;41969:35;41959:2;;42018:1;42015;42008:12;41959:2;41949:79;:::o

Swarm Source

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