ETH Price: $3,445.89 (-0.92%)
Gas: 4 Gwei

Token

MetaKnights (Meta Token)
 

Overview

Max Total Supply

744 Meta Token

Holders

355

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Meta Token
0xEdc15E460495104aaBE944C31f15A41fd9E1ca93
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 9999 Metaverse Knights defending The Meta Kingdom. The first ever 8 bit knight NFT.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetaKnights

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin/contracts/access/[email protected]

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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


    /**
     * TODO: Add comment
     */
    function burn(uint256 burnQuantity) external returns (bool);

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: contracts/MetaKnights.sol

pragma solidity ^0.8.0;

/**
 * @title MetaKnights contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract MetaKnights is ERC721Enumerable, Ownable, ReentrancyGuard {

    uint256 public MAX_NFT_SUPPLY = 9999;
    uint256 public PRESALE_NFT = 1500;
    // uint256 public RESERVE_NFT = 3;

    uint256 public PRESALE_PRICE = 0.045 ether;

    uint256 public NFT_PRICE = 0.06 ether;
    uint256 public MAX_NFT_WALLET_PRESALE = 3;
    
    uint256 public MAX_NFT_WALLET = 10;

    uint256 public presaleClaimed;
    // uint256 public reserveClaimed;

    // uint256 public publicSaleStartTimestamp;

    uint256 public NAME_CHANGE_PRICE = 150 * (10 ** 18);

    string public baseTokenURI;

    bool public publicSaleActive ;
    bool public preSaleActive ;

    // Name change token address
    address public _utilityContract;
    
    mapping(address => bool) private whitelisted;
    mapping (uint256 => string) private _tokenName;
    mapping (string => bool) private _nameReserved;

    event NameChange (uint256 indexed NFTIndex, string newName);

    event BaseURIChanged(string baseURI);
    event PreSaleMint(address minter, uint256 amountOfNFTs);
    event FinalSaleMint(address minter, uint256 amountOfNFTs);

    constructor(address utilityContract) ERC721("MetaKnights", "Meta Token") {
        // baseTokenURI = baseURI;
        // publicSaleStartTimestamp = _publicSaleStartTimestamp;
        _utilityContract = utilityContract;
    }

    /**
     * @dev Returns name of the NFT at index.
     */
    function tokenNameByIndex(uint256 index) public view returns (string memory) {
        return _tokenName[index];
    }

    /**
     * @dev Returns if the name has been reserved.
     */
    function isNameReserved(string memory nameString) public view returns (bool) {
        return _nameReserved[toLower(nameString)];
    }

    function addToWhitelist(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            whitelisted[addresses[i]] = true;
        }
    }

    function removeFromWhitelist(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            whitelisted[addresses[i]] = false;
        }
    }

    function checkIfWhitelisted(address addr) external view returns (bool) {
        return whitelisted[addr];
    }

    function reserveNFT(uint256 amountOfNFTs) public onlyOwner {        
        // require(reserveClaimed + amountOfNFTs <= RESERVE_NFT, "Minting would exceed max reserved NFTs");
        require(totalSupply() + amountOfNFTs <= MAX_NFT_SUPPLY, "Minting would exceed max supply");
        for (uint i = 0; i < amountOfNFTs; i++) {
            uint supply = totalSupply();
            // if (totalSupply() < MAX_NFT_SUPPLY) 
            // {
                // reserveClaimed += 1;
                _safeMint(msg.sender, supply);
            // }
        }
    }
    
    function presaleMINT(uint256 amountOfNFTs) external payable {
        require(preSaleActive, "Presale has not started");
        require(whitelisted[msg.sender], "You are not whitelisted");
        require(presaleClaimed + amountOfNFTs <= PRESALE_NFT, "Minting would exceed max Presale NFTs");
        require(totalSupply() + amountOfNFTs <= MAX_NFT_SUPPLY, "Minting would exceed max supply");
        require(balanceOf(msg.sender) + amountOfNFTs <= MAX_NFT_WALLET_PRESALE, "Purchase exceeds max allowed per wallet");
        require(PRESALE_PRICE * amountOfNFTs == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfNFTs; i++) {
            uint256 tokenId = totalSupply();

            presaleClaimed += 1;
            _safeMint(msg.sender, tokenId);
        }
        
        emit PreSaleMint(msg.sender, amountOfNFTs);
    }

    function mintNFT(uint256 amountOfNFTs) external payable {
        require(publicSaleActive, "Final sale has not started");
        require(totalSupply() + amountOfNFTs <= MAX_NFT_SUPPLY, "Minting would exceed max supply");
        require(balanceOf(msg.sender) + amountOfNFTs <= MAX_NFT_WALLET, "Purchase exceeds max allowed per wallet");
        require(NFT_PRICE * amountOfNFTs == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfNFTs; i++) {
            uint256 tokenId = totalSupply();

            _safeMint(msg.sender, tokenId);
        }

        emit FinalSaleMint(msg.sender, amountOfNFTs);
    }

    /**
     * @dev Changes the name for MetaKnights tokenId
     */
    function changeName(uint256 tokenId, string memory newName) external {
        address owner = ownerOf(tokenId);

        require(_msgSender() == owner, "ERC721: caller is not the owner");
        require(validateName(newName) == true, "Not a valid new name");
        require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "New name is same as the current one");
        require(isNameReserved(newName) == false, "Name already reserved");

        IERC20(_utilityContract).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);
        // If already named, dereserve old name
        if (bytes(_tokenName[tokenId]).length > 0) {
            toggleReserveName(_tokenName[tokenId], false);
        }
        toggleReserveName(newName, true);
        _tokenName[tokenId] = newName;
        IERC20(_utilityContract).burn(NAME_CHANGE_PRICE);
        emit NameChange(tokenId, newName);
    }

    // function hasFinalSaleStarted() public view returns(bool){
    //     return (block.timestamp >= publicSaleStartTimestamp || reserveClaimed >= PRESALE_NFT) ? true : false;
    // }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
        emit BaseURIChanged(baseURI);
    }

    function setMAX_NFTS_WALLET_PRESALE(uint256 _amount) external onlyOwner {
        MAX_NFT_WALLET_PRESALE = _amount;
    }

    function setMAX_NFTS_WALLET(uint256 _amount) external onlyOwner {
        MAX_NFT_WALLET = _amount;
    }

    function setNFT_PRICE(uint256 _amount) external onlyOwner {
        NFT_PRICE = _amount;
    }

    function setPRESALE_PRICE(uint256 _amount) external onlyOwner {
        PRESALE_PRICE = _amount;
    }

    function setPRESALE_MAX_NFT(uint256 _amount) external onlyOwner {
        PRESALE_NFT = _amount;
    }

    function setNAME_CHANGE_PRICE(uint256 _amount) external onlyOwner {
        NAME_CHANGE_PRICE = _amount;
    }

    function flipPublicSaleActive() external onlyOwner {
        publicSaleActive = !publicSaleActive;
    }

    function flipPreSaleActive() external onlyOwner {
        preSaleActive = !preSaleActive;
    }

    function setUtility_Contract(address utilityContract) external onlyOwner {
        _utilityContract = utilityContract;
    }

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

    function withdrawAll() public onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "Insufficent balance");
        uint256 Mike = (balance * 3250) /10000 ;
        uint256 Mathew = (balance * 3250) /10000 ;
        uint256 Aug = (balance * 700) /10000 ;
        uint256 Sean = (balance * 500) /10000 ;
        uint256 Ahmed = (balance * 1800) /10000 ;
        uint256 Dev = (balance * 500) / 10000;

        (bool success, ) = payable(0xb020365CAb82927383db859A10129b6773254602).call{value: Mike}("");
        require(success, "Transfer failed to Mike");
        (bool success2, ) = payable(0x8FA2f269B0Ef3b8b9435AB5aAAcE4f92dA9E8e15).call{value: Mathew}("");
        require(success2, "Transfer failed to Mathew");
        (bool success3, ) = payable(0x981bB577A8CFF6A18eB70E06ADc958C60c651FF4).call{value: Aug}("");
        require(success3, "Transfer failed to Aug");
        (bool success4, ) = payable(0x87413B2dEb63bB81cB712b75dB02dB594b8d19af).call{value: Sean}("");
        require(success4, "Transfer failed to Sean");
        (bool success5, ) = payable(0x7fd290D331a4245E70bb98924143703dB9FB0A06).call{value: Ahmed}("");
        require(success5, "Transfer failed to Ahmed"); 
        (bool success6, ) = payable(0x2A140D715fE3Db1a083dA7C796a315e07BEF52EA).call{value: Dev}("");
        require(success6, "Transfer failed to Dev");

    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[toLower(str)] = isReserve;
    }

    /**
     * @dev Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
     */
    function validateName(string memory str) public pure returns (bool){
        bytes memory b = bytes(str);
        if(b.length < 1) return false;
        if(b.length > 25) return false; // Cannot be longer than 25 characters
        if(b[0] == 0x20) return false; // Leading space
        if (b[b.length - 1] == 0x20) return false; // Trailing space

        bytes1 lastChar = b[0];

        for(uint i; i<b.length; i++){
            bytes1 char = b[i];

            if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

            if(
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            )
                return false;

            lastChar = char;
        }

        return true;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) public pure returns (string memory){
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"utilityContract","type":"address"}],"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":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfNFTs","type":"uint256"}],"name":"FinalSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"NFTIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfNFTs","type":"uint256"}],"name":"PreSaleMint","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_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_WALLET_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME_CHANGE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_utilityContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkIfWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPreSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfNFTs","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfNFTs","type":"uint256"}],"name":"presaleMINT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfNFTs","type":"uint256"}],"name":"reserveNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMAX_NFTS_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMAX_NFTS_WALLET_PRESALE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNAME_CHANGE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNFT_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPRESALE_MAX_NFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPRESALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"utilityContract","type":"address"}],"name":"setUtility_Contract","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":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261270f600c556105dc600d55669fdf42f6e48000600e5566d529ae9e860000600f556003601055600a601155680821ab0d44149800006013553480156200004a57600080fd5b50604051620042a6380380620042a68339810160408190526200006d9162000224565b604080518082018252600b81526a4d6574614b6e696768747360a81b60208083019182528351808501909452600a84526926b2ba30902a37b5b2b760b11b908401528151919291620000c2916000916200017e565b508051620000d89060019060208401906200017e565b505050620000f5620000ef6200012860201b60201c565b6200012c565b6001600b55601580546001600160a01b03909216620100000262010000600160b01b031990921691909117905562000291565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200018c9062000254565b90600052602060002090601f016020900481019282620001b05760008555620001fb565b82601f10620001cb57805160ff1916838001178555620001fb565b82800160010185558215620001fb579182015b82811115620001fb578251825591602001919060010190620001de565b50620002099291506200020d565b5090565b5b808211156200020957600081556001016200020e565b60006020828403121562000236578081fd5b81516001600160a01b03811681146200024d578182fd5b9392505050565b6002810460018216806200026957607f821691505b602082108114156200028b57634e487b7160e01b600052602260045260246000fd5b50919050565b61400580620002a16000396000f3fe60806040526004361061031a5760003560e01c80636edf9fc4116101ab578063a3844916116100f7578063c87b56dd11610095578063e3f7822f1161006f578063e3f7822f14610893578063e985e9c5146108b3578063f2fde38b146108d3578063f45be5e9146108f35761031a565b8063c87b56dd14610849578063d08b11e314610869578063d547cfb71461087e5761031a565b8063b88d4fde116100d1578063b88d4fde146107d4578063bc8893b4146107f4578063c058ead114610809578063c39cbef1146108295761031a565b8063a38449161461078a578063b5077f441461079f578063b5d92b08146107b45761031a565b80638da5cb5b1161016457806395d89b411161013e57806395d89b4114610715578063972a0f511461072a5780639ffdb65a1461074a578063a22cb4651461076a5761031a565b80638da5cb5b146106cd57806392642744146106e25780639416b423146106f55761031a565b80636edf9fc41461063957806370a082311461064e578063715018a61461066e5780637f6497831461068357806384494708146106a3578063853828b6146106b85761031a565b8063397be3fd1161026a57806355f804b31161022357806362dc6e21116101fd57806362dc6e21146105cf5780636352211e146105e4578063676dd563146106045780636d522418146106195761031a565b806355f804b31461056f578063562781481461058f5780635b6d414e146105af5761031a565b8063397be3fd146104c757806342842e0e146104e75780634f6ccce7146105075780634fb9df6714610527578063548db1741461053a57806354b6f1611461055a5761031a565b806315b56d10116102d757806323b872dd116102b157806323b872dd146104475780632660a92e146104675780632c0da0ea146104875780632f745c59146104a75761031a565b806315b56d10146103fd57806318160ddd1461041d5780631b5cb7f3146104325761031a565b806301ffc9a71461031f578063025bda281461035557806304ea87031461037757806306fdde0314610399578063081812fc146103bb578063095ea7b3146103db575b600080fd5b34801561032b57600080fd5b5061033f61033a366004613264565b610908565b60405161034c91906134cf565b60405180910390f35b34801561036157600080fd5b5061036a610935565b60405161034c9190613441565b34801561038357600080fd5b5061038c61094a565b60405161034c9190613e37565b3480156103a557600080fd5b506103ae610950565b60405161034c91906134da565b3480156103c757600080fd5b5061036a6103d63660046132cf565b6109e2565b3480156103e757600080fd5b506103fb6103f6366004613198565b610a2e565b005b34801561040957600080fd5b5061033f61041836600461329c565b610ac6565b34801561042957600080fd5b5061038c610afa565b34801561043e57600080fd5b506103fb610b00565b34801561045357600080fd5b506103fb6104623660046130ae565b610b53565b34801561047357600080fd5b5061033f610482366004613062565b610b8b565b34801561049357600080fd5b506103fb6104a23660046132cf565b610ba9565b3480156104b357600080fd5b5061038c6104c2366004613198565b610bed565b3480156104d357600080fd5b506103fb6104e23660046132cf565b610c3f565b3480156104f357600080fd5b506103fb6105023660046130ae565b610cea565b34801561051357600080fd5b5061038c6105223660046132cf565b610d05565b6103fb6105353660046132cf565b610d60565b34801561054657600080fd5b506103fb6105553660046131c1565b610f04565b34801561056657600080fd5b5061038c611021565b34801561057b57600080fd5b506103fb61058a36600461329c565b611027565b34801561059b57600080fd5b506103fb6105aa3660046132cf565b6110a9565b3480156105bb57600080fd5b506103fb6105ca3660046132cf565b6110ed565b3480156105db57600080fd5b5061038c611131565b3480156105f057600080fd5b5061036a6105ff3660046132cf565b611137565b34801561061057600080fd5b5061038c61116c565b34801561062557600080fd5b506103ae6106343660046132cf565b611172565b34801561064557600080fd5b506103fb611214565b34801561065a57600080fd5b5061038c610669366004613062565b611270565b34801561067a57600080fd5b506103fb6112b4565b34801561068f57600080fd5b506103fb61069e3660046131c1565b6112ff565b3480156106af57600080fd5b5061033f61141c565b3480156106c457600080fd5b506103fb61142a565b3480156106d957600080fd5b5061036a6118d1565b6103fb6106f03660046132cf565b6118e0565b34801561070157600080fd5b506103ae61071036600461329c565b6119fd565b34801561072157600080fd5b506103ae611bc2565b34801561073657600080fd5b506103fb6107453660046132cf565b611bd1565b34801561075657600080fd5b5061033f61076536600461329c565b611c15565b34801561077657600080fd5b506103fb610785366004613162565b611e62565b34801561079657600080fd5b5061038c611f30565b3480156107ab57600080fd5b5061038c611f36565b3480156107c057600080fd5b506103fb6107cf366004613062565b611f3c565b3480156107e057600080fd5b506103fb6107ef3660046130e9565b611fa5565b34801561080057600080fd5b5061033f611fe4565b34801561081557600080fd5b506103fb6108243660046132cf565b611fed565b34801561083557600080fd5b506103fb6108443660046132e7565b612031565b34801561085557600080fd5b506103ae6108643660046132cf565b6123d4565b34801561087557600080fd5b5061038c612457565b34801561088a57600080fd5b506103ae61245d565b34801561089f57600080fd5b506103fb6108ae3660046132cf565b6124eb565b3480156108bf57600080fd5b5061033f6108ce36600461307c565b61252f565b3480156108df57600080fd5b506103fb6108ee366004613062565b61255d565b3480156108ff57600080fd5b5061038c6125ce565b60006001600160e01b0319821663780e9d6360e01b148061092d575061092d826125d4565b90505b919050565b6015546201000090046001600160a01b031681565b60125481565b60606000805461095f90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90613eff565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b5050505050905090565b60006109ed82612614565b610a125760405162461bcd60e51b8152600401610a0990613a4f565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a3982611137565b9050806001600160a01b0316836001600160a01b03161415610a6d5760405162461bcd60e51b8152600401610a0990613bd8565b806001600160a01b0316610a7f612631565b6001600160a01b03161480610a9b5750610a9b816108ce612631565b610ab75760405162461bcd60e51b8152600401610a0990613856565b610ac18383612635565b505050565b60006018610ad3836119fd565b604051610ae09190613358565b9081526040519081900360200190205460ff169050919050565b60085490565b610b08612631565b6001600160a01b0316610b196118d1565b6001600160a01b031614610b3f5760405162461bcd60e51b8152600401610a0990613ac8565b6015805460ff19811660ff90911615179055565b610b64610b5e612631565b826126a3565b610b805760405162461bcd60e51b8152600401610a0990613cb7565b610ac1838383612728565b6001600160a01b031660009081526016602052604090205460ff1690565b610bb1612631565b6001600160a01b0316610bc26118d1565b6001600160a01b031614610be85760405162461bcd60e51b8152600401610a0990613ac8565b601055565b6000610bf883611270565b8210610c165760405162461bcd60e51b8152600401610a09906135d0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c47612631565b6001600160a01b0316610c586118d1565b6001600160a01b031614610c7e5760405162461bcd60e51b8152600401610a0990613ac8565b600c5481610c8a610afa565b610c949190613e4c565b1115610cb25760405162461bcd60e51b8152600401610a0990613946565b60005b81811015610ce6576000610cc7610afa565b9050610cd33382612855565b5080610cde81613f3a565b915050610cb5565b5050565b610ac183838360405180602001604052806000815250611fa5565b6000610d0f610afa565b8210610d2d5760405162461bcd60e51b8152600401610a0990613d08565b60088281548110610d4e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601554610100900460ff16610d875760405162461bcd60e51b8152600401610a09906134ed565b3360009081526016602052604090205460ff16610db65760405162461bcd60e51b8152600401610a09906139b2565b600d5481601254610dc79190613e4c565b1115610de55760405162461bcd60e51b8152600401610a099061358b565b600c5481610df1610afa565b610dfb9190613e4c565b1115610e195760405162461bcd60e51b8152600401610a0990613946565b60105481610e2633611270565b610e309190613e4c565b1115610e4e5760405162461bcd60e51b8152600401610a0990613df0565b3481600e54610e5d9190613e9d565b14610e7a5760405162461bcd60e51b8152600401610a09906139e9565b60005b81811015610ec7576000610e8f610afa565b9050600160126000828254610ea49190613e4c565b90915550610eb490503382612855565b5080610ebf81613f3a565b915050610e7d565b507f4c4aacb77138163adee65ce2fc6ebc1c7111049703ca6a69485495b46c9393583382604051610ef99291906134b6565b60405180910390a150565b610f0c612631565b6001600160a01b0316610f1d6118d1565b6001600160a01b031614610f435760405162461bcd60e51b8152600401610a0990613ac8565b60005b81811015610ac1576000838383818110610f7057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f859190613062565b6001600160a01b03161415610fac5760405162461bcd60e51b8152600401610a0990613c80565b600060166000858585818110610fd257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fe79190613062565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061101981613f3a565b915050610f46565b60135481565b61102f612631565b6001600160a01b03166110406118d1565b6001600160a01b0316146110665760405162461bcd60e51b8152600401610a0990613ac8565b8051611079906014906020840190612f23565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610ef991906134da565b6110b1612631565b6001600160a01b03166110c26118d1565b6001600160a01b0316146110e85760405162461bcd60e51b8152600401610a0990613ac8565b600f55565b6110f5612631565b6001600160a01b03166111066118d1565b6001600160a01b03161461112c5760405162461bcd60e51b8152600401610a0990613ac8565b600e55565b600e5481565b6000818152600260205260408120546001600160a01b03168061092d5760405162461bcd60e51b8152600401610a09906138fd565b600f5481565b600081815260176020526040902080546060919061118f90613eff565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb90613eff565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b50505050509050919050565b61121c612631565b6001600160a01b031661122d6118d1565b6001600160a01b0316146112535760405162461bcd60e51b8152600401610a0990613ac8565b6015805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166112985760405162461bcd60e51b8152600401610a09906138b3565b506001600160a01b031660009081526003602052604090205490565b6112bc612631565b6001600160a01b03166112cd6118d1565b6001600160a01b0316146112f35760405162461bcd60e51b8152600401610a0990613ac8565b6112fd600061286f565b565b611307612631565b6001600160a01b03166113186118d1565b6001600160a01b03161461133e5760405162461bcd60e51b8152600401610a0990613ac8565b60005b81811015610ac157600083838381811061136b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113809190613062565b6001600160a01b031614156113a75760405162461bcd60e51b8152600401610a0990613c80565b6001601660008585858181106113cd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113e29190613062565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061141481613f3a565b915050611341565b601554610100900460ff1681565b611432612631565b6001600160a01b03166114436118d1565b6001600160a01b0316146114695760405162461bcd60e51b8152600401610a0990613ac8565b6002600b54141561148c5760405162461bcd60e51b8152600401610a0990613d8b565b6002600b5547806114af5760405162461bcd60e51b8152600401610a0990613a9b565b60006127106114c083610cb2613e9d565b6114ca9190613e89565b905060006127106114dd84610cb2613e9d565b6114e79190613e89565b905060006127106114fa856102bc613e9d565b6115049190613e89565b90506000612710611517866101f4613e9d565b6115219190613e89565b9050600061271061153487610708613e9d565b61153e9190613e89565b90506000612710611551886101f4613e9d565b61155b9190613e89565b9050600073b020365cab82927383db859a10129b67732546026001600160a01b03168760405161158a9061343e565b60006040518083038185875af1925050503d80600081146115c7576040519150601f19603f3d011682016040523d82523d6000602084013e6115cc565b606091505b50509050806115ed5760405162461bcd60e51b8152600401610a0990613d54565b6000738fa2f269b0ef3b8b9435ab5aaace4f92da9e8e156001600160a01b03168760405161161a9061343e565b60006040518083038185875af1925050503d8060008114611657576040519150601f19603f3d011682016040523d82523d6000602084013e61165c565b606091505b505090508061167d5760405162461bcd60e51b8152600401610a09906136b3565b600073981bb577a8cff6a18eb70e06adc958c60c651ff46001600160a01b0316876040516116aa9061343e565b60006040518083038185875af1925050503d80600081146116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b505090508061170d5760405162461bcd60e51b8152600401610a0990613c50565b60007387413b2deb63bb81cb712b75db02db594b8d19af6001600160a01b03168760405161173a9061343e565b60006040518083038185875af1925050503d8060008114611777576040519150601f19603f3d011682016040523d82523d6000602084013e61177c565b606091505b505090508061179d5760405162461bcd60e51b8152600401610a09906137e8565b6000737fd290d331a4245e70bb98924143703db9fb0a066001600160a01b0316876040516117ca9061343e565b60006040518083038185875af1925050503d8060008114611807576040519150601f19603f3d011682016040523d82523d6000602084013e61180c565b606091505b505090508061182d5760405162461bcd60e51b8152600401610a099061381f565b6000732a140d715fe3db1a083da7c796a315e07bef52ea6001600160a01b03168760405161185a9061343e565b60006040518083038185875af1925050503d8060008114611897576040519150601f19603f3d011682016040523d82523d6000602084013e61189c565b606091505b50509050806118bd5760405162461bcd60e51b8152600401610a0990613524565b50506001600b555050505050505050505050565b600a546001600160a01b031690565b60155460ff166119025760405162461bcd60e51b8152600401610a0990613c19565b600c548161190e610afa565b6119189190613e4c565b11156119365760405162461bcd60e51b8152600401610a0990613946565b6011548161194333611270565b61194d9190613e4c565b111561196b5760405162461bcd60e51b8152600401610a0990613df0565b3481600f5461197a9190613e9d565b146119975760405162461bcd60e51b8152600401610a09906139e9565b60005b818110156119cb5760006119ac610afa565b90506119b83382612855565b50806119c381613f3a565b91505061199a565b507f821f4584abe32331f65a93fcc9cc02b850db6e257e422af5ee486e6edb860fd73382604051610ef99291906134b6565b606060008290506000815167ffffffffffffffff811115611a2e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a58576020820181803683370190505b50905060005b8251811015611bba576041838281518110611a8957634e487b7160e01b600052603260045260246000fd5b016020015160f81c10801590611ac75750605a838281518110611abc57634e487b7160e01b600052603260045260246000fd5b016020015160f81c11155b15611b4557828181518110611aec57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b60f81c6020611b069190613e64565b60f81b828281518110611b2957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ba8565b828181518110611b6557634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b828281518110611b9057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053505b80611bb281613f3a565b915050611a5e565b509392505050565b60606001805461095f90613eff565b611bd9612631565b6001600160a01b0316611bea6118d1565b6001600160a01b031614611c105760405162461bcd60e51b8152600401610a0990613ac8565b601155565b600080829050600181511015611c2f576000915050610930565b601981511115611c43576000915050610930565b80600081518110611c6457634e487b7160e01b600052603260045260246000fd5b6020910101516001600160f81b031916600160fd1b1415611c89576000915050610930565b8060018251611c989190613ebc565b81518110611cb657634e487b7160e01b600052603260045260246000fd5b6020910101516001600160f81b031916600160fd1b1415611cdb576000915050610930565b600081600081518110611cfe57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916905060005b8251811015611e57576000838281518110611d3d57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319169050600160fd1b81148015611d6e5750600160fd1b6001600160f81b03198416145b15611d80576000945050505050610930565b600360fc1b6001600160f81b0319821610801590611dac5750603960f81b6001600160f81b0319821611155b158015611de25750604160f81b6001600160f81b0319821610801590611de05750602d60f91b6001600160f81b0319821611155b155b8015611e175750606160f81b6001600160f81b0319821610801590611e155750603d60f91b6001600160f81b0319821611155b155b8015611e315750600160fd1b6001600160f81b0319821614155b15611e43576000945050505050610930565b915080611e4f81613f3a565b915050611d12565b506001949350505050565b611e6a612631565b6001600160a01b0316826001600160a01b03161415611e9b5760405162461bcd60e51b8152600401610a0990613765565b8060056000611ea8612631565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611eec612631565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f2491906134cf565b60405180910390a35050565b600d5481565b600c5481565b611f44612631565b6001600160a01b0316611f556118d1565b6001600160a01b031614611f7b5760405162461bcd60e51b8152600401610a0990613ac8565b601580546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b611fb6611fb0612631565b836126a3565b611fd25760405162461bcd60e51b8152600401610a0990613cb7565b611fde848484846128c1565b50505050565b60155460ff1681565b611ff5612631565b6001600160a01b03166120066118d1565b6001600160a01b03161461202c5760405162461bcd60e51b8152600401610a0990613ac8565b600d55565b600061203c83611137565b9050806001600160a01b0316612050612631565b6001600160a01b0316146120765760405162461bcd60e51b8152600401610a0990613554565b61207f82611c15565b15156001146120a05760405162461bcd60e51b8152600401610a0990613dc2565b6000838152601760205260409081902090516002916120be91613374565b602060405180830381855afa1580156120db573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906120fe919061324c565b60028360405161210e9190613358565b602060405180830381855afa15801561212b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061214e919061324c565b141561216c5760405162461bcd60e51b8152600401610a0990613b95565b61217582610ac6565b156121925760405162461bcd60e51b8152600401610a0990613a20565b6015546013546040516323b872dd60e01b8152620100009092046001600160a01b0316916323b872dd916121cc9133913091600401613455565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221e9190613230565b506000838152601760205260408120805461223890613eff565b905011156122e357600083815260176020526040902080546122e3919061225e90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461228a90613eff565b80156122d75780601f106122ac576101008083540402835291602001916122d7565b820191906000526020600020905b8154815290600101906020018083116122ba57829003601f168201915b505050505060006128f4565b6122ee8260016128f4565b6000838152601760209081526040909120835161230d92850190612f23565b50601554601354604051630852cd8d60e31b8152620100009092046001600160a01b0316916342966c689161234491600401613e37565b602060405180830381600087803b15801561235e57600080fd5b505af1158015612372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123969190613230565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b836040516123c791906134da565b60405180910390a2505050565b60606123df82612614565b6123fb5760405162461bcd60e51b8152600401610a0990613b46565b6000612405612931565b905060008151116124255760405180602001604052806000815250612450565b8061242f84612940565b60405160200161244092919061340f565b6040516020818303038152906040525b9392505050565b60115481565b6014805461246a90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461249690613eff565b80156124e35780601f106124b8576101008083540402835291602001916124e3565b820191906000526020600020905b8154815290600101906020018083116124c657829003601f168201915b505050505081565b6124f3612631565b6001600160a01b03166125046118d1565b6001600160a01b03161461252a5760405162461bcd60e51b8152600401610a0990613ac8565b601355565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612565612631565b6001600160a01b03166125766118d1565b6001600160a01b03161461259c5760405162461bcd60e51b8152600401610a0990613ac8565b6001600160a01b0381166125c25760405162461bcd60e51b8152600401610a099061366d565b6125cb8161286f565b50565b60105481565b60006001600160e01b031982166380ac58cd60e01b148061260557506001600160e01b03198216635b5e139f60e01b145b8061092d575061092d82612a5b565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061266a82611137565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ae82612614565b6126ca5760405162461bcd60e51b8152600401610a099061379c565b60006126d583611137565b9050806001600160a01b0316846001600160a01b031614806127105750836001600160a01b0316612705846109e2565b6001600160a01b0316145b806127205750612720818561252f565b949350505050565b826001600160a01b031661273b82611137565b6001600160a01b0316146127615760405162461bcd60e51b8152600401610a0990613afd565b6001600160a01b0382166127875760405162461bcd60e51b8152600401610a0990613721565b612792838383612a74565b61279d600082612635565b6001600160a01b03831660009081526003602052604081208054600192906127c6908490613ebc565b90915550506001600160a01b03821660009081526003602052604081208054600192906127f4908490613e4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ce6828260405180602001604052806000815250612afd565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6128cc848484612728565b6128d884848484612b30565b611fde5760405162461bcd60e51b8152600401610a099061361b565b806018612900846119fd565b60405161290d9190613358565b908152604051908190036020019020805491151560ff199092169190911790555050565b60606014805461095f90613eff565b60608161296557506040805180820190915260018152600360fc1b6020820152610930565b8160005b811561298f578061297981613f3a565b91506129889050600a83613e89565b9150612969565b60008167ffffffffffffffff8111156129b857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129e2576020820181803683370190505b5090505b8415612720576129f7600183613ebc565b9150612a04600a86613f55565b612a0f906030613e4c565b60f81b818381518110612a3257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612a54600a86613e89565b94506129e6565b6001600160e01b031981166301ffc9a760e01b14919050565b612a7f838383610ac1565b6001600160a01b038316612a9b57612a9681612c40565b612abe565b816001600160a01b0316836001600160a01b031614612abe57612abe8382612c84565b6001600160a01b038216612ada57612ad581612d21565b610ac1565b826001600160a01b0316826001600160a01b031614610ac157610ac18282612dfa565b612b078383612e3e565b612b146000848484612b30565b610ac15760405162461bcd60e51b8152600401610a099061361b565b6000612b44846001600160a01b0316612f1d565b15611e5757836001600160a01b031663150b7a02612b60612631565b8786866040518563ffffffff1660e01b8152600401612b829493929190613479565b602060405180830381600087803b158015612b9c57600080fd5b505af1925050508015612bcc575060408051601f3d908101601f19168201909252612bc991810190613280565b60015b612c26573d808015612bfa576040519150601f19603f3d011682016040523d82523d6000602084013e612bff565b606091505b508051612c1e5760405162461bcd60e51b8152600401610a099061361b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612720565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612c9184611270565b612c9b9190613ebc565b600083815260076020526040902054909150808214612cee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d3390600190613ebc565b60008381526009602052604081205460088054939450909284908110612d6957634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612d9857634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dde57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e0583611270565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612e645760405162461bcd60e51b8152600401610a099061397d565b612e6d81612614565b15612e8a5760405162461bcd60e51b8152600401610a09906136ea565b612e9660008383612a74565b6001600160a01b0382166000908152600360205260408120805460019290612ebf908490613e4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612f2f90613eff565b90600052602060002090601f016020900481019282612f515760008555612f97565b82601f10612f6a57805160ff1916838001178555612f97565b82800160010185558215612f97579182015b82811115612f97578251825591602001919060010190612f7c565b50612fa3929150612fa7565b5090565b5b80821115612fa35760008155600101612fa8565b600067ffffffffffffffff80841115612fd757612fd7613f95565b604051601f8501601f191681016020018281118282101715612ffb57612ffb613f95565b60405284815291508183850186101561301357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461093057600080fd5b600082601f830112613053578081fd5b61245083833560208501612fbc565b600060208284031215613073578081fd5b6124508261302c565b6000806040838503121561308e578081fd5b6130978361302c565b91506130a56020840161302c565b90509250929050565b6000806000606084860312156130c2578081fd5b6130cb8461302c565b92506130d96020850161302c565b9150604084013590509250925092565b600080600080608085870312156130fe578081fd5b6131078561302c565b93506131156020860161302c565b925060408501359150606085013567ffffffffffffffff811115613137578182fd5b8501601f81018713613147578182fd5b61315687823560208401612fbc565b91505092959194509250565b60008060408385031215613174578182fd5b61317d8361302c565b9150602083013561318d81613fab565b809150509250929050565b600080604083850312156131aa578182fd5b6131b38361302c565b946020939093013593505050565b600080602083850312156131d3578182fd5b823567ffffffffffffffff808211156131ea578384fd5b818501915085601f8301126131fd578384fd5b81358181111561320b578485fd5b866020808302850101111561321e578485fd5b60209290920196919550909350505050565b600060208284031215613241578081fd5b815161245081613fab565b60006020828403121561325d578081fd5b5051919050565b600060208284031215613275578081fd5b813561245081613fb9565b600060208284031215613291578081fd5b815161245081613fb9565b6000602082840312156132ad578081fd5b813567ffffffffffffffff8111156132c3578182fd5b61272084828501613043565b6000602082840312156132e0578081fd5b5035919050565b600080604083850312156132f9578182fd5b82359150602083013567ffffffffffffffff811115613316578182fd5b61332285828601613043565b9150509250929050565b60008151808452613344816020860160208601613ed3565b601f01601f19169290920160200192915050565b6000825161336a818460208701613ed3565b9190910192915050565b815460009081906002810460018083168061339057607f831692505b60208084108214156133b057634e487b7160e01b87526022600452602487fd5b8180156133c457600181146133d557613401565b60ff19861689528489019650613401565b6133de8a613e40565b885b868110156133f95781548b8201529085019083016133e0565b505084890196505b509498975050505050505050565b60008351613421818460208801613ed3565b835190830190613435818360208801613ed3565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ac9083018461332c565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252612450602083018461332c565b60208082526017908201527f50726573616c6520686173206e6f742073746172746564000000000000000000604082015260600190565b6020808252601690820152752a3930b739b332b9103330b4b632b2103a37902232bb60511b604082015260600190565b6020808252601f908201527f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200604082015260600190565b60208082526025908201527f4d696e74696e6720776f756c6420657863656564206d61782050726573616c65604082015264204e46547360d81b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f5472616e73666572206661696c656420746f204d617468657700000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f5472616e73666572206661696c656420746f205365616e000000000000000000604082015260600190565b60208082526018908201527f5472616e73666572206661696c656420746f2041686d65640000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b60208082526015908201527413985b5948185b1c9958591e481c995cd95c9d9959605a1b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e737566666963656e742062616c616e636560681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601a908201527f46696e616c2073616c6520686173206e6f742073746172746564000000000000604082015260600190565b6020808252601690820152755472616e73666572206661696c656420746f2041756760501b604082015260600190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f5472616e73666572206661696c656420746f204d696b65000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152734e6f7420612076616c6964206e6577206e616d6560601b604082015260600190565b60208082526027908201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604082015266081dd85b1b195d60ca1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115613e5f57613e5f613f69565b500190565b600060ff821660ff84168060ff03821115613e8157613e81613f69565b019392505050565b600082613e9857613e98613f7f565b500490565b6000816000190483118215151615613eb757613eb7613f69565b500290565b600082821015613ece57613ece613f69565b500390565b60005b83811015613eee578181015183820152602001613ed6565b83811115611fde5750506000910152565b600281046001821680613f1357607f821691505b60208210811415613f3457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f4e57613f4e613f69565b5060010190565b600082613f6457613f64613f7f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146125cb57600080fd5b6001600160e01b0319811681146125cb57600080fdfea264697066735822122064cc1ede69b8d0900609bc83737b500937d9bc8eaa6ebfce9e8e52df4819466a64736f6c63430008000033000000000000000000000000fdf0415632cf53fdd877d39f020a7e4f7316b92f

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80636edf9fc4116101ab578063a3844916116100f7578063c87b56dd11610095578063e3f7822f1161006f578063e3f7822f14610893578063e985e9c5146108b3578063f2fde38b146108d3578063f45be5e9146108f35761031a565b8063c87b56dd14610849578063d08b11e314610869578063d547cfb71461087e5761031a565b8063b88d4fde116100d1578063b88d4fde146107d4578063bc8893b4146107f4578063c058ead114610809578063c39cbef1146108295761031a565b8063a38449161461078a578063b5077f441461079f578063b5d92b08146107b45761031a565b80638da5cb5b1161016457806395d89b411161013e57806395d89b4114610715578063972a0f511461072a5780639ffdb65a1461074a578063a22cb4651461076a5761031a565b80638da5cb5b146106cd57806392642744146106e25780639416b423146106f55761031a565b80636edf9fc41461063957806370a082311461064e578063715018a61461066e5780637f6497831461068357806384494708146106a3578063853828b6146106b85761031a565b8063397be3fd1161026a57806355f804b31161022357806362dc6e21116101fd57806362dc6e21146105cf5780636352211e146105e4578063676dd563146106045780636d522418146106195761031a565b806355f804b31461056f578063562781481461058f5780635b6d414e146105af5761031a565b8063397be3fd146104c757806342842e0e146104e75780634f6ccce7146105075780634fb9df6714610527578063548db1741461053a57806354b6f1611461055a5761031a565b806315b56d10116102d757806323b872dd116102b157806323b872dd146104475780632660a92e146104675780632c0da0ea146104875780632f745c59146104a75761031a565b806315b56d10146103fd57806318160ddd1461041d5780631b5cb7f3146104325761031a565b806301ffc9a71461031f578063025bda281461035557806304ea87031461037757806306fdde0314610399578063081812fc146103bb578063095ea7b3146103db575b600080fd5b34801561032b57600080fd5b5061033f61033a366004613264565b610908565b60405161034c91906134cf565b60405180910390f35b34801561036157600080fd5b5061036a610935565b60405161034c9190613441565b34801561038357600080fd5b5061038c61094a565b60405161034c9190613e37565b3480156103a557600080fd5b506103ae610950565b60405161034c91906134da565b3480156103c757600080fd5b5061036a6103d63660046132cf565b6109e2565b3480156103e757600080fd5b506103fb6103f6366004613198565b610a2e565b005b34801561040957600080fd5b5061033f61041836600461329c565b610ac6565b34801561042957600080fd5b5061038c610afa565b34801561043e57600080fd5b506103fb610b00565b34801561045357600080fd5b506103fb6104623660046130ae565b610b53565b34801561047357600080fd5b5061033f610482366004613062565b610b8b565b34801561049357600080fd5b506103fb6104a23660046132cf565b610ba9565b3480156104b357600080fd5b5061038c6104c2366004613198565b610bed565b3480156104d357600080fd5b506103fb6104e23660046132cf565b610c3f565b3480156104f357600080fd5b506103fb6105023660046130ae565b610cea565b34801561051357600080fd5b5061038c6105223660046132cf565b610d05565b6103fb6105353660046132cf565b610d60565b34801561054657600080fd5b506103fb6105553660046131c1565b610f04565b34801561056657600080fd5b5061038c611021565b34801561057b57600080fd5b506103fb61058a36600461329c565b611027565b34801561059b57600080fd5b506103fb6105aa3660046132cf565b6110a9565b3480156105bb57600080fd5b506103fb6105ca3660046132cf565b6110ed565b3480156105db57600080fd5b5061038c611131565b3480156105f057600080fd5b5061036a6105ff3660046132cf565b611137565b34801561061057600080fd5b5061038c61116c565b34801561062557600080fd5b506103ae6106343660046132cf565b611172565b34801561064557600080fd5b506103fb611214565b34801561065a57600080fd5b5061038c610669366004613062565b611270565b34801561067a57600080fd5b506103fb6112b4565b34801561068f57600080fd5b506103fb61069e3660046131c1565b6112ff565b3480156106af57600080fd5b5061033f61141c565b3480156106c457600080fd5b506103fb61142a565b3480156106d957600080fd5b5061036a6118d1565b6103fb6106f03660046132cf565b6118e0565b34801561070157600080fd5b506103ae61071036600461329c565b6119fd565b34801561072157600080fd5b506103ae611bc2565b34801561073657600080fd5b506103fb6107453660046132cf565b611bd1565b34801561075657600080fd5b5061033f61076536600461329c565b611c15565b34801561077657600080fd5b506103fb610785366004613162565b611e62565b34801561079657600080fd5b5061038c611f30565b3480156107ab57600080fd5b5061038c611f36565b3480156107c057600080fd5b506103fb6107cf366004613062565b611f3c565b3480156107e057600080fd5b506103fb6107ef3660046130e9565b611fa5565b34801561080057600080fd5b5061033f611fe4565b34801561081557600080fd5b506103fb6108243660046132cf565b611fed565b34801561083557600080fd5b506103fb6108443660046132e7565b612031565b34801561085557600080fd5b506103ae6108643660046132cf565b6123d4565b34801561087557600080fd5b5061038c612457565b34801561088a57600080fd5b506103ae61245d565b34801561089f57600080fd5b506103fb6108ae3660046132cf565b6124eb565b3480156108bf57600080fd5b5061033f6108ce36600461307c565b61252f565b3480156108df57600080fd5b506103fb6108ee366004613062565b61255d565b3480156108ff57600080fd5b5061038c6125ce565b60006001600160e01b0319821663780e9d6360e01b148061092d575061092d826125d4565b90505b919050565b6015546201000090046001600160a01b031681565b60125481565b60606000805461095f90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90613eff565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b5050505050905090565b60006109ed82612614565b610a125760405162461bcd60e51b8152600401610a0990613a4f565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a3982611137565b9050806001600160a01b0316836001600160a01b03161415610a6d5760405162461bcd60e51b8152600401610a0990613bd8565b806001600160a01b0316610a7f612631565b6001600160a01b03161480610a9b5750610a9b816108ce612631565b610ab75760405162461bcd60e51b8152600401610a0990613856565b610ac18383612635565b505050565b60006018610ad3836119fd565b604051610ae09190613358565b9081526040519081900360200190205460ff169050919050565b60085490565b610b08612631565b6001600160a01b0316610b196118d1565b6001600160a01b031614610b3f5760405162461bcd60e51b8152600401610a0990613ac8565b6015805460ff19811660ff90911615179055565b610b64610b5e612631565b826126a3565b610b805760405162461bcd60e51b8152600401610a0990613cb7565b610ac1838383612728565b6001600160a01b031660009081526016602052604090205460ff1690565b610bb1612631565b6001600160a01b0316610bc26118d1565b6001600160a01b031614610be85760405162461bcd60e51b8152600401610a0990613ac8565b601055565b6000610bf883611270565b8210610c165760405162461bcd60e51b8152600401610a09906135d0565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c47612631565b6001600160a01b0316610c586118d1565b6001600160a01b031614610c7e5760405162461bcd60e51b8152600401610a0990613ac8565b600c5481610c8a610afa565b610c949190613e4c565b1115610cb25760405162461bcd60e51b8152600401610a0990613946565b60005b81811015610ce6576000610cc7610afa565b9050610cd33382612855565b5080610cde81613f3a565b915050610cb5565b5050565b610ac183838360405180602001604052806000815250611fa5565b6000610d0f610afa565b8210610d2d5760405162461bcd60e51b8152600401610a0990613d08565b60088281548110610d4e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601554610100900460ff16610d875760405162461bcd60e51b8152600401610a09906134ed565b3360009081526016602052604090205460ff16610db65760405162461bcd60e51b8152600401610a09906139b2565b600d5481601254610dc79190613e4c565b1115610de55760405162461bcd60e51b8152600401610a099061358b565b600c5481610df1610afa565b610dfb9190613e4c565b1115610e195760405162461bcd60e51b8152600401610a0990613946565b60105481610e2633611270565b610e309190613e4c565b1115610e4e5760405162461bcd60e51b8152600401610a0990613df0565b3481600e54610e5d9190613e9d565b14610e7a5760405162461bcd60e51b8152600401610a09906139e9565b60005b81811015610ec7576000610e8f610afa565b9050600160126000828254610ea49190613e4c565b90915550610eb490503382612855565b5080610ebf81613f3a565b915050610e7d565b507f4c4aacb77138163adee65ce2fc6ebc1c7111049703ca6a69485495b46c9393583382604051610ef99291906134b6565b60405180910390a150565b610f0c612631565b6001600160a01b0316610f1d6118d1565b6001600160a01b031614610f435760405162461bcd60e51b8152600401610a0990613ac8565b60005b81811015610ac1576000838383818110610f7057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f859190613062565b6001600160a01b03161415610fac5760405162461bcd60e51b8152600401610a0990613c80565b600060166000858585818110610fd257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fe79190613062565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061101981613f3a565b915050610f46565b60135481565b61102f612631565b6001600160a01b03166110406118d1565b6001600160a01b0316146110665760405162461bcd60e51b8152600401610a0990613ac8565b8051611079906014906020840190612f23565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610ef991906134da565b6110b1612631565b6001600160a01b03166110c26118d1565b6001600160a01b0316146110e85760405162461bcd60e51b8152600401610a0990613ac8565b600f55565b6110f5612631565b6001600160a01b03166111066118d1565b6001600160a01b03161461112c5760405162461bcd60e51b8152600401610a0990613ac8565b600e55565b600e5481565b6000818152600260205260408120546001600160a01b03168061092d5760405162461bcd60e51b8152600401610a09906138fd565b600f5481565b600081815260176020526040902080546060919061118f90613eff565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb90613eff565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b50505050509050919050565b61121c612631565b6001600160a01b031661122d6118d1565b6001600160a01b0316146112535760405162461bcd60e51b8152600401610a0990613ac8565b6015805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166112985760405162461bcd60e51b8152600401610a09906138b3565b506001600160a01b031660009081526003602052604090205490565b6112bc612631565b6001600160a01b03166112cd6118d1565b6001600160a01b0316146112f35760405162461bcd60e51b8152600401610a0990613ac8565b6112fd600061286f565b565b611307612631565b6001600160a01b03166113186118d1565b6001600160a01b03161461133e5760405162461bcd60e51b8152600401610a0990613ac8565b60005b81811015610ac157600083838381811061136b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113809190613062565b6001600160a01b031614156113a75760405162461bcd60e51b8152600401610a0990613c80565b6001601660008585858181106113cd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113e29190613062565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061141481613f3a565b915050611341565b601554610100900460ff1681565b611432612631565b6001600160a01b03166114436118d1565b6001600160a01b0316146114695760405162461bcd60e51b8152600401610a0990613ac8565b6002600b54141561148c5760405162461bcd60e51b8152600401610a0990613d8b565b6002600b5547806114af5760405162461bcd60e51b8152600401610a0990613a9b565b60006127106114c083610cb2613e9d565b6114ca9190613e89565b905060006127106114dd84610cb2613e9d565b6114e79190613e89565b905060006127106114fa856102bc613e9d565b6115049190613e89565b90506000612710611517866101f4613e9d565b6115219190613e89565b9050600061271061153487610708613e9d565b61153e9190613e89565b90506000612710611551886101f4613e9d565b61155b9190613e89565b9050600073b020365cab82927383db859a10129b67732546026001600160a01b03168760405161158a9061343e565b60006040518083038185875af1925050503d80600081146115c7576040519150601f19603f3d011682016040523d82523d6000602084013e6115cc565b606091505b50509050806115ed5760405162461bcd60e51b8152600401610a0990613d54565b6000738fa2f269b0ef3b8b9435ab5aaace4f92da9e8e156001600160a01b03168760405161161a9061343e565b60006040518083038185875af1925050503d8060008114611657576040519150601f19603f3d011682016040523d82523d6000602084013e61165c565b606091505b505090508061167d5760405162461bcd60e51b8152600401610a09906136b3565b600073981bb577a8cff6a18eb70e06adc958c60c651ff46001600160a01b0316876040516116aa9061343e565b60006040518083038185875af1925050503d80600081146116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b505090508061170d5760405162461bcd60e51b8152600401610a0990613c50565b60007387413b2deb63bb81cb712b75db02db594b8d19af6001600160a01b03168760405161173a9061343e565b60006040518083038185875af1925050503d8060008114611777576040519150601f19603f3d011682016040523d82523d6000602084013e61177c565b606091505b505090508061179d5760405162461bcd60e51b8152600401610a09906137e8565b6000737fd290d331a4245e70bb98924143703db9fb0a066001600160a01b0316876040516117ca9061343e565b60006040518083038185875af1925050503d8060008114611807576040519150601f19603f3d011682016040523d82523d6000602084013e61180c565b606091505b505090508061182d5760405162461bcd60e51b8152600401610a099061381f565b6000732a140d715fe3db1a083da7c796a315e07bef52ea6001600160a01b03168760405161185a9061343e565b60006040518083038185875af1925050503d8060008114611897576040519150601f19603f3d011682016040523d82523d6000602084013e61189c565b606091505b50509050806118bd5760405162461bcd60e51b8152600401610a0990613524565b50506001600b555050505050505050505050565b600a546001600160a01b031690565b60155460ff166119025760405162461bcd60e51b8152600401610a0990613c19565b600c548161190e610afa565b6119189190613e4c565b11156119365760405162461bcd60e51b8152600401610a0990613946565b6011548161194333611270565b61194d9190613e4c565b111561196b5760405162461bcd60e51b8152600401610a0990613df0565b3481600f5461197a9190613e9d565b146119975760405162461bcd60e51b8152600401610a09906139e9565b60005b818110156119cb5760006119ac610afa565b90506119b83382612855565b50806119c381613f3a565b91505061199a565b507f821f4584abe32331f65a93fcc9cc02b850db6e257e422af5ee486e6edb860fd73382604051610ef99291906134b6565b606060008290506000815167ffffffffffffffff811115611a2e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a58576020820181803683370190505b50905060005b8251811015611bba576041838281518110611a8957634e487b7160e01b600052603260045260246000fd5b016020015160f81c10801590611ac75750605a838281518110611abc57634e487b7160e01b600052603260045260246000fd5b016020015160f81c11155b15611b4557828181518110611aec57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b60f81c6020611b069190613e64565b60f81b828281518110611b2957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ba8565b828181518110611b6557634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b828281518110611b9057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053505b80611bb281613f3a565b915050611a5e565b509392505050565b60606001805461095f90613eff565b611bd9612631565b6001600160a01b0316611bea6118d1565b6001600160a01b031614611c105760405162461bcd60e51b8152600401610a0990613ac8565b601155565b600080829050600181511015611c2f576000915050610930565b601981511115611c43576000915050610930565b80600081518110611c6457634e487b7160e01b600052603260045260246000fd5b6020910101516001600160f81b031916600160fd1b1415611c89576000915050610930565b8060018251611c989190613ebc565b81518110611cb657634e487b7160e01b600052603260045260246000fd5b6020910101516001600160f81b031916600160fd1b1415611cdb576000915050610930565b600081600081518110611cfe57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916905060005b8251811015611e57576000838281518110611d3d57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319169050600160fd1b81148015611d6e5750600160fd1b6001600160f81b03198416145b15611d80576000945050505050610930565b600360fc1b6001600160f81b0319821610801590611dac5750603960f81b6001600160f81b0319821611155b158015611de25750604160f81b6001600160f81b0319821610801590611de05750602d60f91b6001600160f81b0319821611155b155b8015611e175750606160f81b6001600160f81b0319821610801590611e155750603d60f91b6001600160f81b0319821611155b155b8015611e315750600160fd1b6001600160f81b0319821614155b15611e43576000945050505050610930565b915080611e4f81613f3a565b915050611d12565b506001949350505050565b611e6a612631565b6001600160a01b0316826001600160a01b03161415611e9b5760405162461bcd60e51b8152600401610a0990613765565b8060056000611ea8612631565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611eec612631565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f2491906134cf565b60405180910390a35050565b600d5481565b600c5481565b611f44612631565b6001600160a01b0316611f556118d1565b6001600160a01b031614611f7b5760405162461bcd60e51b8152600401610a0990613ac8565b601580546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b611fb6611fb0612631565b836126a3565b611fd25760405162461bcd60e51b8152600401610a0990613cb7565b611fde848484846128c1565b50505050565b60155460ff1681565b611ff5612631565b6001600160a01b03166120066118d1565b6001600160a01b03161461202c5760405162461bcd60e51b8152600401610a0990613ac8565b600d55565b600061203c83611137565b9050806001600160a01b0316612050612631565b6001600160a01b0316146120765760405162461bcd60e51b8152600401610a0990613554565b61207f82611c15565b15156001146120a05760405162461bcd60e51b8152600401610a0990613dc2565b6000838152601760205260409081902090516002916120be91613374565b602060405180830381855afa1580156120db573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906120fe919061324c565b60028360405161210e9190613358565b602060405180830381855afa15801561212b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061214e919061324c565b141561216c5760405162461bcd60e51b8152600401610a0990613b95565b61217582610ac6565b156121925760405162461bcd60e51b8152600401610a0990613a20565b6015546013546040516323b872dd60e01b8152620100009092046001600160a01b0316916323b872dd916121cc9133913091600401613455565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221e9190613230565b506000838152601760205260408120805461223890613eff565b905011156122e357600083815260176020526040902080546122e3919061225e90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461228a90613eff565b80156122d75780601f106122ac576101008083540402835291602001916122d7565b820191906000526020600020905b8154815290600101906020018083116122ba57829003601f168201915b505050505060006128f4565b6122ee8260016128f4565b6000838152601760209081526040909120835161230d92850190612f23565b50601554601354604051630852cd8d60e31b8152620100009092046001600160a01b0316916342966c689161234491600401613e37565b602060405180830381600087803b15801561235e57600080fd5b505af1158015612372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123969190613230565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b836040516123c791906134da565b60405180910390a2505050565b60606123df82612614565b6123fb5760405162461bcd60e51b8152600401610a0990613b46565b6000612405612931565b905060008151116124255760405180602001604052806000815250612450565b8061242f84612940565b60405160200161244092919061340f565b6040516020818303038152906040525b9392505050565b60115481565b6014805461246a90613eff565b80601f016020809104026020016040519081016040528092919081815260200182805461249690613eff565b80156124e35780601f106124b8576101008083540402835291602001916124e3565b820191906000526020600020905b8154815290600101906020018083116124c657829003601f168201915b505050505081565b6124f3612631565b6001600160a01b03166125046118d1565b6001600160a01b03161461252a5760405162461bcd60e51b8152600401610a0990613ac8565b601355565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612565612631565b6001600160a01b03166125766118d1565b6001600160a01b03161461259c5760405162461bcd60e51b8152600401610a0990613ac8565b6001600160a01b0381166125c25760405162461bcd60e51b8152600401610a099061366d565b6125cb8161286f565b50565b60105481565b60006001600160e01b031982166380ac58cd60e01b148061260557506001600160e01b03198216635b5e139f60e01b145b8061092d575061092d82612a5b565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061266a82611137565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ae82612614565b6126ca5760405162461bcd60e51b8152600401610a099061379c565b60006126d583611137565b9050806001600160a01b0316846001600160a01b031614806127105750836001600160a01b0316612705846109e2565b6001600160a01b0316145b806127205750612720818561252f565b949350505050565b826001600160a01b031661273b82611137565b6001600160a01b0316146127615760405162461bcd60e51b8152600401610a0990613afd565b6001600160a01b0382166127875760405162461bcd60e51b8152600401610a0990613721565b612792838383612a74565b61279d600082612635565b6001600160a01b03831660009081526003602052604081208054600192906127c6908490613ebc565b90915550506001600160a01b03821660009081526003602052604081208054600192906127f4908490613e4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ce6828260405180602001604052806000815250612afd565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6128cc848484612728565b6128d884848484612b30565b611fde5760405162461bcd60e51b8152600401610a099061361b565b806018612900846119fd565b60405161290d9190613358565b908152604051908190036020019020805491151560ff199092169190911790555050565b60606014805461095f90613eff565b60608161296557506040805180820190915260018152600360fc1b6020820152610930565b8160005b811561298f578061297981613f3a565b91506129889050600a83613e89565b9150612969565b60008167ffffffffffffffff8111156129b857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129e2576020820181803683370190505b5090505b8415612720576129f7600183613ebc565b9150612a04600a86613f55565b612a0f906030613e4c565b60f81b818381518110612a3257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612a54600a86613e89565b94506129e6565b6001600160e01b031981166301ffc9a760e01b14919050565b612a7f838383610ac1565b6001600160a01b038316612a9b57612a9681612c40565b612abe565b816001600160a01b0316836001600160a01b031614612abe57612abe8382612c84565b6001600160a01b038216612ada57612ad581612d21565b610ac1565b826001600160a01b0316826001600160a01b031614610ac157610ac18282612dfa565b612b078383612e3e565b612b146000848484612b30565b610ac15760405162461bcd60e51b8152600401610a099061361b565b6000612b44846001600160a01b0316612f1d565b15611e5757836001600160a01b031663150b7a02612b60612631565b8786866040518563ffffffff1660e01b8152600401612b829493929190613479565b602060405180830381600087803b158015612b9c57600080fd5b505af1925050508015612bcc575060408051601f3d908101601f19168201909252612bc991810190613280565b60015b612c26573d808015612bfa576040519150601f19603f3d011682016040523d82523d6000602084013e612bff565b606091505b508051612c1e5760405162461bcd60e51b8152600401610a099061361b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612720565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612c9184611270565b612c9b9190613ebc565b600083815260076020526040902054909150808214612cee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d3390600190613ebc565b60008381526009602052604081205460088054939450909284908110612d6957634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612d9857634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dde57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e0583611270565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612e645760405162461bcd60e51b8152600401610a099061397d565b612e6d81612614565b15612e8a5760405162461bcd60e51b8152600401610a09906136ea565b612e9660008383612a74565b6001600160a01b0382166000908152600360205260408120805460019290612ebf908490613e4c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612f2f90613eff565b90600052602060002090601f016020900481019282612f515760008555612f97565b82601f10612f6a57805160ff1916838001178555612f97565b82800160010185558215612f97579182015b82811115612f97578251825591602001919060010190612f7c565b50612fa3929150612fa7565b5090565b5b80821115612fa35760008155600101612fa8565b600067ffffffffffffffff80841115612fd757612fd7613f95565b604051601f8501601f191681016020018281118282101715612ffb57612ffb613f95565b60405284815291508183850186101561301357600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461093057600080fd5b600082601f830112613053578081fd5b61245083833560208501612fbc565b600060208284031215613073578081fd5b6124508261302c565b6000806040838503121561308e578081fd5b6130978361302c565b91506130a56020840161302c565b90509250929050565b6000806000606084860312156130c2578081fd5b6130cb8461302c565b92506130d96020850161302c565b9150604084013590509250925092565b600080600080608085870312156130fe578081fd5b6131078561302c565b93506131156020860161302c565b925060408501359150606085013567ffffffffffffffff811115613137578182fd5b8501601f81018713613147578182fd5b61315687823560208401612fbc565b91505092959194509250565b60008060408385031215613174578182fd5b61317d8361302c565b9150602083013561318d81613fab565b809150509250929050565b600080604083850312156131aa578182fd5b6131b38361302c565b946020939093013593505050565b600080602083850312156131d3578182fd5b823567ffffffffffffffff808211156131ea578384fd5b818501915085601f8301126131fd578384fd5b81358181111561320b578485fd5b866020808302850101111561321e578485fd5b60209290920196919550909350505050565b600060208284031215613241578081fd5b815161245081613fab565b60006020828403121561325d578081fd5b5051919050565b600060208284031215613275578081fd5b813561245081613fb9565b600060208284031215613291578081fd5b815161245081613fb9565b6000602082840312156132ad578081fd5b813567ffffffffffffffff8111156132c3578182fd5b61272084828501613043565b6000602082840312156132e0578081fd5b5035919050565b600080604083850312156132f9578182fd5b82359150602083013567ffffffffffffffff811115613316578182fd5b61332285828601613043565b9150509250929050565b60008151808452613344816020860160208601613ed3565b601f01601f19169290920160200192915050565b6000825161336a818460208701613ed3565b9190910192915050565b815460009081906002810460018083168061339057607f831692505b60208084108214156133b057634e487b7160e01b87526022600452602487fd5b8180156133c457600181146133d557613401565b60ff19861689528489019650613401565b6133de8a613e40565b885b868110156133f95781548b8201529085019083016133e0565b505084890196505b509498975050505050505050565b60008351613421818460208801613ed3565b835190830190613435818360208801613ed3565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ac9083018461332c565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252612450602083018461332c565b60208082526017908201527f50726573616c6520686173206e6f742073746172746564000000000000000000604082015260600190565b6020808252601690820152752a3930b739b332b9103330b4b632b2103a37902232bb60511b604082015260600190565b6020808252601f908201527f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200604082015260600190565b60208082526025908201527f4d696e74696e6720776f756c6420657863656564206d61782050726573616c65604082015264204e46547360d81b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f5472616e73666572206661696c656420746f204d617468657700000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f5472616e73666572206661696c656420746f205365616e000000000000000000604082015260600190565b60208082526018908201527f5472616e73666572206661696c656420746f2041686d65640000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b60208082526015908201527413985b5948185b1c9958591e481c995cd95c9d9959605a1b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e737566666963656e742062616c616e636560681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f4e6577206e616d652069732073616d65206173207468652063757272656e74206040820152626f6e6560e81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601a908201527f46696e616c2073616c6520686173206e6f742073746172746564000000000000604082015260600190565b6020808252601690820152755472616e73666572206661696c656420746f2041756760501b604082015260600190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f5472616e73666572206661696c656420746f204d696b65000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601490820152734e6f7420612076616c6964206e6577206e616d6560601b604082015260600190565b60208082526027908201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604082015266081dd85b1b195d60ca1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115613e5f57613e5f613f69565b500190565b600060ff821660ff84168060ff03821115613e8157613e81613f69565b019392505050565b600082613e9857613e98613f7f565b500490565b6000816000190483118215151615613eb757613eb7613f69565b500290565b600082821015613ece57613ece613f69565b500390565b60005b83811015613eee578181015183820152602001613ed6565b83811115611fde5750506000910152565b600281046001821680613f1357607f821691505b60208210811415613f3457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f4e57613f4e613f69565b5060010190565b600082613f6457613f64613f7f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146125cb57600080fd5b6001600160e01b0319811681146125cb57600080fdfea264697066735822122064cc1ede69b8d0900609bc83737b500937d9bc8eaa6ebfce9e8e52df4819466a64736f6c63430008000033

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

000000000000000000000000fdf0415632cf53fdd877d39f020a7e4f7316b92f

-----Decoded View---------------
Arg [0] : utilityContract (address): 0xfDf0415632cF53FDd877D39f020A7E4f7316b92f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fdf0415632cf53fdd877d39f020a7e4f7316b92f


Deployed Bytecode Sourcemap

48677:10431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34646:224;;;;;;;;;;-1:-1:-1;34646:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49398:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49070:29::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21549:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23108:221::-;;;;;;;;;;-1:-1:-1;23108:221:0;;;;;:::i;:::-;;:::i;22631:411::-;;;;;;;;;;-1:-1:-1;22631:411:0;;;;;:::i;:::-;;:::i;:::-;;50339:137;;;;;;;;;;-1:-1:-1;50339:137:0;;;;;:::i;:::-;;:::i;35286:113::-;;;;;;;;;;;;;:::i;55335:106::-;;;;;;;;;;;;;:::i;23998:339::-;;;;;;;;;;-1:-1:-1;23998:339:0;;;;;:::i;:::-;;:::i;51058:114::-;;;;;;;;;;-1:-1:-1;51058:114:0;;;;;:::i;:::-;;:::i;54641:123::-;;;;;;;;;;-1:-1:-1;54641:123:0;;;;;:::i;:::-;;:::i;34954:256::-;;;;;;;;;;-1:-1:-1;34954:256:0;;;;;:::i;:::-;;:::i;51180:567::-;;;;;;;;;;-1:-1:-1;51180:567:0;;;;;:::i;:::-;;:::i;24408:185::-;;;;;;;;;;-1:-1:-1;24408:185:0;;;;;:::i;:::-;;:::i;35476:233::-;;;;;;;;;;-1:-1:-1;35476:233:0;;;;;:::i;:::-;;:::i;51759:874::-;;;;;;:::i;:::-;;:::i;50768:282::-;;;;;;;;;;-1:-1:-1;50768:282:0;;;;;:::i;:::-;;:::i;49198:51::-;;;;;;;;;;;;;:::i;54493:140::-;;;;;;;;;;-1:-1:-1;54493:140:0;;;;;:::i;:::-;;:::i;54887:96::-;;;;;;;;;;-1:-1:-1;54887:96:0;;;;;:::i;:::-;;:::i;54991:104::-;;;;;;;;;;-1:-1:-1;54991:104:0;;;;;:::i;:::-;;:::i;48878:42::-;;;;;;;;;;;;;:::i;21243:239::-;;;;;;;;;;-1:-1:-1;21243:239:0;;;;;:::i;:::-;;:::i;48929:37::-;;;;;;;;;;;;;:::i;50141:120::-;;;;;;;;;;-1:-1:-1;50141:120:0;;;;;:::i;:::-;;:::i;55449:97::-;;;;;;;;;;;;;:::i;20973:208::-;;;;;;;;;;-1:-1:-1;20973:208:0;;;;;:::i;:::-;;:::i;42443:94::-;;;;;;;;;;;;;:::i;50484:276::-;;;;;;;;;;-1:-1:-1;50484:276:0;;;;;:::i;:::-;;:::i;49329:25::-;;;;;;;;;;;;;:::i;55809:1422::-;;;;;;;;;;;;;:::i;41792:87::-;;;;;;;;;;;;;:::i;52641:649::-;;;;;;:::i;:::-;;:::i;58597:506::-;;;;;;;;;;-1:-1:-1;58597:506:0;;;;;:::i;:::-;;:::i;21718:104::-;;;;;;;;;;;;;:::i;54772:107::-;;;;;;;;;;-1:-1:-1;54772:107:0;;;;;:::i;:::-;;:::i;57607:918::-;;;;;;;;;;-1:-1:-1;57607:918:0;;;;;:::i;:::-;;:::i;23401:295::-;;;;;;;;;;-1:-1:-1;23401:295:0;;;;;:::i;:::-;;:::i;48796:33::-;;;;;;;;;;;;;:::i;48753:36::-;;;;;;;;;;;;;:::i;55554:126::-;;;;;;;;;;-1:-1:-1;55554:126:0;;;;;:::i;:::-;;:::i;24664:328::-;;;;;;;;;;-1:-1:-1;24664:328:0;;;;;:::i;:::-;;:::i;49293:28::-;;;;;;;;;;;;;:::i;55103:104::-;;;;;;;;;;-1:-1:-1;55103:104:0;;;;;:::i;:::-;;:::i;53370:923::-;;;;;;;;;;-1:-1:-1;53370:923:0;;;;;:::i;:::-;;:::i;21893:334::-;;;;;;;;;;-1:-1:-1;21893:334:0;;;;;:::i;:::-;;:::i;49027:34::-;;;;;;;;;;;;;:::i;49258:26::-;;;;;;;;;;;;;:::i;55215:112::-;;;;;;;;;;-1:-1:-1;55215:112:0;;;;;:::i;:::-;;:::i;23767:164::-;;;;;;;;;;-1:-1:-1;23767:164:0;;;;;:::i;:::-;;:::i;42692:192::-;;;;;;;;;;-1:-1:-1;42692:192:0;;;;;:::i;:::-;;:::i;48973:41::-;;;;;;;;;;;;;:::i;34646:224::-;34748:4;-1:-1:-1;;;;;;34772:50:0;;-1:-1:-1;;;34772:50:0;;:90;;;34826:36;34850:11;34826:23;:36::i;:::-;34765:97;;34646:224;;;;:::o;49398:31::-;;;;;;-1:-1:-1;;;;;49398:31:0;;:::o;49070:29::-;;;;:::o;21549:100::-;21603:13;21636:5;21629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:100;:::o;23108:221::-;23184:7;23212:16;23220:7;23212;:16::i;:::-;23204:73;;;;-1:-1:-1;;;23204:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23297:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23297:24:0;;23108:221::o;22631:411::-;22712:13;22728:23;22743:7;22728:14;:23::i;:::-;22712:39;;22776:5;-1:-1:-1;;;;;22770:11:0;:2;-1:-1:-1;;;;;22770:11:0;;;22762:57;;;;-1:-1:-1;;;22762:57:0;;;;;;;:::i;:::-;22870:5;-1:-1:-1;;;;;22854:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22854:21:0;;:62;;;;22879:37;22896:5;22903:12;:10;:12::i;22879:37::-;22832:168;;;;-1:-1:-1;;;22832:168:0;;;;;;;:::i;:::-;23013:21;23022:2;23026:7;23013:8;:21::i;:::-;22631:411;;;:::o;50339:137::-;50410:4;50434:13;50448:19;50456:10;50448:7;:19::i;:::-;50434:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;50339:137:0;;;:::o;35286:113::-;35374:10;:17;35286:113;:::o;55335:106::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55417:16:::1;::::0;;-1:-1:-1;;55397:36:0;::::1;55417:16;::::0;;::::1;55416:17;55397:36;::::0;;55335:106::o;23998:339::-;24193:41;24212:12;:10;:12::i;:::-;24226:7;24193:18;:41::i;:::-;24185:103;;;;-1:-1:-1;;;24185:103:0;;;;;;;:::i;:::-;24301:28;24311:4;24317:2;24321:7;24301:9;:28::i;51058:114::-;-1:-1:-1;;;;;51147:17:0;51123:4;51147:17;;;:11;:17;;;;;;;;;51058:114::o;54641:123::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;54724:22:::1;:32:::0;54641:123::o;34954:256::-;35051:7;35087:23;35104:5;35087:16;:23::i;:::-;35079:5;:31;35071:87;;;;-1:-1:-1;;;35071:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;35176:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34954:256::o;51180:567::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;51407:14:::1;;51391:12;51375:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;51367:90;;;;-1:-1:-1::0;;;51367:90:0::1;;;;;;;:::i;:::-;51473:6;51468:272;51489:12;51485:1;:16;51468:272;;;51523:11;51537:13;:11;:13::i;:::-;51523:27;;51681:29;51691:10;51703:6;51681:9;:29::i;:::-;-1:-1:-1::0;51503:3:0;::::1;::::0;::::1;:::i;:::-;;;;51468:272;;;;51180:567:::0;:::o;24408:185::-;24546:39;24563:4;24569:2;24573:7;24546:39;;;;;;;;;;;;:16;:39::i;35476:233::-;35551:7;35587:30;:28;:30::i;:::-;35579:5;:38;35571:95;;;;-1:-1:-1;;;35571:95:0;;;;;;;:::i;:::-;35684:10;35695:5;35684:17;;;;;;-1:-1:-1;;;35684:17:0;;;;;;;;;;;;;;;;;35677:24;;35476:233;;;:::o;51759:874::-;51838:13;;;;;;;51830:49;;;;-1:-1:-1;;;51830:49:0;;;;;;;:::i;:::-;51910:10;51898:23;;;;:11;:23;;;;;;;;51890:59;;;;-1:-1:-1;;;51890:59:0;;;;;;;:::i;:::-;52001:11;;51985:12;51968:14;;:29;;;;:::i;:::-;:44;;51960:94;;;;-1:-1:-1;;;51960:94:0;;;;;;;:::i;:::-;52105:14;;52089:12;52073:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;52065:90;;;;-1:-1:-1;;;52065:90:0;;;;;;;:::i;:::-;52214:22;;52198:12;52174:21;52184:10;52174:9;:21::i;:::-;:36;;;;:::i;:::-;:62;;52166:114;;;;-1:-1:-1;;;52166:114:0;;;;;;;:::i;:::-;52331:9;52315:12;52299:13;;:28;;;;:::i;:::-;:41;52291:77;;;;-1:-1:-1;;;52291:77:0;;;;;;;:::i;:::-;52386:9;52381:182;52405:12;52401:1;:16;52381:182;;;52439:15;52457:13;:11;:13::i;:::-;52439:31;;52505:1;52487:14;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;52521:30:0;;-1:-1:-1;52531:10:0;52543:7;52521:9;:30::i;:::-;-1:-1:-1;52419:3:0;;;;:::i;:::-;;;;52381:182;;;;52588:37;52600:10;52612:12;52588:37;;;;;;;:::i;:::-;;;;;;;;51759:874;:::o;50768:282::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;50862:9:::1;50857:186;50877:20:::0;;::::1;50857:186;;;50951:1;50927:9:::0;;50937:1;50927:12;;::::1;;;-1:-1:-1::0;;;50927:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50927:26:0::1;;;50919:62;;;;-1:-1:-1::0;;;50919:62:0::1;;;;;;;:::i;:::-;51026:5;50998:11;:25;51010:9;;51020:1;51010:12;;;;;-1:-1:-1::0;;;51010:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50998:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50998:25:0;:33;;-1:-1:-1;;50998:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50899:3;::::1;::::0;::::1;:::i;:::-;;;;50857:186;;49198:51:::0;;;;:::o;54493:140::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;54564:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54602:23;54617:7;54602:23;;;;;;:::i;54887:96::-:0;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;54956:9:::1;:19:::0;54887:96::o;54991:104::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55064:13:::1;:23:::0;54991:104::o;48878:42::-;;;;:::o;21243:239::-;21315:7;21351:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21351:16:0;21386:19;21378:73;;;;-1:-1:-1;;;21378:73:0;;;;;;;:::i;48929:37::-;;;;:::o;50141:120::-;50236:17;;;;:10;:17;;;;;50229:24;;50203:13;;50236:17;50229:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50141:120;;;:::o;55449:97::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55525:13:::1;::::0;;-1:-1:-1;;55508:30:0;::::1;55525:13;::::0;;;::::1;;;55524:14;55508:30:::0;;::::1;;::::0;;55449:97::o;20973:208::-;21045:7;-1:-1:-1;;;;;21073:19:0;;21065:74;;;;-1:-1:-1;;;21065:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21157:16:0;;;;;:9;:16;;;;;;;20973:208::o;42443:94::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;42508:21:::1;42526:1;42508:9;:21::i;:::-;42443:94::o:0;50484:276::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;50573:9:::1;50568:185;50588:20:::0;;::::1;50568:185;;;50662:1;50638:9:::0;;50648:1;50638:12;;::::1;;;-1:-1:-1::0;;;50638:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50638:26:0::1;;;50630:62;;;;-1:-1:-1::0;;;50630:62:0::1;;;;;;;:::i;:::-;50737:4;50709:11;:25;50721:9;;50731:1;50721:12;;;;;-1:-1:-1::0;;;50721:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50709:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50709:25:0;:32;;-1:-1:-1;;50709:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50610:3;::::1;::::0;::::1;:::i;:::-;;;;50568:185;;49329:25:::0;;;;;;;;;:::o;55809:1422::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;47550:1:::1;48148:7;;:19;;48140:63;;;;-1:-1:-1::0;;;48140:63:0::1;;;;;;;:::i;:::-;47550:1;48281:7;:18:::0;55891:21:::2;55931:11:::0;55923:43:::2;;;;-1:-1:-1::0;;;55923:43:0::2;;;;;;;:::i;:::-;55977:12;56010:5;55993:14;:7:::0;56003:4:::2;55993:14;:::i;:::-;55992:23;;;;:::i;:::-;55977:38:::0;-1:-1:-1;56027:14:0::2;56062:5;56045:14;:7:::0;56055:4:::2;56045:14;:::i;:::-;56044:23;;;;:::i;:::-;56027:40:::0;-1:-1:-1;56079:11:0::2;56110:5;56094:13;:7:::0;56104:3:::2;56094:13;:::i;:::-;56093:22;;;;:::i;:::-;56079:36:::0;-1:-1:-1;56127:12:0::2;56159:5;56143:13;:7:::0;56153:3:::2;56143:13;:::i;:::-;56142:22;;;;:::i;:::-;56127:37:::0;-1:-1:-1;56176:13:0::2;56210:5;56193:14;:7:::0;56203:4:::2;56193:14;:::i;:::-;56192:23;;;;:::i;:::-;56176:39:::0;-1:-1:-1;56227:11:0::2;56259:5;56242:13;:7:::0;56252:3:::2;56242:13;:::i;:::-;56241:23;;;;:::i;:::-;56227:37;;56278:12;56304:42;-1:-1:-1::0;;;;;56296:56:0::2;56360:4;56296:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56277:92;;;56388:7;56380:43;;;;-1:-1:-1::0;;;56380:43:0::2;;;;;;;:::i;:::-;56435:13;56462:42;-1:-1:-1::0;;;;;56454:56:0::2;56518:6;56454:75;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56434:95;;;56548:8;56540:46;;;;-1:-1:-1::0;;;56540:46:0::2;;;;;;;:::i;:::-;56598:13;56625:42;-1:-1:-1::0;;;;;56617:56:0::2;56681:3;56617:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56597:92;;;56708:8;56700:43;;;;-1:-1:-1::0;;;56700:43:0::2;;;;;;;:::i;:::-;56755:13;56782:42;-1:-1:-1::0;;;;;56774:56:0::2;56838:4;56774:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56754:93;;;56866:8;56858:44;;;;-1:-1:-1::0;;;56858:44:0::2;;;;;;;:::i;:::-;56914:13;56941:42;-1:-1:-1::0;;;;;56933:56:0::2;56997:5;56933:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56913:94;;;57026:8;57018:45;;;;-1:-1:-1::0;;;57018:45:0::2;;;;;;;:::i;:::-;57076:13;57103:42;-1:-1:-1::0;;;;;57095:56:0::2;57159:3;57095:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57075:92;;;57186:8;57178:43;;;;-1:-1:-1::0;;;57178:43:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;47506:1:0::1;48460:7;:22:::0;-1:-1:-1;;;;;;;;;;;55809:1422:0:o;41792:87::-;41865:6;;-1:-1:-1;;;;;41865:6:0;41792:87;:::o;52641:649::-;52716:16;;;;52708:55;;;;-1:-1:-1;;;52708:55:0;;;;;;;:::i;:::-;52814:14;;52798:12;52782:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;52774:90;;;;-1:-1:-1;;;52774:90:0;;;;;;;:::i;:::-;52923:14;;52907:12;52883:21;52893:10;52883:9;:21::i;:::-;:36;;;;:::i;:::-;:54;;52875:106;;;;-1:-1:-1;;;52875:106:0;;;;;;;:::i;:::-;53028:9;53012:12;53000:9;;:24;;;;:::i;:::-;:37;52992:73;;;;-1:-1:-1;;;52992:73:0;;;;;;;:::i;:::-;53083:9;53078:148;53102:12;53098:1;:16;53078:148;;;53136:15;53154:13;:11;:13::i;:::-;53136:31;;53184:30;53194:10;53206:7;53184:9;:30::i;:::-;-1:-1:-1;53116:3:0;;;;:::i;:::-;;;;53078:148;;;;53243:39;53257:10;53269:12;53243:39;;;;;;;:::i;58597:506::-;58654:13;58679:17;58705:3;58679:30;;58720:19;58752:4;:11;58742:22;;;;;;-1:-1:-1;;;58742:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58742:22:0;;58720:44;;58780:6;58775:289;58796:4;:11;58792:1;:15;58775:289;;;58888:2;58876:4;58881:1;58876:7;;;;;;-1:-1:-1;;;58876:7:0;;;;;;;;;;;;;;;58870:20;;;;58869:48;;;58914:2;58902:4;58907:1;58902:7;;;;;;-1:-1:-1;;;58902:7:0;;;;;;;;;;;;;;;58896:20;;58869:48;58865:188;;;58963:4;58968:1;58963:7;;;;;;-1:-1:-1;;;58963:7:0;;;;;;;;;;;;;;;;;58957:14;;58974:2;58957:19;;;;:::i;:::-;58950:27;;58938:6;58945:1;58938:9;;;;;;-1:-1:-1;;;58938:9:0;;;;;;;;;;;;:39;-1:-1:-1;;;;;58938:39:0;;;;;;;;;58865:188;;;59030:4;59035:1;59030:7;;;;;;-1:-1:-1;;;59030:7:0;;;;;;;;;;;;;;;;;59018:6;59025:1;59018:9;;;;;;-1:-1:-1;;;59018:9:0;;;;;;;;;;;;:19;-1:-1:-1;;;;;59018:19:0;;;;;;;;;58865:188;58809:3;;;;:::i;:::-;;;;58775:289;;;-1:-1:-1;59088:6:0;58597:506;-1:-1:-1;;;58597:506:0:o;21718:104::-;21774:13;21807:7;21800:14;;;;;:::i;54772:107::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;54847:14:::1;:24:::0;54772:107::o;57607:918::-;57669:4;57685:14;57708:3;57685:27;;57737:1;57726;:8;:12;57723:29;;;57747:5;57740:12;;;;;57723:29;57777:2;57766:1;:8;:13;57763:30;;;57788:5;57781:12;;;;;57763:30;57846:1;57848;57846:4;;;;;;-1:-1:-1;;;57846:4:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;57846:4:0;-1:-1:-1;;;57846:12:0;57843:29;;;57867:5;57860:12;;;;;57843:29;57904:1;57917;57906;:8;:12;;;;:::i;:::-;57904:15;;;;;;-1:-1:-1;;;57904:15:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;57904:15:0;-1:-1:-1;;;57904:23:0;57900:41;;;57936:5;57929:12;;;;;57900:41;57972:15;57990:1;57992;57990:4;;;;;;-1:-1:-1;;;57990:4:0;;;;;;;;;;;;;-1:-1:-1;;;;;;57990:4:0;;-1:-1:-1;58011:6:0;58007:487;58021:1;:8;58019:1;:10;58007:487;;;58050:11;58064:1;58066;58064:4;;;;;;-1:-1:-1;;;58064:4:0;;;;;;;;;;;;;-1:-1:-1;;;;;;58064:4:0;;-1:-1:-1;;;;58089:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;58105:16:0;;;58089:32;58085:50;;;58130:5;58123:12;;;;;;;;58085:50;-1:-1:-1;;;;;;;;;58210:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58226:12:0;;;;58210:28;58208:31;:89;;;;-1:-1:-1;;;;;;;;;;58268:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58284:12:0;;;;58268:28;58266:31;58208:89;:147;;;;-1:-1:-1;;;;;;;;;;58326:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58342:12:0;;;;58326:28;58324:31;58208:147;:189;;;;-1:-1:-1;;;;;;;;;;58384:12:0;;;58382:15;58208:189;58187:263;;;58445:5;58438:12;;;;;;;;58187:263;58478:4;-1:-1:-1;58031:3:0;;;;:::i;:::-;;;;58007:487;;;-1:-1:-1;58513:4:0;;57607:918;-1:-1:-1;;;;57607:918:0:o;23401:295::-;23516:12;:10;:12::i;:::-;-1:-1:-1;;;;;23504:24:0;:8;-1:-1:-1;;;;;23504:24:0;;;23496:62;;;;-1:-1:-1;;;23496:62:0;;;;;;;:::i;:::-;23616:8;23571:18;:32;23590:12;:10;:12::i;:::-;-1:-1:-1;;;;;23571:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23571:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23571:53:0;;;;;;;;;;;23655:12;:10;:12::i;:::-;-1:-1:-1;;;;;23640:48:0;;23679:8;23640:48;;;;;;:::i;:::-;;;;;;;;23401:295;;:::o;48796:33::-;;;;:::o;48753:36::-;;;;:::o;55554:126::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55638:16:::1;:34:::0;;-1:-1:-1;;;;;55638:34:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55638:34:0;;::::1;::::0;;;::::1;::::0;;55554:126::o;24664:328::-;24839:41;24858:12;:10;:12::i;:::-;24872:7;24839:18;:41::i;:::-;24831:103;;;;-1:-1:-1;;;24831:103:0;;;;;;;:::i;:::-;24945:39;24959:4;24965:2;24969:7;24978:5;24945:13;:39::i;:::-;24664:328;;;;:::o;49293:28::-;;;;;;:::o;55103:104::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55178:11:::1;:21:::0;55103:104::o;53370:923::-;53450:13;53466:16;53474:7;53466;:16::i;:::-;53450:32;;53519:5;-1:-1:-1;;;;;53503:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;53503:21:0;;53495:65;;;;-1:-1:-1;;;53495:65:0;;;;;;;:::i;:::-;53579:21;53592:7;53579:12;:21::i;:::-;:29;;53604:4;53579:29;53571:62;;;;-1:-1:-1;;;53571:62:0;;;;;;;:::i;:::-;53691:19;;;;:10;:19;;;;;;;53678:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53652:22;53665:7;53652:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;53644:108;;;;-1:-1:-1;;;53644:108:0;;;;;;;:::i;:::-;53771:23;53786:7;53771:14;:23::i;:::-;:32;53763:66;;;;-1:-1:-1;;;53763:66:0;;;;;;;:::i;:::-;53849:16;;53907:17;;53842:83;;-1:-1:-1;;;53842:83:0;;53849:16;;;;-1:-1:-1;;;;;53849:16:0;;53842:37;;:83;;53880:10;;53900:4;;53842:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54025:1:0;53995:19;;;:10;:19;;;;;53989:33;;;;;:::i;:::-;;;:37;53985:115;;;54061:19;;;;:10;:19;;;;;54043:45;;;;54061:19;54043:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54082:5;54043:17;:45::i;:::-;54110:32;54128:7;54137:4;54110:17;:32::i;:::-;54153:19;;;;:10;:19;;;;;;;;:29;;;;;;;;:::i;:::-;-1:-1:-1;54200:16:0;;54223:17;;54193:48;;-1:-1:-1;;;54193:48:0;;54200:16;;;;-1:-1:-1;;;;;54200:16:0;;54193:29;;:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54268:7;54257:28;54277:7;54257:28;;;;;;:::i;:::-;;;;;;;;53370:923;;;:::o;21893:334::-;21966:13;22000:16;22008:7;22000;:16::i;:::-;21992:76;;;;-1:-1:-1;;;21992:76:0;;;;;;;:::i;:::-;22081:21;22105:10;:8;:10::i;:::-;22081:34;;22157:1;22139:7;22133:21;:25;:86;;;;;;;;;;;;;;;;;22185:7;22194:18;:7;:16;:18::i;:::-;22168:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22133:86;22126:93;21893:334;-1:-1:-1;;;21893:334:0:o;49027:34::-;;;;:::o;49258:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55215:112::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;55292:17:::1;:27:::0;55215:112::o;23767:164::-;-1:-1:-1;;;;;23888:25:0;;;23864:4;23888:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23767:164::o;42692:192::-;42023:12;:10;:12::i;:::-;-1:-1:-1;;;;;42012:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42012:23:0;;42004:68;;;;-1:-1:-1;;;42004:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42781:22:0;::::1;42773:73;;;;-1:-1:-1::0;;;42773:73:0::1;;;;;;;:::i;:::-;42857:19;42867:8;42857:9;:19::i;:::-;42692:192:::0;:::o;48973:41::-;;;;:::o;20604:305::-;20706:4;-1:-1:-1;;;;;;20743:40:0;;-1:-1:-1;;;20743:40:0;;:105;;-1:-1:-1;;;;;;;20800:48:0;;-1:-1:-1;;;20800:48:0;20743:105;:158;;;;20865:36;20889:11;20865:23;:36::i;26502:127::-;26567:4;26591:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26591:16:0;:30;;;26502:127::o;16036:98::-;16116:10;16036:98;:::o;30484:174::-;30559:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30559:29:0;-1:-1:-1;;;;;30559:29:0;;;;;;;;:24;;30613:23;30559:24;30613:14;:23::i;:::-;-1:-1:-1;;;;;30604:46:0;;;;;;;;;;;30484:174;;:::o;26796:348::-;26889:4;26914:16;26922:7;26914;:16::i;:::-;26906:73;;;;-1:-1:-1;;;26906:73:0;;;;;;;:::i;:::-;26990:13;27006:23;27021:7;27006:14;:23::i;:::-;26990:39;;27059:5;-1:-1:-1;;;;;27048:16:0;:7;-1:-1:-1;;;;;27048:16:0;;:51;;;;27092:7;-1:-1:-1;;;;;27068:31:0;:20;27080:7;27068:11;:20::i;:::-;-1:-1:-1;;;;;27068:31:0;;27048:51;:87;;;;27103:32;27120:5;27127:7;27103:16;:32::i;:::-;27040:96;26796:348;-1:-1:-1;;;;26796:348:0:o;29788:578::-;29947:4;-1:-1:-1;;;;;29920:31:0;:23;29935:7;29920:14;:23::i;:::-;-1:-1:-1;;;;;29920:31:0;;29912:85;;;;-1:-1:-1;;;29912:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30016:16:0;;30008:65;;;;-1:-1:-1;;;30008:65:0;;;;;;;:::i;:::-;30086:39;30107:4;30113:2;30117:7;30086:20;:39::i;:::-;30190:29;30207:1;30211:7;30190:8;:29::i;:::-;-1:-1:-1;;;;;30232:15:0;;;;;;:9;:15;;;;;:20;;30251:1;;30232:15;:20;;30251:1;;30232:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30263:13:0;;;;;;:9;:13;;;;;:18;;30280:1;;30263:13;:18;;30280:1;;30263:18;:::i;:::-;;;;-1:-1:-1;;30292:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30292:21:0;-1:-1:-1;;;;;30292:21:0;;;;;;;;;30331:27;;30292:16;;30331:27;;;;;;;29788:578;;;:::o;27486:110::-;27562:26;27572:2;27576:7;27562:26;;;;;;;;;;;;:9;:26::i;42892:173::-;42967:6;;;-1:-1:-1;;;;;42984:17:0;;;-1:-1:-1;;;;;;42984:17:0;;;;;;;43017:40;;42967:6;;;42984:17;42967:6;;43017:40;;42948:16;;43017:40;42892:173;;:::o;25874:315::-;26031:28;26041:4;26047:2;26051:7;26031:9;:28::i;:::-;26078:48;26101:4;26107:2;26111:7;26120:5;26078:22;:48::i;:::-;26070:111;;;;-1:-1:-1;;;26070:111:0;;;;;;;:::i;57345:129::-;57457:9;57427:13;57441:12;57449:3;57441:7;:12::i;:::-;57427:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;-1:-1:-1;;57427:39:0;;;;;;;;;-1:-1:-1;;57345:129:0:o;55688:113::-;55748:13;55781:12;55774:19;;;;;:::i;16563:723::-;16619:13;16840:10;16836:53;;-1:-1:-1;16867:10:0;;;;;;;;;;;;-1:-1:-1;;;16867:10:0;;;;;;16836:53;16914:5;16899:12;16955:78;16962:9;;16955:78;;16988:8;;;;:::i;:::-;;-1:-1:-1;17011:10:0;;-1:-1:-1;17019:2:0;17011:10;;:::i;:::-;;;16955:78;;;17043:19;17075:6;17065:17;;;;;;-1:-1:-1;;;17065:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17065:17:0;;17043:39;;17093:154;17100:10;;17093:154;;17127:11;17137:1;17127:11;;:::i;:::-;;-1:-1:-1;17196:10:0;17204:2;17196:5;:10;:::i;:::-;17183:24;;:2;:24;:::i;:::-;17170:39;;17153:6;17160;17153:14;;;;;;-1:-1:-1;;;17153:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17153:56:0;;;;;;;;-1:-1:-1;17224:11:0;17233:2;17224:11;;:::i;:::-;;;17093:154;;19120:157;-1:-1:-1;;;;;;19229:40:0;;-1:-1:-1;;;19229:40:0;19120:157;;;:::o;36322:589::-;36466:45;36493:4;36499:2;36503:7;36466:26;:45::i;:::-;-1:-1:-1;;;;;36528:18:0;;36524:187;;36563:40;36595:7;36563:31;:40::i;:::-;36524:187;;;36633:2;-1:-1:-1;;;;;36625:10:0;:4;-1:-1:-1;;;;;36625:10:0;;36621:90;;36652:47;36685:4;36691:7;36652:32;:47::i;:::-;-1:-1:-1;;;;;36725:16:0;;36721:183;;36758:45;36795:7;36758:36;:45::i;:::-;36721:183;;;36831:4;-1:-1:-1;;;;;36825:10:0;:2;-1:-1:-1;;;;;36825:10:0;;36821:83;;36852:40;36880:2;36884:7;36852:27;:40::i;27823:321::-;27953:18;27959:2;27963:7;27953:5;:18::i;:::-;28004:54;28035:1;28039:2;28043:7;28052:5;28004:22;:54::i;:::-;27982:154;;;;-1:-1:-1;;;27982:154:0;;;;;;;:::i;31223:799::-;31378:4;31399:15;:2;-1:-1:-1;;;;;31399:13:0;;:15::i;:::-;31395:620;;;31451:2;-1:-1:-1;;;;;31435:36:0;;31472:12;:10;:12::i;:::-;31486:4;31492:7;31501:5;31435:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31435:72:0;;;;;;;;-1:-1:-1;;31435:72:0;;;;;;;;;;;;:::i;:::-;;;31431:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31677:13:0;;31673:272;;31720:60;;-1:-1:-1;;;31720:60:0;;;;;;;:::i;31673:272::-;31895:6;31889:13;31880:6;31876:2;31872:15;31865:38;31431:529;-1:-1:-1;;;;;;31558:51:0;-1:-1:-1;;;31558:51:0;;-1:-1:-1;31551:58:0;;37634:164;37738:10;:17;;37711:24;;;;:15;:24;;;;;:44;;;37766:24;;;;;;;;;;;;37634:164::o;38425:988::-;38691:22;38741:1;38716:22;38733:4;38716:16;:22::i;:::-;:26;;;;:::i;:::-;38753:18;38774:26;;;:17;:26;;;;;;38691:51;;-1:-1:-1;38907:28:0;;;38903:328;;-1:-1:-1;;;;;38974:18:0;;38952:19;38974:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39025:30;;;;;;:44;;;39142:30;;:17;:30;;;;;:43;;;38903:328;-1:-1:-1;39327:26:0;;;;:17;:26;;;;;;;;39320:33;;;-1:-1:-1;;;;;39371:18:0;;;;;:12;:18;;;;;:34;;;;;;;39364:41;38425:988::o;39708:1079::-;39986:10;:17;39961:22;;39986:21;;40006:1;;39986:21;:::i;:::-;40018:18;40039:24;;;:15;:24;;;;;;40412:10;:26;;39961:46;;-1:-1:-1;40039:24:0;;39961:46;;40412:26;;;;-1:-1:-1;;;40412:26:0;;;;;;;;;;;;;;;;;40390:48;;40476:11;40451:10;40462;40451:22;;;;;;-1:-1:-1;;;40451:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40556:28;;;:15;:28;;;;;;;:41;;;40728:24;;;;;40721:31;40763:10;:16;;;;;-1:-1:-1;;;40763:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39708:1079;;;;:::o;37212:221::-;37297:14;37314:20;37331:2;37314:16;:20::i;:::-;-1:-1:-1;;;;;37345:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37390:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37212:221:0:o;28480:382::-;-1:-1:-1;;;;;28560:16:0;;28552:61;;;;-1:-1:-1;;;28552:61:0;;;;;;;:::i;:::-;28633:16;28641:7;28633;:16::i;:::-;28632:17;28624:58;;;;-1:-1:-1;;;28624:58:0;;;;;;;:::i;:::-;28695:45;28724:1;28728:2;28732:7;28695:20;:45::i;:::-;-1:-1:-1;;;;;28753:13:0;;;;;;:9;:13;;;;;:18;;28770:1;;28753:13;:18;;28770:1;;28753:18;:::i;:::-;;;;-1:-1:-1;;28782:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28782:21:0;-1:-1:-1;;;;;28782:21:0;;;;;;;;28821:33;;28782:16;;;28821:33;;28782:16;;28821:33;28480:382;;:::o;8078:387::-;8401:20;8449:8;;;8078:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:233;;904:3;897:4;889:6;885:17;881:27;871:2;;926:5;919;912:20;871:2;952:81;1029:3;1020:6;1007:20;1000:4;992:6;988:17;952:81;:::i;1044:198::-;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1205:31;1226:9;1205:31;:::i;1247:274::-;;;1376:2;1364:9;1355:7;1351:23;1347:32;1344:2;;;1397:6;1389;1382:22;1344:2;1425:31;1446:9;1425:31;:::i;:::-;1415:41;;1475:40;1511:2;1500:9;1496:18;1475:40;:::i;:::-;1465:50;;1334:187;;;;;:::o;1526:342::-;;;;1672:2;1660:9;1651:7;1647:23;1643:32;1640:2;;;1693:6;1685;1678:22;1640:2;1721:31;1742:9;1721:31;:::i;:::-;1711:41;;1771:40;1807:2;1796:9;1792:18;1771:40;:::i;:::-;1761:50;;1858:2;1847:9;1843:18;1830:32;1820:42;;1630:238;;;;;:::o;1873:702::-;;;;;2045:3;2033:9;2024:7;2020:23;2016:33;2013:2;;;2067:6;2059;2052:22;2013:2;2095:31;2116:9;2095:31;:::i;:::-;2085:41;;2145:40;2181:2;2170:9;2166:18;2145:40;:::i;:::-;2135:50;;2232:2;2221:9;2217:18;2204:32;2194:42;;2287:2;2276:9;2272:18;2259:32;2314:18;2306:6;2303:30;2300:2;;;2351:6;2343;2336:22;2300:2;2379:22;;2432:4;2424:13;;2420:27;-1:-1:-1;2410:2:1;;2466:6;2458;2451:22;2410:2;2494:75;2561:7;2556:2;2543:16;2538:2;2534;2530:11;2494:75;:::i;:::-;2484:85;;;2003:572;;;;;;;:::o;2580:329::-;;;2706:2;2694:9;2685:7;2681:23;2677:32;2674:2;;;2727:6;2719;2712:22;2674:2;2755:31;2776:9;2755:31;:::i;:::-;2745:41;;2836:2;2825:9;2821:18;2808:32;2849:30;2873:5;2849:30;:::i;:::-;2898:5;2888:15;;;2664:245;;;;;:::o;2914:266::-;;;3043:2;3031:9;3022:7;3018:23;3014:32;3011:2;;;3064:6;3056;3049:22;3011:2;3092:31;3113:9;3092:31;:::i;:::-;3082:41;3170:2;3155:18;;;;3142:32;;-1:-1:-1;;;3001:179:1:o;3185:666::-;;;3332:2;3320:9;3311:7;3307:23;3303:32;3300:2;;;3353:6;3345;3338:22;3300:2;3398:9;3385:23;3427:18;3468:2;3460:6;3457:14;3454:2;;;3489:6;3481;3474:22;3454:2;3532:6;3521:9;3517:22;3507:32;;3577:7;3570:4;3566:2;3562:13;3558:27;3548:2;;3604:6;3596;3589:22;3548:2;3649;3636:16;3675:2;3667:6;3664:14;3661:2;;;3696:6;3688;3681:22;3661:2;3755:7;3750:2;3744;3736:6;3732:15;3728:2;3724:24;3720:33;3717:46;3714:2;;;3781:6;3773;3766:22;3714:2;3817;3809:11;;;;;3839:6;;-1:-1:-1;3290:561:1;;-1:-1:-1;;;;3290:561:1:o;3856:257::-;;3976:2;3964:9;3955:7;3951:23;3947:32;3944:2;;;3997:6;3989;3982:22;3944:2;4034:9;4028:16;4053:30;4077:5;4053:30;:::i;4118:194::-;;4241:2;4229:9;4220:7;4216:23;4212:32;4209:2;;;4262:6;4254;4247:22;4209:2;-1:-1:-1;4290:16:1;;4199:113;-1:-1:-1;4199:113:1:o;4317:257::-;;4428:2;4416:9;4407:7;4403:23;4399:32;4396:2;;;4449:6;4441;4434:22;4396:2;4493:9;4480:23;4512:32;4538:5;4512:32;:::i;4579:261::-;;4701:2;4689:9;4680:7;4676:23;4672:32;4669:2;;;4722:6;4714;4707:22;4669:2;4759:9;4753:16;4778:32;4804:5;4778:32;:::i;4845:344::-;;4967:2;4955:9;4946:7;4942:23;4938:32;4935:2;;;4988:6;4980;4973:22;4935:2;5033:9;5020:23;5066:18;5058:6;5055:30;5052:2;;;5103:6;5095;5088:22;5052:2;5131:52;5175:7;5166:6;5155:9;5151:22;5131:52;:::i;5194:190::-;;5306:2;5294:9;5285:7;5281:23;5277:32;5274:2;;;5327:6;5319;5312:22;5274:2;-1:-1:-1;5355:23:1;;5264:120;-1:-1:-1;5264:120:1:o;5389:412::-;;;5528:2;5516:9;5507:7;5503:23;5499:32;5496:2;;;5549:6;5541;5534:22;5496:2;5590:9;5577:23;5567:33;;5651:2;5640:9;5636:18;5623:32;5678:18;5670:6;5667:30;5664:2;;;5715:6;5707;5700:22;5664:2;5743:52;5787:7;5778:6;5767:9;5763:22;5743:52;:::i;:::-;5733:62;;;5486:315;;;;;:::o;5806:259::-;;5887:5;5881:12;5914:6;5909:3;5902:19;5930:63;5986:6;5979:4;5974:3;5970:14;5963:4;5956:5;5952:16;5930:63;:::i;:::-;6047:2;6026:15;-1:-1:-1;;6022:29:1;6013:39;;;;6054:4;6009:50;;5857:208;-1:-1:-1;;5857:208:1:o;6070:274::-;;6237:6;6231:13;6253:53;6299:6;6294:3;6287:4;6279:6;6275:17;6253:53;:::i;:::-;6322:16;;;;;6207:137;-1:-1:-1;;6207:137:1:o;6349:1109::-;6537:13;;6349:1109;;;;6610:1;6595:17;;6631:1;6667:18;;;;6694:2;;6748:4;6740:6;6736:17;6726:27;;6694:2;6774;6822;6814:6;6811:14;6791:18;6788:38;6785:2;;;-1:-1:-1;;;6849:33:1;;6905:4;6902:1;6895:15;6935:4;6856:3;6923:17;6785:2;6966:18;6993:104;;;;7111:1;7106:327;;;;6959:474;;6993:104;-1:-1:-1;;7026:24:1;;7014:37;;7071:16;;;;-1:-1:-1;6993:104:1;;7106:327;7142:42;7177:6;7142:42;:::i;:::-;7206:3;7222:165;7236:6;7233:1;7230:13;7222:165;;;7314:14;;7301:11;;;7294:35;7357:16;;;;7251:10;;7222:165;;;7226:3;;7416:6;7411:3;7407:16;7400:23;;6959:474;-1:-1:-1;7449:3:1;;6487:971;-1:-1:-1;;;;;;;;6487:971:1:o;7744:470::-;;7961:6;7955:13;7977:53;8023:6;8018:3;8011:4;8003:6;7999:17;7977:53;:::i;:::-;8093:13;;8052:16;;;;8115:57;8093:13;8052:16;8149:4;8137:17;;8115:57;:::i;:::-;8188:20;;7931:283;-1:-1:-1;;;;7931:283:1:o;8219:205::-;8419:3;8410:14::o;8429:203::-;-1:-1:-1;;;;;8593:32:1;;;;8575:51;;8563:2;8548:18;;8530:102::o;8637:375::-;-1:-1:-1;;;;;8895:15:1;;;8877:34;;8947:15;;;;8942:2;8927:18;;8920:43;8994:2;8979:18;;8972:34;;;;8827:2;8812:18;;8794:218::o;9017:490::-;-1:-1:-1;;;;;9286:15:1;;;9268:34;;9338:15;;9333:2;9318:18;;9311:43;9385:2;9370:18;;9363:34;;;9433:3;9428:2;9413:18;;9406:31;;;9017:490;;9454:47;;9481:19;;9473:6;9454:47;:::i;:::-;9446:55;9220:287;-1:-1:-1;;;;;;9220:287:1:o;9512:274::-;-1:-1:-1;;;;;9704:32:1;;;;9686:51;;9768:2;9753:18;;9746:34;9674:2;9659:18;;9641:145::o;9791:187::-;9956:14;;9949:22;9931:41;;9919:2;9904:18;;9886:92::o;9983:221::-;;10132:2;10121:9;10114:21;10152:46;10194:2;10183:9;10179:18;10171:6;10152:46;:::i;10209:347::-;10411:2;10393:21;;;10450:2;10430:18;;;10423:30;10489:25;10484:2;10469:18;;10462:53;10547:2;10532:18;;10383:173::o;10561:346::-;10763:2;10745:21;;;10802:2;10782:18;;;10775:30;-1:-1:-1;;;10836:2:1;10821:18;;10814:52;10898:2;10883:18;;10735:172::o;10912:355::-;11114:2;11096:21;;;11153:2;11133:18;;;11126:30;11192:33;11187:2;11172:18;;11165:61;11258:2;11243:18;;11086:181::o;11272:401::-;11474:2;11456:21;;;11513:2;11493:18;;;11486:30;11552:34;11547:2;11532:18;;11525:62;-1:-1:-1;;;11618:2:1;11603:18;;11596:35;11663:3;11648:19;;11446:227::o;11678:407::-;11880:2;11862:21;;;11919:2;11899:18;;;11892:30;11958:34;11953:2;11938:18;;11931:62;-1:-1:-1;;;12024:2:1;12009:18;;12002:41;12075:3;12060:19;;11852:233::o;12090:414::-;12292:2;12274:21;;;12331:2;12311:18;;;12304:30;12370:34;12365:2;12350:18;;12343:62;-1:-1:-1;;;12436:2:1;12421:18;;12414:48;12494:3;12479:19;;12264:240::o;12509:402::-;12711:2;12693:21;;;12750:2;12730:18;;;12723:30;12789:34;12784:2;12769:18;;12762:62;-1:-1:-1;;;12855:2:1;12840:18;;12833:36;12901:3;12886:19;;12683:228::o;12916:349::-;13118:2;13100:21;;;13157:2;13137:18;;;13130:30;13196:27;13191:2;13176:18;;13169:55;13256:2;13241:18;;13090:175::o;13270:352::-;13472:2;13454:21;;;13511:2;13491:18;;;13484:30;13550;13545:2;13530:18;;13523:58;13613:2;13598:18;;13444:178::o;13627:400::-;13829:2;13811:21;;;13868:2;13848:18;;;13841:30;13907:34;13902:2;13887:18;;13880:62;-1:-1:-1;;;13973:2:1;13958:18;;13951:34;14017:3;14002:19;;13801:226::o;14032:349::-;14234:2;14216:21;;;14273:2;14253:18;;;14246:30;14312:27;14307:2;14292:18;;14285:55;14372:2;14357:18;;14206:175::o;14386:408::-;14588:2;14570:21;;;14627:2;14607:18;;;14600:30;14666:34;14661:2;14646:18;;14639:62;-1:-1:-1;;;14732:2:1;14717:18;;14710:42;14784:3;14769:19;;14560:234::o;14799:347::-;15001:2;14983:21;;;15040:2;15020:18;;;15013:30;15079:25;15074:2;15059:18;;15052:53;15137:2;15122:18;;14973:173::o;15151:348::-;15353:2;15335:21;;;15392:2;15372:18;;;15365:30;15431:26;15426:2;15411:18;;15404:54;15490:2;15475:18;;15325:174::o;15504:420::-;15706:2;15688:21;;;15745:2;15725:18;;;15718:30;15784:34;15779:2;15764:18;;15757:62;15855:26;15850:2;15835:18;;15828:54;15914:3;15899:19;;15678:246::o;15929:406::-;16131:2;16113:21;;;16170:2;16150:18;;;16143:30;16209:34;16204:2;16189:18;;16182:62;-1:-1:-1;;;16275:2:1;16260:18;;16253:40;16325:3;16310:19;;16103:232::o;16340:405::-;16542:2;16524:21;;;16581:2;16561:18;;;16554:30;16620:34;16615:2;16600:18;;16593:62;-1:-1:-1;;;16686:2:1;16671:18;;16664:39;16735:3;16720:19;;16514:231::o;16750:355::-;16952:2;16934:21;;;16991:2;16971:18;;;16964:30;17030:33;17025:2;17010:18;;17003:61;17096:2;17081:18;;16924:181::o;17110:356::-;17312:2;17294:21;;;17331:18;;;17324:30;17390:34;17385:2;17370:18;;17363:62;17457:2;17442:18;;17284:182::o;17471:347::-;17673:2;17655:21;;;17712:2;17692:18;;;17685:30;17751:25;17746:2;17731:18;;17724:53;17809:2;17794:18;;17645:173::o;17823:347::-;18025:2;18007:21;;;18064:2;18044:18;;;18037:30;18103:25;18098:2;18083:18;;18076:53;18161:2;18146:18;;17997:173::o;18175:345::-;18377:2;18359:21;;;18416:2;18396:18;;;18389:30;-1:-1:-1;;;18450:2:1;18435:18;;18428:51;18511:2;18496:18;;18349:171::o;18525:408::-;18727:2;18709:21;;;18766:2;18746:18;;;18739:30;18805:34;18800:2;18785:18;;18778:62;-1:-1:-1;;;18871:2:1;18856:18;;18849:42;18923:3;18908:19;;18699:234::o;18938:343::-;19140:2;19122:21;;;19179:2;19159:18;;;19152:30;-1:-1:-1;;;19213:2:1;19198:18;;19191:49;19272:2;19257:18;;19112:169::o;19286:356::-;19488:2;19470:21;;;19507:18;;;19500:30;19566:34;19561:2;19546:18;;19539:62;19633:2;19618:18;;19460:182::o;19647:405::-;19849:2;19831:21;;;19888:2;19868:18;;;19861:30;19927:34;19922:2;19907:18;;19900:62;-1:-1:-1;;;19993:2:1;19978:18;;19971:39;20042:3;20027:19;;19821:231::o;20057:411::-;20259:2;20241:21;;;20298:2;20278:18;;;20271:30;20337:34;20332:2;20317:18;;20310:62;-1:-1:-1;;;20403:2:1;20388:18;;20381:45;20458:3;20443:19;;20231:237::o;20473:399::-;20675:2;20657:21;;;20714:2;20694:18;;;20687:30;20753:34;20748:2;20733:18;;20726:62;-1:-1:-1;;;20819:2:1;20804:18;;20797:33;20862:3;20847:19;;20647:225::o;20877:397::-;21079:2;21061:21;;;21118:2;21098:18;;;21091:30;21157:34;21152:2;21137:18;;21130:62;-1:-1:-1;;;21223:2:1;21208:18;;21201:31;21264:3;21249:19;;21051:223::o;21279:350::-;21481:2;21463:21;;;21520:2;21500:18;;;21493:30;21559:28;21554:2;21539:18;;21532:56;21620:2;21605:18;;21453:176::o;21634:346::-;21836:2;21818:21;;;21875:2;21855:18;;;21848:30;-1:-1:-1;;;21909:2:1;21894:18;;21887:52;21971:2;21956:18;;21808:172::o;21985:347::-;22187:2;22169:21;;;22226:2;22206:18;;;22199:30;22265:25;22260:2;22245:18;;22238:53;22323:2;22308:18;;22159:173::o;22337:413::-;22539:2;22521:21;;;22578:2;22558:18;;;22551:30;22617:34;22612:2;22597:18;;22590:62;-1:-1:-1;;;22683:2:1;22668:18;;22661:47;22740:3;22725:19;;22511:239::o;22755:408::-;22957:2;22939:21;;;22996:2;22976:18;;;22969:30;23035:34;23030:2;23015:18;;23008:62;-1:-1:-1;;;23101:2:1;23086:18;;23079:42;23153:3;23138:19;;22929:234::o;23168:347::-;23370:2;23352:21;;;23409:2;23389:18;;;23382:30;23448:25;23443:2;23428:18;;23421:53;23506:2;23491:18;;23342:173::o;23520:355::-;23722:2;23704:21;;;23761:2;23741:18;;;23734:30;23800:33;23795:2;23780:18;;23773:61;23866:2;23851:18;;23694:181::o;23880:344::-;24082:2;24064:21;;;24121:2;24101:18;;;24094:30;-1:-1:-1;;;24155:2:1;24140:18;;24133:50;24215:2;24200:18;;24054:170::o;24229:403::-;24431:2;24413:21;;;24470:2;24450:18;;;24443:30;24509:34;24504:2;24489:18;;24482:62;-1:-1:-1;;;24575:2:1;24560:18;;24553:37;24622:3;24607:19;;24403:229::o;24637:177::-;24783:25;;;24771:2;24756:18;;24738:76::o;24819:132::-;;24890:17;;;24940:4;24924:21;;;24880:71::o;24956:128::-;;25027:1;25023:6;25020:1;25017:13;25014:2;;;25033:18;;:::i;:::-;-1:-1:-1;25069:9:1;;25004:80::o;25089:204::-;;25163:4;25160:1;25156:12;25195:4;25192:1;25188:12;25230:3;25224:4;25220:14;25215:3;25212:23;25209:2;;;25238:18;;:::i;:::-;25274:13;;25135:158;-1:-1:-1;;;25135:158:1:o;25298:120::-;;25364:1;25354:2;;25369:18;;:::i;:::-;-1:-1:-1;25403:9:1;;25344:74::o;25423:168::-;;25529:1;25525;25521:6;25517:14;25514:1;25511:21;25506:1;25499:9;25492:17;25488:45;25485:2;;;25536:18;;:::i;:::-;-1:-1:-1;25576:9:1;;25475:116::o;25596:125::-;;25664:1;25661;25658:8;25655:2;;;25669:18;;:::i;:::-;-1:-1:-1;25706:9:1;;25645:76::o;25726:258::-;25798:1;25808:113;25822:6;25819:1;25816:13;25808:113;;;25898:11;;;25892:18;25879:11;;;25872:39;25844:2;25837:10;25808:113;;;25939:6;25936:1;25933:13;25930:2;;;-1:-1:-1;;25974:1:1;25956:16;;25949:27;25779:205::o;25989:380::-;26074:1;26064:12;;26121:1;26111:12;;;26132:2;;26186:4;26178:6;26174:17;26164:27;;26132:2;26239;26231:6;26228:14;26208:18;26205:38;26202:2;;;26285:10;26280:3;26276:20;26273:1;26266:31;26320:4;26317:1;26310:15;26348:4;26345:1;26338:15;26202:2;;26044:325;;;:::o;26374:135::-;;-1:-1:-1;;26434:17:1;;26431:2;;;26454:18;;:::i;:::-;-1:-1:-1;26501:1:1;26490:13;;26421:88::o;26514:112::-;;26572:1;26562:2;;26577:18;;:::i;:::-;-1:-1:-1;26611:9:1;;26552:74::o;26631:127::-;26692:10;26687:3;26683:20;26680:1;26673:31;26723:4;26720:1;26713:15;26747:4;26744:1;26737:15;26763:127;26824:10;26819:3;26815:20;26812:1;26805:31;26855:4;26852:1;26845:15;26879:4;26876:1;26869:15;26895:127;26956:10;26951:3;26947:20;26944:1;26937:31;26987:4;26984:1;26977:15;27011:4;27008:1;27001:15;27027:120;27115:5;27108:13;27101:21;27094:5;27091:32;27081:2;;27137:1;27134;27127:12;27152:133;-1:-1:-1;;;;;;27228:32:1;;27218:43;;27208:2;;27275:1;27272;27265:12

Swarm Source

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