ETH Price: $3,347.83 (-1.21%)

Token

Choadz (CHOADZ)
 

Overview

Max Total Supply

4,917 CHOADZ

Holders

2,216

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fuckbeeple.eth
Balance
1 CHOADZ
0x6dc88B231Cd04Dd1b1e525161162993F47140006
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The CHOADZ are 7025 amphibious chunky pond dwellers, brought to life by The Chunks.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Choadz

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.22 <0.9.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//
/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

//
/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

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

//
contract OwnableDelegateProxy {

}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

interface Toadz {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract Choadz is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    Ownable,
    Pausable,
    ReentrancyGuard
{
    using Strings for string;

    bool public _mintingAllowed = false;
    bool public _onlyToadz = true;
    address _proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    address public _toadzContractAddress =
        0x1CB1A5e65610AEFF2551A50f76a87a7d3fB649C6;
    uint256 public _mintFee = 42000000000000000;
    uint256 public _maxSupply = 6969;
    string internal _baseTokenUri;
    mapping(uint256 => bool) public specialToadz;

    Toadz internal toadzContract = Toadz(_toadzContractAddress);

    event Minted(address indexed account, uint256 toadId);
    event Received(address indexed account, uint256 value);

    constructor() ERC721("Choadz", "CHOADZ") {}

    function mint(uint256 toadId, string memory code)
        public
        payable
        nonReentrant
    {
        require(isVibe(code), "Not So Secret Code Invalid");
        require(_mintingAllowed, "Minting Not Allowed");
        require(totalSupply() < _maxSupply, "All Choadz Claimed");
        require(toadId > 0, "Out of Range");
        require(toadId <= _maxSupply, "Out of Range");
        require(_mintFee <= msg.value, "Minimum ETH Not Met");
        if (_onlyToadz) {
            require(
                toadzContract.ownerOf(toadId) == msg.sender,
                "Not Your Toad"
            );
        }
        require(!_exists(toadId), "Choad already minted");

        _safeMint(_msgSender(), toadId);
        emit Minted(_msgSender(), toadId);
    }

    function mintMultiple(uint256[] memory toadIds, string memory code)
        public
        payable
        nonReentrant
    {
        require(isVibe(code), "Not So Secret Code Invalid");
        require(_mintingAllowed, "Minting Not Allowed");
        require(totalSupply() < _maxSupply, "All Choadz Claimed");
        require(
            (_mintFee * toadIds.length) <= msg.value,
            "Minimum ETH Not Met"
        );

        for (uint256 i = 0; i < toadIds.length; i++) {
            require(toadIds[i] > 0, "Out of Range");
            require(toadIds[i] <= _maxSupply, "Out of Range");
            if (_onlyToadz) {
                require(
                    toadzContract.ownerOf(toadIds[i]) == msg.sender,
                    "Not Your Toad"
                );
            }
            require(!_exists(toadIds[i]), "Choad already minted");
            _safeMint(_msgSender(), toadIds[i]);
            emit Minted(_msgSender(), toadIds[i]);
        }
    }

    function mintSpecial(uint256 toadId, string memory code)
        public
        payable
        nonReentrant
    {
        require(isVibe(code), "Code Invalid");
        require(_mintingAllowed, "Minting Not Allowed");
        require(specialToadz[toadId], "Not A Special Toad");
        require(_mintFee <= msg.value, "Minimum ETH Not Met");
        if (_onlyToadz) {
            require(
                toadzContract.ownerOf(toadId) == msg.sender,
                "Not Your Toad"
            );
        }
        require(!_exists(toadId), "Choad already minted");

        _safeMint(_msgSender(), toadId);
        emit Minted(_msgSender(), toadId);
    }

    function reserve(uint256 choadId) public onlyOwner {
        require(!_exists(choadId), "Choad already minted");

        _safeMint(_msgSender(), choadId);
        emit Minted(_msgSender(), choadId);
    }

    function isVibe(string memory _command) public pure returns (bool) {
        require(
            keccak256(abi.encodePacked(_command)) ==
                keccak256(abi.encodePacked("!vibe")),
            "Ribbit"
        );
        return true;
    }

    receive() external payable {
        emit Received(_msgSender(), msg.value);
    }

    function setBaseURI(string memory baseUri) external onlyOwner {
        _baseTokenUri = baseUri;
    }

    function setMintFee(uint256 fee) external onlyOwner {
        _mintFee = fee;
    }

    function flipMintState() public onlyOwner {
        _mintingAllowed = !_mintingAllowed;
    }

    function flipPrivateSale() public onlyOwner {
        _onlyToadz = !_onlyToadz;
    }

    function pause() public virtual onlyOwner {
        _pause();
    }

    function unpause() public virtual onlyOwner {
        _unpause();
    }

    function withdraw() public payable onlyOwner {
        require(
            payable(_msgSender()).send(address(this).balance),
            "Unable to Withdraw ETH"
        );
    }

    function _addSpecialToad(uint256 toadId) internal returns (bool success) {
        if (!specialToadz[toadId]) {
            specialToadz[toadId] = true;
            return success = true;
        }
    }

    function addSpecialToadz(uint256[] memory toadIds)
        public
        onlyOwner
        returns (bool success)
    {
        for (uint256 i = 0; i < toadIds.length; i++) {
            if (_addSpecialToad(toadIds[i])) {
                success = true;
            }
        }
    }

    function _removeSpecialToad(uint256 toadId)
        internal
        returns (bool success)
    {
        if (specialToadz[toadId]) {
            specialToadz[toadId] = false;
            success = true;
        }
    }

    function removeSpecialToadz(uint256[] memory toadIds)
        public
        onlyOwner
        returns (bool success)
    {
        for (uint256 i = 0; i < toadIds.length; i++) {
            if (_removeSpecialToad(toadIds[i])) {
                success = true;
            }
        }
    }

    function ownersChoadz(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 choads = balanceOf(_owner);
        if (choads == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](choads);
            uint256 index;
            for (index = 0; index < choads; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function tokenURI(uint256 _choadId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        require(_exists(_choadId), "Choad Doesn't Exist");
        return string(abi.encodePacked(_baseTokenUri, "/", uint2str(_choadId)));
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(_proxyRegistryAddress);

        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"toadId","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Received","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_onlyToadz","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_toadzContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"toadIds","type":"uint256[]"}],"name":"addSpecialToadz","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"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":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPrivateSale","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":"_command","type":"string"}],"name":"isVibe","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"toadId","type":"uint256"},{"internalType":"string","name":"code","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"toadIds","type":"uint256[]"},{"internalType":"string","name":"code","type":"string"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toadId","type":"uint256"},{"internalType":"string","name":"code","type":"string"}],"name":"mintSpecial","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"ownersChoadz","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"toadIds","type":"uint256[]"}],"name":"removeSpecialToadz","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"choadId","type":"uint256"}],"name":"reserve","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":"fee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"specialToadz","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_choadId","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600d80546001600160b01b03191675a5409ec958c83c3f309868babaca7c86dcb077c10100179055600e8054731cb1a5e65610aeff2551a50f76a87a7d3fb649c66001600160a01b03199182168117909255669536c708910000600f55611b396010556013805490911690911790553480156200008057600080fd5b506040518060400160405280600681526020016521b437b0b23d60d11b8152506040518060400160405280600681526020016521a427a0a22d60d11b8152508160009080519060200190620000d792919062000178565b508051620000ed90600190602084019062000178565b5050506200010a620001046200012260201b60201c565b62000126565b600b805460ff60a01b191690556001600c556200025b565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000186906200021e565b90600052602060002090601f016020900481019282620001aa5760008555620001f5565b82601f10620001c557805160ff1916838001178555620001f5565b82800160010185558215620001f5579182015b82811115620001f5578251825591602001919060010190620001d8565b506200020392915062000207565b5090565b5b8082111562000203576000815560010162000208565b600181811c908216806200023357607f821691505b602082108114156200025557634e487b7160e01b600052602260045260246000fd5b50919050565b613999806200026b6000396000f3fe6080604052600436106102ca5760003560e01c806367546f81116101795780639d8dc1a9116100d6578063e985e9c51161008a578063f2fde38b11610064578063f2fde38b14610779578063f71208e814610799578063fb5d3b73146107b957600080fd5b8063e985e9c514610723578063eddd0d9c14610743578063f2a08abb1461076357600080fd5b8063b88d4fde116100bb578063b88d4fde146106c3578063c87b56dd146106e3578063c9a73c231461070357600080fd5b80639d8dc1a914610683578063a22cb465146106a357600080fd5b8063819b25ba1161012d5780638da5cb5b116101125780638da5cb5b1461063b57806390e33f3a1461065957806395d89b411461066e57600080fd5b8063819b25ba146106065780638456cb591461062657600080fd5b8063715018a61161015e578063715018a6146105cb57806377097fc8146105e057806377e1d9f8146105f357600080fd5b806367546f811461058c57806370a08231146105ab57600080fd5b806332a40bbe116102275780634f6ccce7116101db57806359c74f29116101c057806359c74f29146105385780635c975abb1461054d5780636352211e1461056c57600080fd5b80634f6ccce7146104f857806355f804b31461051857600080fd5b80633ccfd60b1161020c5780633ccfd60b146104bb5780633f4ba83a146104c357806342842e0e146104d857600080fd5b806332a40bbe146104715780633aec28ba1461048b57600080fd5b806318160ddd1161027e57806322f4596f1161026357806322f4596f1461041b57806323b872dd146104315780632f745c591461045157600080fd5b806318160ddd146103cf578063226600db146103ee57600080fd5b8063081812fc116102af578063081812fc14610362578063095ea7b31461039a5780630f93f31e146103bc57600080fd5b806301ffc9a71461030b57806306fdde031461034057600080fd5b366103065760405134815233907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258749060200160405180910390a2005b600080fd5b34801561031757600080fd5b5061032b610326366004613545565b6107d9565b60405190151581526020015b60405180910390f35b34801561034c57600080fd5b506103556107ea565b60405161033791906137b9565b34801561036e57600080fd5b5061038261037d3660046135b0565b61087c565b6040516001600160a01b039091168152602001610337565b3480156103a657600080fd5b506103ba6103b5366004613486565b610927565b005b6103ba6103ca3660046134e4565b610a59565b3480156103db57600080fd5b506008545b604051908152602001610337565b3480156103fa57600080fd5b5061040e610409366004613328565b610f42565b6040516103379190613775565b34801561042757600080fd5b506103e060105481565b34801561043d57600080fd5b506103ba61044c366004613398565b61101d565b34801561045d57600080fd5b506103e061046c366004613486565b6110a4565b34801561047d57600080fd5b50600d5461032b9060ff1681565b34801561049757600080fd5b5061032b6104a63660046135b0565b60126020526000908152604090205460ff1681565b6103ba61114c565b3480156104cf57600080fd5b506103ba61120f565b3480156104e457600080fd5b506103ba6104f3366004613398565b611271565b34801561050457600080fd5b506103e06105133660046135b0565b61128c565b34801561052457600080fd5b506103ba61053336600461357d565b61133e565b34801561054457600080fd5b506103ba6113af565b34801561055957600080fd5b50600b54600160a01b900460ff1661032b565b34801561057857600080fd5b506103826105873660046135b0565b61141d565b34801561059857600080fd5b50600d5461032b90610100900460ff1681565b3480156105b757600080fd5b506103e06105c6366004613328565b6114a8565b3480156105d757600080fd5b506103ba611542565b6103ba6105ee3660046135c8565b6115a6565b6103ba6106013660046135c8565b611972565b34801561061257600080fd5b506103ba6106213660046135b0565b611acf565b34801561063257600080fd5b506103ba611bd0565b34801561064757600080fd5b50600b546001600160a01b0316610382565b34801561066557600080fd5b506103ba611c32565b34801561067a57600080fd5b50610355611ca9565b34801561068f57600080fd5b50600e54610382906001600160a01b031681565b3480156106af57600080fd5b506103ba6106be366004613455565b611cb8565b3480156106cf57600080fd5b506103ba6106de3660046133d8565b611d7d565b3480156106ef57600080fd5b506103556106fe3660046135b0565b611e0b565b34801561070f57600080fd5b5061032b61071e36600461357d565b611ea4565b34801561072f57600080fd5b5061032b61073e366004613360565b611f65565b34801561074f57600080fd5b506103ba61075e3660046135b0565b612054565b34801561076f57600080fd5b506103e0600f5481565b34801561078557600080fd5b506103ba610794366004613328565b6120b3565b3480156107a557600080fd5b5061032b6107b43660046134b1565b612195565b3480156107c557600080fd5b5061032b6107d43660046134b1565b61224a565b60006107e4826122ff565b92915050565b6060600080546107f9906138bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906138bc565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661090b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109328261141d565b9050806001600160a01b0316836001600160a01b031614156109bc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610902565b336001600160a01b03821614806109d857506109d88133611f65565b610a4a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610902565b610a54838361233d565b505050565b6002600c541415610aac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c55610aba81611ea4565b610b065760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420536f2053656372657420436f646520496e76616c69640000000000006044820152606401610902565b600d5460ff16610b585760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b60105460085410610bab5760405162461bcd60e51b815260206004820152601260248201527f416c6c2043686f61647a20436c61696d656400000000000000000000000000006044820152606401610902565b348251600f54610bbb919061385a565b1115610c095760405162461bcd60e51b815260206004820152601360248201527f4d696e696d756d20455448204e6f74204d6574000000000000000000000000006044820152606401610902565b60005b8251811015610f38576000838281518110610c3757634e487b7160e01b600052603260045260246000fd5b602002602001015111610c7b5760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b601054838281518110610c9e57634e487b7160e01b600052603260045260246000fd5b60200260200101511115610ce35760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b600d54610100900460ff1615610df657601354835133916001600160a01b031690636352211e90869085908110610d2a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d5091815260200190565b60206040518083038186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190613344565b6001600160a01b031614610df65760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420596f757220546f6164000000000000000000000000000000000000006044820152606401610902565b610e3e838281518110610e1957634e487b7160e01b600052603260045260246000fd5b60200260200101516000908152600260205260409020546001600160a01b0316151590565b15610e8b5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b610ebc33848381518110610eaf57634e487b7160e01b600052603260045260246000fd5b60200260200101516123b8565b336001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe848381518110610f0757634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610f1e91815260200190565b60405180910390a280610f30816138f1565b915050610c0c565b50506001600c5550565b60606000610f4f836114a8565b905080610f705760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610f9957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc2578160200160208202803683370190505b50905060005b82811015610f6857610fda85826110a4565b828281518110610ffa57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061100f816138f1565b915050610fc8565b50919050565b61102733826123d2565b6110995760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610902565b610a548383836124b2565b60006110af836114a8565b82106111235760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610902565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146111a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60405133904780156108fc02916000818181858888f1935050505061120d5760405162461bcd60e51b815260206004820152601660248201527f556e61626c6520746f20576974686472617720455448000000000000000000006044820152606401610902565b565b600b546001600160a01b031633146112695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d612697565b610a5483838360405180602001604052806000815250611d7d565b600061129760085490565b821061130b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610902565b6008828154811061132c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b546001600160a01b031633146113985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b80516113ab90601190602084019061318e565b5050565b600b546001600160a01b031633146114095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600d805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b0316806107e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610902565b60006001600160a01b0382166115265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610902565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461159c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d6000612758565b6002600c5414156115f95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c5561160781611ea4565b6116535760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420536f2053656372657420436f646520496e76616c69640000000000006044820152606401610902565b600d5460ff166116a55760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b601054600854106116f85760405162461bcd60e51b815260206004820152601260248201527f416c6c2043686f61647a20436c61696d656400000000000000000000000000006044820152606401610902565b600082116117375760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b6010548211156117785760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b34600f5411156117ca5760405162461bcd60e51b815260206004820152601360248201527f4d696e696d756d20455448204e6f74204d6574000000000000000000000000006044820152606401610902565b600d54610100900460ff16156118c5576013546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561183757600080fd5b505afa15801561184b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186f9190613344565b6001600160a01b0316146118c55760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420596f757220546f6164000000000000000000000000000000000000006044820152606401610902565b6000828152600260205260409020546001600160a01b03161561192a5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b61193433836123b8565b60405182815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250506001600c55565b6002600c5414156119c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c556119d381611ea4565b611a1f5760405162461bcd60e51b815260206004820152600c60248201527f436f646520496e76616c696400000000000000000000000000000000000000006044820152606401610902565b600d5460ff16611a715760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b60008281526012602052604090205460ff166117785760405162461bcd60e51b815260206004820152601260248201527f4e6f742041205370656369616c20546f616400000000000000000000000000006044820152606401610902565b600b546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b6000818152600260205260409020546001600160a01b031615611b8e5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b611b9833826123b8565b60405181815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250565b600b546001600160a01b03163314611c2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d6127b7565b600b546001600160a01b03163314611c8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600d805461ff001981166101009182900460ff1615909102179055565b6060600180546107f9906138bc565b6001600160a01b038216331415611d115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610902565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d8733836123d2565b611df95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610902565b611e0584848484612867565b50505050565b6000818152600260205260409020546060906001600160a01b0316611e725760405162461bcd60e51b815260206004820152601360248201527f43686f616420446f65736e2774204578697374000000000000000000000000006044820152606401610902565b6011611e7d836128f0565b604051602001611e8e929190613667565b6040516020818303038152906040529050919050565b6040517f217669626500000000000000000000000000000000000000000000000000000060208201526000906025016040516020818303038152906040528051906020012082604051602001611efa919061364b565b6040516020818303038152906040528051906020012014611f5d5760405162461bcd60e51b815260206004820152600660248201527f52696262697400000000000000000000000000000000000000000000000000006044820152606401610902565b506001919050565b600d546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009262010000900481169190841690829063c45527919060240160206040518083038186803b158015611fd157600080fd5b505afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120099190613344565b6001600160a01b031614156120225760019150506107e4565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600b546001600160a01b031633146120ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600f55565b600b546001600160a01b0316331461210d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b6001600160a01b0381166121895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610902565b61219281612758565b50565b600b546000906001600160a01b031633146121f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60005b82518110156110175761222e83828151811061222157634e487b7160e01b600052603260045260246000fd5b6020026020010151612a69565b1561223857600191505b80612242816138f1565b9150506121f5565b600b546000906001600160a01b031633146122a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60005b8251811015611017576122e38382815181106122d657634e487b7160e01b600052603260045260246000fd5b6020026020010151612a9f565b156122ed57600191505b806122f7816138f1565b9150506122aa565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806107e457506107e482612ad5565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061237f8261141d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113ab828260405180602001604052806000815250612b70565b6000818152600260205260408120546001600160a01b031661245c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610902565b60006124678361141d565b9050806001600160a01b0316846001600160a01b031614806124a25750836001600160a01b03166124978461087c565b6001600160a01b0316145b8061204c575061204c8185611f65565b826001600160a01b03166124c58261141d565b6001600160a01b0316146125415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610902565b6001600160a01b0382166125bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610902565b6125c7838383612bf9565b6125d260008261233d565b6001600160a01b03831660009081526003602052604081208054600192906125fb908490613879565b90915550506001600160a01b03821660009081526003602052604081208054600192906126299084906137fd565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b54600160a01b900460ff166126f05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610902565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156128115760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610902565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861273b3390565b6128728484846124b2565b61287e84848484612c5e565b611e055760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b60608161293057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561295a5780612944816138f1565b91506129539050600a8361383a565b9150612934565b60008167ffffffffffffffff81111561298357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129ad576020820181803683370190505b509050815b8515612a60576129c3600182613879565b905060006129d2600a8861383a565b6129dd90600a61385a565b6129e79088613879565b6129f2906030613815565b905060008160f81b905080848481518110612a1d57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a57600a8961383a565b975050506129b2565b50949350505050565b60008181526012602052604081205460ff1615612a9a57506000818152601260205260409020805460ff1916905560015b919050565b60008181526012602052604081205460ff16612a9a57506000908152601260205260409020805460ff1916600190811790915590565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b3857506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146107e4565b612b7a8383612dc1565b612b876000848484612c5e565b610a545760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b600b54600160a01b900460ff1615612c535760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610902565b610a54838383612f1c565b60006001600160a01b0384163b15612db657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ca2903390899088908890600401613739565b602060405180830381600087803b158015612cbc57600080fd5b505af1925050508015612cec575060408051601f3d908101601f19168201909252612ce991810190613561565b60015b612d9c573d808015612d1a576040519150601f19603f3d011682016040523d82523d6000602084013e612d1f565b606091505b508051612d945760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061204c565b506001949350505050565b6001600160a01b038216612e175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610902565b6000818152600260205260409020546001600160a01b031615612e7c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610902565b612e8860008383612bf9565b6001600160a01b0382166000908152600360205260408120805460019290612eb19084906137fd565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612f7757612f7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f9a565b816001600160a01b0316836001600160a01b031614612f9a57612f9a8382612fd4565b6001600160a01b038216612fb157610a5481613071565b826001600160a01b0316826001600160a01b031614610a5457610a54828261314a565b60006001612fe1846114a8565b612feb9190613879565b60008381526007602052604090205490915080821461303e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061308390600190613879565b600083815260096020526040812054600880549394509092849081106130b957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106130e857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061312e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613155836114a8565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461319a906138bc565b90600052602060002090601f0160209004810192826131bc5760008555613202565b82601f106131d557805160ff1916838001178555613202565b82800160010185558215613202579182015b828111156132025782518255916020019190600101906131e7565b5061320e929150613212565b5090565b5b8082111561320e5760008155600101613213565b600067ffffffffffffffff83111561324157613241613922565b613254601f8401601f19166020016137cc565b905082815283838301111561326857600080fd5b828260208301376000602084830101529392505050565b600082601f83011261328f578081fd5b8135602067ffffffffffffffff8211156132ab576132ab613922565b8160051b6132ba8282016137cc565b8381528281019086840183880185018910156132d4578687fd5b8693505b858410156132f65780358352600193909301929184019184016132d8565b50979650505050505050565b600082601f830112613312578081fd5b61332183833560208501613227565b9392505050565b600060208284031215613339578081fd5b813561332181613938565b600060208284031215613355578081fd5b815161332181613938565b60008060408385031215613372578081fd5b823561337d81613938565b9150602083013561338d81613938565b809150509250929050565b6000806000606084860312156133ac578081fd5b83356133b781613938565b925060208401356133c781613938565b929592945050506040919091013590565b600080600080608085870312156133ed578081fd5b84356133f881613938565b9350602085013561340881613938565b925060408501359150606085013567ffffffffffffffff81111561342a578182fd5b8501601f8101871361343a578182fd5b61344987823560208401613227565b91505092959194509250565b60008060408385031215613467578182fd5b823561347281613938565b91506020830135801515811461338d578182fd5b60008060408385031215613498578182fd5b82356134a381613938565b946020939093013593505050565b6000602082840312156134c2578081fd5b813567ffffffffffffffff8111156134d8578182fd5b61204c8482850161327f565b600080604083850312156134f6578182fd5b823567ffffffffffffffff8082111561350d578384fd5b6135198683870161327f565b9350602085013591508082111561352e578283fd5b5061353b85828601613302565b9150509250929050565b600060208284031215613556578081fd5b81356133218161394d565b600060208284031215613572578081fd5b81516133218161394d565b60006020828403121561358e578081fd5b813567ffffffffffffffff8111156135a4578182fd5b61204c84828501613302565b6000602082840312156135c1578081fd5b5035919050565b600080604083850312156135da578182fd5b82359150602083013567ffffffffffffffff8111156135f7578182fd5b61353b85828601613302565b6000815180845261361b816020860160208601613890565b601f01601f19169290920160200192915050565b60008151613641818560208601613890565b9290920192915050565b6000825161365d818460208701613890565b9190910192915050565b600080845482600182811c91508083168061368357607f831692505b60208084108214156136a357634e487b7160e01b87526022600452602487fd5b8180156136b757600181146136c8576136f4565b60ff198616895284890196506136f4565b60008b815260209020885b868110156136ec5781548b8201529085019083016136d3565b505084890196505b50505050505061373061372a827f2f00000000000000000000000000000000000000000000000000000000000000815260010190565b8561362f565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261376b6080830184613603565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137ad57835183529284019291840191600101613791565b50909695505050505050565b6020815260006133216020830184613603565b604051601f8201601f1916810167ffffffffffffffff811182821017156137f5576137f5613922565b604052919050565b600082198211156138105761381061390c565b500190565b600060ff821660ff84168060ff038211156138325761383261390c565b019392505050565b60008261385557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156138745761387461390c565b500290565b60008282101561388b5761388b61390c565b500390565b60005b838110156138ab578181015183820152602001613893565b83811115611e055750506000910152565b600181811c908216806138d057607f821691505b6020821081141561101757634e487b7160e01b600052602260045260246000fd5b60006000198214156139055761390561390c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461219257600080fd5b6001600160e01b03198116811461219257600080fdfea2646970667358221220b72ded4d79ab496a06075fabdfcbcb8ccb4ddd637c6546dcb8c6569055e827f464736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102ca5760003560e01c806367546f81116101795780639d8dc1a9116100d6578063e985e9c51161008a578063f2fde38b11610064578063f2fde38b14610779578063f71208e814610799578063fb5d3b73146107b957600080fd5b8063e985e9c514610723578063eddd0d9c14610743578063f2a08abb1461076357600080fd5b8063b88d4fde116100bb578063b88d4fde146106c3578063c87b56dd146106e3578063c9a73c231461070357600080fd5b80639d8dc1a914610683578063a22cb465146106a357600080fd5b8063819b25ba1161012d5780638da5cb5b116101125780638da5cb5b1461063b57806390e33f3a1461065957806395d89b411461066e57600080fd5b8063819b25ba146106065780638456cb591461062657600080fd5b8063715018a61161015e578063715018a6146105cb57806377097fc8146105e057806377e1d9f8146105f357600080fd5b806367546f811461058c57806370a08231146105ab57600080fd5b806332a40bbe116102275780634f6ccce7116101db57806359c74f29116101c057806359c74f29146105385780635c975abb1461054d5780636352211e1461056c57600080fd5b80634f6ccce7146104f857806355f804b31461051857600080fd5b80633ccfd60b1161020c5780633ccfd60b146104bb5780633f4ba83a146104c357806342842e0e146104d857600080fd5b806332a40bbe146104715780633aec28ba1461048b57600080fd5b806318160ddd1161027e57806322f4596f1161026357806322f4596f1461041b57806323b872dd146104315780632f745c591461045157600080fd5b806318160ddd146103cf578063226600db146103ee57600080fd5b8063081812fc116102af578063081812fc14610362578063095ea7b31461039a5780630f93f31e146103bc57600080fd5b806301ffc9a71461030b57806306fdde031461034057600080fd5b366103065760405134815233907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258749060200160405180910390a2005b600080fd5b34801561031757600080fd5b5061032b610326366004613545565b6107d9565b60405190151581526020015b60405180910390f35b34801561034c57600080fd5b506103556107ea565b60405161033791906137b9565b34801561036e57600080fd5b5061038261037d3660046135b0565b61087c565b6040516001600160a01b039091168152602001610337565b3480156103a657600080fd5b506103ba6103b5366004613486565b610927565b005b6103ba6103ca3660046134e4565b610a59565b3480156103db57600080fd5b506008545b604051908152602001610337565b3480156103fa57600080fd5b5061040e610409366004613328565b610f42565b6040516103379190613775565b34801561042757600080fd5b506103e060105481565b34801561043d57600080fd5b506103ba61044c366004613398565b61101d565b34801561045d57600080fd5b506103e061046c366004613486565b6110a4565b34801561047d57600080fd5b50600d5461032b9060ff1681565b34801561049757600080fd5b5061032b6104a63660046135b0565b60126020526000908152604090205460ff1681565b6103ba61114c565b3480156104cf57600080fd5b506103ba61120f565b3480156104e457600080fd5b506103ba6104f3366004613398565b611271565b34801561050457600080fd5b506103e06105133660046135b0565b61128c565b34801561052457600080fd5b506103ba61053336600461357d565b61133e565b34801561054457600080fd5b506103ba6113af565b34801561055957600080fd5b50600b54600160a01b900460ff1661032b565b34801561057857600080fd5b506103826105873660046135b0565b61141d565b34801561059857600080fd5b50600d5461032b90610100900460ff1681565b3480156105b757600080fd5b506103e06105c6366004613328565b6114a8565b3480156105d757600080fd5b506103ba611542565b6103ba6105ee3660046135c8565b6115a6565b6103ba6106013660046135c8565b611972565b34801561061257600080fd5b506103ba6106213660046135b0565b611acf565b34801561063257600080fd5b506103ba611bd0565b34801561064757600080fd5b50600b546001600160a01b0316610382565b34801561066557600080fd5b506103ba611c32565b34801561067a57600080fd5b50610355611ca9565b34801561068f57600080fd5b50600e54610382906001600160a01b031681565b3480156106af57600080fd5b506103ba6106be366004613455565b611cb8565b3480156106cf57600080fd5b506103ba6106de3660046133d8565b611d7d565b3480156106ef57600080fd5b506103556106fe3660046135b0565b611e0b565b34801561070f57600080fd5b5061032b61071e36600461357d565b611ea4565b34801561072f57600080fd5b5061032b61073e366004613360565b611f65565b34801561074f57600080fd5b506103ba61075e3660046135b0565b612054565b34801561076f57600080fd5b506103e0600f5481565b34801561078557600080fd5b506103ba610794366004613328565b6120b3565b3480156107a557600080fd5b5061032b6107b43660046134b1565b612195565b3480156107c557600080fd5b5061032b6107d43660046134b1565b61224a565b60006107e4826122ff565b92915050565b6060600080546107f9906138bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906138bc565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661090b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109328261141d565b9050806001600160a01b0316836001600160a01b031614156109bc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610902565b336001600160a01b03821614806109d857506109d88133611f65565b610a4a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610902565b610a54838361233d565b505050565b6002600c541415610aac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c55610aba81611ea4565b610b065760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420536f2053656372657420436f646520496e76616c69640000000000006044820152606401610902565b600d5460ff16610b585760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b60105460085410610bab5760405162461bcd60e51b815260206004820152601260248201527f416c6c2043686f61647a20436c61696d656400000000000000000000000000006044820152606401610902565b348251600f54610bbb919061385a565b1115610c095760405162461bcd60e51b815260206004820152601360248201527f4d696e696d756d20455448204e6f74204d6574000000000000000000000000006044820152606401610902565b60005b8251811015610f38576000838281518110610c3757634e487b7160e01b600052603260045260246000fd5b602002602001015111610c7b5760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b601054838281518110610c9e57634e487b7160e01b600052603260045260246000fd5b60200260200101511115610ce35760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b600d54610100900460ff1615610df657601354835133916001600160a01b031690636352211e90869085908110610d2a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d5091815260200190565b60206040518083038186803b158015610d6857600080fd5b505afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190613344565b6001600160a01b031614610df65760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420596f757220546f6164000000000000000000000000000000000000006044820152606401610902565b610e3e838281518110610e1957634e487b7160e01b600052603260045260246000fd5b60200260200101516000908152600260205260409020546001600160a01b0316151590565b15610e8b5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b610ebc33848381518110610eaf57634e487b7160e01b600052603260045260246000fd5b60200260200101516123b8565b336001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe848381518110610f0757634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610f1e91815260200190565b60405180910390a280610f30816138f1565b915050610c0c565b50506001600c5550565b60606000610f4f836114a8565b905080610f705760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610f9957634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc2578160200160208202803683370190505b50905060005b82811015610f6857610fda85826110a4565b828281518110610ffa57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061100f816138f1565b915050610fc8565b50919050565b61102733826123d2565b6110995760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610902565b610a548383836124b2565b60006110af836114a8565b82106111235760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610902565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146111a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60405133904780156108fc02916000818181858888f1935050505061120d5760405162461bcd60e51b815260206004820152601660248201527f556e61626c6520746f20576974686472617720455448000000000000000000006044820152606401610902565b565b600b546001600160a01b031633146112695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d612697565b610a5483838360405180602001604052806000815250611d7d565b600061129760085490565b821061130b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610902565b6008828154811061132c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b546001600160a01b031633146113985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b80516113ab90601190602084019061318e565b5050565b600b546001600160a01b031633146114095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600d805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b0316806107e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610902565b60006001600160a01b0382166115265760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610902565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461159c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d6000612758565b6002600c5414156115f95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c5561160781611ea4565b6116535760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420536f2053656372657420436f646520496e76616c69640000000000006044820152606401610902565b600d5460ff166116a55760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b601054600854106116f85760405162461bcd60e51b815260206004820152601260248201527f416c6c2043686f61647a20436c61696d656400000000000000000000000000006044820152606401610902565b600082116117375760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b6010548211156117785760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662052616e676560a01b6044820152606401610902565b34600f5411156117ca5760405162461bcd60e51b815260206004820152601360248201527f4d696e696d756d20455448204e6f74204d6574000000000000000000000000006044820152606401610902565b600d54610100900460ff16156118c5576013546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561183757600080fd5b505afa15801561184b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186f9190613344565b6001600160a01b0316146118c55760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420596f757220546f6164000000000000000000000000000000000000006044820152606401610902565b6000828152600260205260409020546001600160a01b03161561192a5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b61193433836123b8565b60405182815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250506001600c55565b6002600c5414156119c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610902565b6002600c556119d381611ea4565b611a1f5760405162461bcd60e51b815260206004820152600c60248201527f436f646520496e76616c696400000000000000000000000000000000000000006044820152606401610902565b600d5460ff16611a715760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67204e6f7420416c6c6f776564000000000000000000000000006044820152606401610902565b60008281526012602052604090205460ff166117785760405162461bcd60e51b815260206004820152601260248201527f4e6f742041205370656369616c20546f616400000000000000000000000000006044820152606401610902565b600b546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b6000818152600260205260409020546001600160a01b031615611b8e5760405162461bcd60e51b815260206004820152601460248201527f43686f616420616c7265616479206d696e7465640000000000000000000000006044820152606401610902565b611b9833826123b8565b60405181815233907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe9060200160405180910390a250565b600b546001600160a01b03163314611c2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b61120d6127b7565b600b546001600160a01b03163314611c8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600d805461ff001981166101009182900460ff1615909102179055565b6060600180546107f9906138bc565b6001600160a01b038216331415611d115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610902565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d8733836123d2565b611df95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610902565b611e0584848484612867565b50505050565b6000818152600260205260409020546060906001600160a01b0316611e725760405162461bcd60e51b815260206004820152601360248201527f43686f616420446f65736e2774204578697374000000000000000000000000006044820152606401610902565b6011611e7d836128f0565b604051602001611e8e929190613667565b6040516020818303038152906040529050919050565b6040517f217669626500000000000000000000000000000000000000000000000000000060208201526000906025016040516020818303038152906040528051906020012082604051602001611efa919061364b565b6040516020818303038152906040528051906020012014611f5d5760405162461bcd60e51b815260206004820152600660248201527f52696262697400000000000000000000000000000000000000000000000000006044820152606401610902565b506001919050565b600d546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009262010000900481169190841690829063c45527919060240160206040518083038186803b158015611fd157600080fd5b505afa158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120099190613344565b6001600160a01b031614156120225760019150506107e4565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600b546001600160a01b031633146120ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b600f55565b600b546001600160a01b0316331461210d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b6001600160a01b0381166121895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610902565b61219281612758565b50565b600b546000906001600160a01b031633146121f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60005b82518110156110175761222e83828151811061222157634e487b7160e01b600052603260045260246000fd5b6020026020010151612a69565b1561223857600191505b80612242816138f1565b9150506121f5565b600b546000906001600160a01b031633146122a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60005b8251811015611017576122e38382815181106122d657634e487b7160e01b600052603260045260246000fd5b6020026020010151612a9f565b156122ed57600191505b806122f7816138f1565b9150506122aa565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806107e457506107e482612ad5565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061237f8261141d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113ab828260405180602001604052806000815250612b70565b6000818152600260205260408120546001600160a01b031661245c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610902565b60006124678361141d565b9050806001600160a01b0316846001600160a01b031614806124a25750836001600160a01b03166124978461087c565b6001600160a01b0316145b8061204c575061204c8185611f65565b826001600160a01b03166124c58261141d565b6001600160a01b0316146125415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610902565b6001600160a01b0382166125bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610902565b6125c7838383612bf9565b6125d260008261233d565b6001600160a01b03831660009081526003602052604081208054600192906125fb908490613879565b90915550506001600160a01b03821660009081526003602052604081208054600192906126299084906137fd565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b54600160a01b900460ff166126f05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610902565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156128115760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610902565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861273b3390565b6128728484846124b2565b61287e84848484612c5e565b611e055760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b60608161293057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561295a5780612944816138f1565b91506129539050600a8361383a565b9150612934565b60008167ffffffffffffffff81111561298357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129ad576020820181803683370190505b509050815b8515612a60576129c3600182613879565b905060006129d2600a8861383a565b6129dd90600a61385a565b6129e79088613879565b6129f2906030613815565b905060008160f81b905080848481518110612a1d57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a57600a8961383a565b975050506129b2565b50949350505050565b60008181526012602052604081205460ff1615612a9a57506000818152601260205260409020805460ff1916905560015b919050565b60008181526012602052604081205460ff16612a9a57506000908152601260205260409020805460ff1916600190811790915590565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b3857506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146107e4565b612b7a8383612dc1565b612b876000848484612c5e565b610a545760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b600b54600160a01b900460ff1615612c535760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610902565b610a54838383612f1c565b60006001600160a01b0384163b15612db657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ca2903390899088908890600401613739565b602060405180830381600087803b158015612cbc57600080fd5b505af1925050508015612cec575060408051601f3d908101601f19168201909252612ce991810190613561565b60015b612d9c573d808015612d1a576040519150601f19603f3d011682016040523d82523d6000602084013e612d1f565b606091505b508051612d945760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610902565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061204c565b506001949350505050565b6001600160a01b038216612e175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610902565b6000818152600260205260409020546001600160a01b031615612e7c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610902565b612e8860008383612bf9565b6001600160a01b0382166000908152600360205260408120805460019290612eb19084906137fd565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612f7757612f7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f9a565b816001600160a01b0316836001600160a01b031614612f9a57612f9a8382612fd4565b6001600160a01b038216612fb157610a5481613071565b826001600160a01b0316826001600160a01b031614610a5457610a54828261314a565b60006001612fe1846114a8565b612feb9190613879565b60008381526007602052604090205490915080821461303e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061308390600190613879565b600083815260096020526040812054600880549394509092849081106130b957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106130e857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061312e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613155836114a8565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461319a906138bc565b90600052602060002090601f0160209004810192826131bc5760008555613202565b82601f106131d557805160ff1916838001178555613202565b82800160010185558215613202579182015b828111156132025782518255916020019190600101906131e7565b5061320e929150613212565b5090565b5b8082111561320e5760008155600101613213565b600067ffffffffffffffff83111561324157613241613922565b613254601f8401601f19166020016137cc565b905082815283838301111561326857600080fd5b828260208301376000602084830101529392505050565b600082601f83011261328f578081fd5b8135602067ffffffffffffffff8211156132ab576132ab613922565b8160051b6132ba8282016137cc565b8381528281019086840183880185018910156132d4578687fd5b8693505b858410156132f65780358352600193909301929184019184016132d8565b50979650505050505050565b600082601f830112613312578081fd5b61332183833560208501613227565b9392505050565b600060208284031215613339578081fd5b813561332181613938565b600060208284031215613355578081fd5b815161332181613938565b60008060408385031215613372578081fd5b823561337d81613938565b9150602083013561338d81613938565b809150509250929050565b6000806000606084860312156133ac578081fd5b83356133b781613938565b925060208401356133c781613938565b929592945050506040919091013590565b600080600080608085870312156133ed578081fd5b84356133f881613938565b9350602085013561340881613938565b925060408501359150606085013567ffffffffffffffff81111561342a578182fd5b8501601f8101871361343a578182fd5b61344987823560208401613227565b91505092959194509250565b60008060408385031215613467578182fd5b823561347281613938565b91506020830135801515811461338d578182fd5b60008060408385031215613498578182fd5b82356134a381613938565b946020939093013593505050565b6000602082840312156134c2578081fd5b813567ffffffffffffffff8111156134d8578182fd5b61204c8482850161327f565b600080604083850312156134f6578182fd5b823567ffffffffffffffff8082111561350d578384fd5b6135198683870161327f565b9350602085013591508082111561352e578283fd5b5061353b85828601613302565b9150509250929050565b600060208284031215613556578081fd5b81356133218161394d565b600060208284031215613572578081fd5b81516133218161394d565b60006020828403121561358e578081fd5b813567ffffffffffffffff8111156135a4578182fd5b61204c84828501613302565b6000602082840312156135c1578081fd5b5035919050565b600080604083850312156135da578182fd5b82359150602083013567ffffffffffffffff8111156135f7578182fd5b61353b85828601613302565b6000815180845261361b816020860160208601613890565b601f01601f19169290920160200192915050565b60008151613641818560208601613890565b9290920192915050565b6000825161365d818460208701613890565b9190910192915050565b600080845482600182811c91508083168061368357607f831692505b60208084108214156136a357634e487b7160e01b87526022600452602487fd5b8180156136b757600181146136c8576136f4565b60ff198616895284890196506136f4565b60008b815260209020885b868110156136ec5781548b8201529085019083016136d3565b505084890196505b50505050505061373061372a827f2f00000000000000000000000000000000000000000000000000000000000000815260010190565b8561362f565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261376b6080830184613603565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137ad57835183529284019291840191600101613791565b50909695505050505050565b6020815260006133216020830184613603565b604051601f8201601f1916810167ffffffffffffffff811182821017156137f5576137f5613922565b604052919050565b600082198211156138105761381061390c565b500190565b600060ff821660ff84168060ff038211156138325761383261390c565b019392505050565b60008261385557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156138745761387461390c565b500290565b60008282101561388b5761388b61390c565b500390565b60005b838110156138ab578181015183820152602001613893565b83811115611e055750506000910152565b600181811c908216806138d057607f821691505b6020821081141561101757634e487b7160e01b600052602260045260246000fd5b60006000198214156139055761390561390c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461219257600080fd5b6001600160e01b03198116811461219257600080fdfea2646970667358221220b72ded4d79ab496a06075fabdfcbcb8ccb4ddd637c6546dcb8c6569055e827f464736f6c63430008040033

Deployed Bytecode Sourcemap

51811:8176:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55674:33;;55697:9;23591:25:1;;16289:10:0;;55674:33;;23579:2:1;23564:18;55674:33:0;;;;;;;51811:8176;;;;;58752:212;;;;;;;;;;-1:-1:-1;58752:212:0;;;;;:::i;:::-;;:::i;:::-;;;11198:14:1;;11191:22;11173:41;;11161:2;11146:18;58752:212:0;;;;;;;;21760:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23453:308::-;;;;;;;;;;-1:-1:-1;23453:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9810:55:1;;;9792:74;;9780:2;9765:18;23453:308:0;9747:125:1;22976:411:0;;;;;;;;;;-1:-1:-1;22976:411:0;;;;;:::i;:::-;;:::i;:::-;;53455:1000;;;;;;:::i;:::-;;:::i;36202:113::-;;;;;;;;;;-1:-1:-1;36290:10:0;:17;36202:113;;;23591:25:1;;;23579:2;23564:18;36202:113:0;23546:76:1;57538:517:0;;;;;;;;;;-1:-1:-1;57538:517:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52286:32::-;;;;;;;;;;;;;;;;24512:376;;;;;;;;;;-1:-1:-1;24512:376:0;;;;;:::i;:::-;;:::i;35783:343::-;;;;;;;;;;-1:-1:-1;35783:343:0;;;;;:::i;:::-;;:::i;51980:35::-;;;;;;;;;;-1:-1:-1;51980:35:0;;;;;;;;52361:44;;;;;;;;;;-1:-1:-1;52361:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56284:185;;;:::i;56203:73::-;;;;;;;;;;;;;:::i;24959:185::-;;;;;;;;;;-1:-1:-1;24959:185:0;;;;;:::i;:::-;;:::i;36392:320::-;;;;;;;;;;-1:-1:-1;36392:320:0;;;;;:::i;:::-;;:::i;55723:104::-;;;;;;;;;;-1:-1:-1;55723:104:0;;;;;:::i;:::-;;:::i;55928:95::-;;;;;;;;;;;;;:::i;42798:86::-;;;;;;;;;;-1:-1:-1;42869:7:0;;-1:-1:-1;;;42869:7:0;;;;42798:86;;21367:326;;;;;;;;;;-1:-1:-1;21367:326:0;;;;;:::i;:::-;;:::i;52022:29::-;;;;;;;;;;-1:-1:-1;52022:29:0;;;;;;;;;;;21010:295;;;;;;;;;;-1:-1:-1;21010:295:0;;;;;:::i;:::-;;:::i;48306:94::-;;;;;;;;;;;;;:::i;52656:791::-;;;;;;:::i;:::-;;:::i;54463:676::-;;;;;;:::i;:::-;;:::i;55147:210::-;;;;;;;;;;-1:-1:-1;55147:210:0;;;;;:::i;:::-;;:::i;56126:69::-;;;;;;;;;;;;;:::i;47655:87::-;;;;;;;;;;-1:-1:-1;47728:6:0;;-1:-1:-1;;;;;47728:6:0;47655:87;;56031;;;;;;;;;;;;;:::i;21929:104::-;;;;;;;;;;;;;:::i;52139:90::-;;;;;;;;;;-1:-1:-1;52139:90:0;;;;-1:-1:-1;;;;;52139:90:0;;;23833:327;;;;;;;;;;-1:-1:-1;23833:327:0;;;;;:::i;:::-;;:::i;25215:365::-;;;;;;;;;;-1:-1:-1;25215:365:0;;;;;:::i;:::-;;:::i;58209:298::-;;;;;;;;;;-1:-1:-1;58209:298:0;;;;;:::i;:::-;;:::i;55365:258::-;;;;;;;;;;-1:-1:-1;55365:258:0;;;;;:::i;:::-;;:::i;58972:383::-;;;;;;;;;;-1:-1:-1;58972:383:0;;;;;:::i;:::-;;:::i;55835:85::-;;;;;;;;;;-1:-1:-1;55835:85:0;;;;;:::i;:::-;;:::i;52236:43::-;;;;;;;;;;;;;;;;48555:229;;;;;;;;;;-1:-1:-1;48555:229:0;;;;;:::i;:::-;;:::i;57230:300::-;;;;;;;;;;-1:-1:-1;57230:300:0;;;;;:::i;:::-;;:::i;56693:294::-;;;;;;;;;;-1:-1:-1;56693:294:0;;;;;:::i;:::-;;:::i;58752:212::-;58891:4;58920:36;58944:11;58920:23;:36::i;:::-;58913:43;58752:212;-1:-1:-1;;58752:212:0:o;21760:100::-;21814:13;21847:5;21840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21760:100;:::o;23453:308::-;23574:7;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;23599:110;;;;-1:-1:-1;;;23599:110:0;;18809:2:1;23599:110:0;;;18791:21:1;18848:2;18828:18;;;18821:30;18887:34;18867:18;;;18860:62;18958:14;18938:18;;;18931:42;18990:19;;23599:110:0;;;;;;;;;-1:-1:-1;23729:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23729:24:0;;23453:308::o;22976:411::-;23057:13;23073:23;23088:7;23073:14;:23::i;:::-;23057:39;;23121:5;-1:-1:-1;;;;;23115:11:0;:2;-1:-1:-1;;;;;23115:11:0;;;23107:57;;;;-1:-1:-1;;;23107:57:0;;20683:2:1;23107:57:0;;;20665:21:1;20722:2;20702:18;;;20695:30;20761:34;20741:18;;;20734:62;20832:3;20812:18;;;20805:31;20853:19;;23107:57:0;20655:223:1;23107:57:0;16289:10;-1:-1:-1;;;;;23199:21:0;;;;:62;;-1:-1:-1;23224:37:0;23241:5;16289:10;58972:383;:::i;23224:37::-;23177:168;;;;-1:-1:-1;;;23177:168:0;;16847:2:1;23177:168:0;;;16829:21:1;16886:2;16866:18;;;16859:30;16925:34;16905:18;;;16898:62;16996:26;16976:18;;;16969:54;17040:19;;23177:168:0;16819:246:1;23177:168:0;23358:21;23367:2;23371:7;23358:8;:21::i;:::-;22976:411;;;:::o;53455:1000::-;50627:1;51223:7;;:19;;51215:63;;;;-1:-1:-1;;;51215:63:0;;23287:2:1;51215:63:0;;;23269:21:1;23326:2;23306:18;;;23299:30;23365:33;23345:18;;;23338:61;23416:18;;51215:63:0;23259:181:1;51215:63:0;50627:1;51356:7;:18;53602:12:::1;53609:4:::0;53602:6:::1;:12::i;:::-;53594:51;;;::::0;-1:-1:-1;;;53594:51:0;;18093:2:1;53594:51:0::1;::::0;::::1;18075:21:1::0;18132:2;18112:18;;;18105:30;18171:28;18151:18;;;18144:56;18217:18;;53594:51:0::1;18065:176:1::0;53594:51:0::1;53664:15;::::0;::::1;;53656:47;;;::::0;-1:-1:-1;;;53656:47:0;;12831:2:1;53656:47:0::1;::::0;::::1;12813:21:1::0;12870:2;12850:18;;;12843:30;12909:21;12889:18;;;12882:49;12948:18;;53656:47:0::1;12803:169:1::0;53656:47:0::1;53738:10;::::0;36290;:17;53722:26:::1;53714:57;;;::::0;-1:-1:-1;;;53714:57:0;;21085:2:1;53714:57:0::1;::::0;::::1;21067:21:1::0;21124:2;21104:18;;;21097:30;21163:20;21143:18;;;21136:48;21201:18;;53714:57:0::1;21057:168:1::0;53714:57:0::1;53835:9;53816:7;:14;53805:8;;:25;;;;:::i;:::-;53804:40;;53782:109;;;::::0;-1:-1:-1;;;53782:109:0;;15813:2:1;53782:109:0::1;::::0;::::1;15795:21:1::0;15852:2;15832:18;;;15825:30;15891:21;15871:18;;;15864:49;15930:18;;53782:109:0::1;15785:169:1::0;53782:109:0::1;53909:9;53904:544;53928:7;:14;53924:1;:18;53904:544;;;53985:1;53972:7;53980:1;53972:10;;;;;;-1:-1:-1::0;;;53972:10:0::1;;;;;;;;;;;;;;;:14;53964:39;;;::::0;-1:-1:-1;;;53964:39:0;;16161:2:1;53964:39:0::1;::::0;::::1;16143:21:1::0;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:42;16271:18;;53964:39:0::1;16133:162:1::0;53964:39:0::1;54040:10;;54026:7;54034:1;54026:10;;;;;;-1:-1:-1::0;;;54026:10:0::1;;;;;;;;;;;;;;;:24;;54018:49;;;::::0;-1:-1:-1;;;54018:49:0;;16161:2:1;54018:49:0::1;::::0;::::1;16143:21:1::0;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:42;16271:18;;54018:49:0::1;16133:162:1::0;54018:49:0::1;54086:10;::::0;::::1;::::0;::::1;;;54082:185;;;54147:13;::::0;54169:10;;54184::::1;::::0;-1:-1:-1;;;;;54147:13:0::1;::::0;:21:::1;::::0;54169:7;;54177:1;;54169:10;::::1;;;-1:-1:-1::0;;;54169:10:0::1;;;;;;;;;;;;;;;54147:33;;;;;;;;;;;;;23591:25:1::0;;23579:2;23564:18;;23546:76;54147:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54147:47:0::1;;54117:134;;;::::0;-1:-1:-1;;;54117:134:0;;22945:2:1;54117:134:0::1;::::0;::::1;22927:21:1::0;22984:2;22964:18;;;22957:30;23023:15;23003:18;;;22996:43;23056:18;;54117:134:0::1;22917:163:1::0;54117:134:0::1;54290:19;54298:7;54306:1;54298:10;;;;;;-1:-1:-1::0;;;54298:10:0::1;;;;;;;;;;;;;;;27192:4:::0;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;:30;;;27127:127;54290:19:::1;54289:20;54281:53;;;::::0;-1:-1:-1;;;54281:53:0;;19924:2:1;54281:53:0::1;::::0;::::1;19906:21:1::0;19963:2;19943:18;;;19936:30;20002:22;19982:18;;;19975:50;20042:18;;54281:53:0::1;19896:170:1::0;54281:53:0::1;54349:35;16289:10:::0;54373:7:::1;54381:1;54373:10;;;;;;-1:-1:-1::0;;;54373:10:0::1;;;;;;;;;;;;;;;54349:9;:35::i;:::-;16289:10:::0;-1:-1:-1;;;;;54404:32:0::1;;54425:7;54433:1;54425:10;;;;;;-1:-1:-1::0;;;54425:10:0::1;;;;;;;;;;;;;;;54404:32;;;;23591:25:1::0;;23579:2;23564:18;;23546:76;54404:32:0::1;;;;;;;;53944:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53904:544;;;-1:-1:-1::0;;50583:1:0;51535:7;:22;-1:-1:-1;53455:1000:0:o;57538:517::-;57626:16;57660:14;57677:17;57687:6;57677:9;:17::i;:::-;57660:34;-1:-1:-1;57709:11:0;57705:343;;57744:16;;;57758:1;57744:16;;;;;;;;;;;-1:-1:-1;57737:23:0;57538:517;-1:-1:-1;;;57538:517:0:o;57705:343::-;57793:23;57833:6;57819:21;;;;;;-1:-1:-1;;;57819:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57819:21:0;;57793:47;;57855:13;57883:126;57907:6;57899:5;:14;57883:126;;;57959:34;57979:6;57987:5;57959:19;:34::i;:::-;57943:6;57950:5;57943:13;;;;;;-1:-1:-1;;;57943:13:0;;;;;;;;;;;;;;;;;;:50;57915:7;;;;:::i;:::-;;;;57883:126;;57705:343;57538:517;;;;:::o;24512:376::-;24721:41;16289:10;24754:7;24721:18;:41::i;:::-;24699:140;;;;-1:-1:-1;;;24699:140:0;;22114:2:1;24699:140:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:34;22172:18;;;22165:62;22263:19;22243:18;;;22236:47;22300:19;;24699:140:0;22086:239:1;24699:140:0;24852:28;24862:4;24868:2;24872:7;24852:9;:28::i;35783:343::-;35925:7;35980:23;35997:5;35980:16;:23::i;:::-;35972:5;:31;35950:124;;;;-1:-1:-1;;;35950:124:0;;12000:2:1;35950:124:0;;;11982:21:1;12039:2;12019:18;;;12012:30;12078:34;12058:18;;;12051:62;12149:13;12129:18;;;12122:41;12180:19;;35950:124:0;11972:233:1;35950:124:0;-1:-1:-1;;;;;;36092:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35783:343::o;56284:185::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56362:49:::1;::::0;16289:10;;56389:21:::1;56362:49:::0;::::1;;;::::0;::::1;::::0;;;56389:21;16289:10;56362:49;::::1;;;;;;56340:121;;;::::0;-1:-1:-1;;;56340:121:0;;13586:2:1;56340:121:0::1;::::0;::::1;13568:21:1::0;13625:2;13605:18;;;13598:30;13664:24;13644:18;;;13637:52;13706:18;;56340:121:0::1;13558:172:1::0;56340:121:0::1;56284:185::o:0;56203:73::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56258:10:::1;:8;:10::i;24959:185::-:0;25097:39;25114:4;25120:2;25124:7;25097:39;;;;;;;;;;;;:16;:39::i;36392:320::-;36512:7;36567:30;36290:10;:17;;36202:113;36567:30;36559:5;:38;36537:132;;;;-1:-1:-1;;;36537:132:0;;22532:2:1;36537:132:0;;;22514:21:1;22571:2;22551:18;;;22544:30;22610:34;22590:18;;;22583:62;22681:14;22661:18;;;22654:42;22713:19;;36537:132:0;22504:234:1;36537:132:0;36687:10;36698:5;36687:17;;;;;;-1:-1:-1;;;36687:17:0;;;;;;;;;;;;;;;;;36680:24;;36392:320;;;:::o;55723:104::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;55796:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55723:104:::0;:::o;55928:95::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56000:15:::1;::::0;;-1:-1:-1;;55981:34:0;::::1;56000:15;::::0;;::::1;55999:16;55981:34;::::0;;55928:95::o;21367:326::-;21484:7;21525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21525:16:0;21574:19;21552:110;;;;-1:-1:-1;;;21552:110:0;;17683:2:1;21552:110:0;;;17665:21:1;17722:2;17702:18;;;17695:30;17761:34;17741:18;;;17734:62;17832:11;17812:18;;;17805:39;17861:19;;21552:110:0;17655:231:1;21010:295:0;21127:7;-1:-1:-1;;;;;21174:19:0;;21152:111;;;;-1:-1:-1;;;21152:111:0;;17272:2:1;21152:111:0;;;17254:21:1;17311:2;17291:18;;;17284:30;17350:34;17330:18;;;17323:62;17421:12;17401:18;;;17394:40;17451:19;;21152:111:0;17244:232:1;21152:111:0;-1:-1:-1;;;;;;21281:16:0;;;;;:9;:16;;;;;;;21010:295::o;48306:94::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;48371:21:::1;48389:1;48371:9;:21::i;52656:791::-:0;50627:1;51223:7;;:19;;51215:63;;;;-1:-1:-1;;;51215:63:0;;23287:2:1;51215:63:0;;;23269:21:1;23326:2;23306:18;;;23299:30;23365:33;23345:18;;;23338:61;23416:18;;51215:63:0;23259:181:1;51215:63:0;50627:1;51356:7;:18;52785:12:::1;52792:4:::0;52785:6:::1;:12::i;:::-;52777:51;;;::::0;-1:-1:-1;;;52777:51:0;;18093:2:1;52777:51:0::1;::::0;::::1;18075:21:1::0;18132:2;18112:18;;;18105:30;18171:28;18151:18;;;18144:56;18217:18;;52777:51:0::1;18065:176:1::0;52777:51:0::1;52847:15;::::0;::::1;;52839:47;;;::::0;-1:-1:-1;;;52839:47:0;;12831:2:1;52839:47:0::1;::::0;::::1;12813:21:1::0;12870:2;12850:18;;;12843:30;12909:21;12889:18;;;12882:49;12948:18;;52839:47:0::1;12803:169:1::0;52839:47:0::1;52921:10;::::0;36290;:17;52905:26:::1;52897:57;;;::::0;-1:-1:-1;;;52897:57:0;;21085:2:1;52897:57:0::1;::::0;::::1;21067:21:1::0;21124:2;21104:18;;;21097:30;21163:20;21143:18;;;21136:48;21201:18;;52897:57:0::1;21057:168:1::0;52897:57:0::1;52982:1;52973:6;:10;52965:35;;;::::0;-1:-1:-1;;;52965:35:0;;16161:2:1;52965:35:0::1;::::0;::::1;16143:21:1::0;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:42;16271:18;;52965:35:0::1;16133:162:1::0;52965:35:0::1;53029:10;;53019:6;:20;;53011:45;;;::::0;-1:-1:-1;;;53011:45:0;;16161:2:1;53011:45:0::1;::::0;::::1;16143:21:1::0;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:42;16271:18;;53011:45:0::1;16133:162:1::0;53011:45:0::1;53087:9;53075:8;;:21;;53067:53;;;::::0;-1:-1:-1;;;53067:53:0;;15813:2:1;53067:53:0::1;::::0;::::1;15795:21:1::0;15852:2;15832:18;;;15825:30;15891:21;15871:18;;;15864:49;15930:18;;53067:53:0::1;15785:169:1::0;53067:53:0::1;53135:10;::::0;::::1;::::0;::::1;;;53131:161;;;53188:13;::::0;:29:::1;::::0;;;;::::1;::::0;::::1;23591:25:1::0;;;53221:10:0::1;::::0;-1:-1:-1;;;;;53188:13:0::1;::::0;:21:::1;::::0;23564:18:1;;53188:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53188:43:0::1;;53162:118;;;::::0;-1:-1:-1;;;53162:118:0;;22945:2:1;53162:118:0::1;::::0;::::1;22927:21:1::0;22984:2;22964:18;;;22957:30;23023:15;23003:18;;;22996:43;23056:18;;53162:118:0::1;22917:163:1::0;53162:118:0::1;27192:4:::0;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;:30;53302:49:::1;;;::::0;-1:-1:-1;;;53302:49:0;;19924:2:1;53302:49:0::1;::::0;::::1;19906:21:1::0;19963:2;19943:18;;;19936:30;20002:22;19982:18;;;19975:50;20042:18;;53302:49:0::1;19896:170:1::0;53302:49:0::1;53364:31;16289:10:::0;53388:6:::1;53364:9;:31::i;:::-;53411:28;::::0;23591:25:1;;;16289:10:0;;53411:28:::1;::::0;23579:2:1;23564:18;53411:28:0::1;;;;;;;-1:-1:-1::0;;50583:1:0;51535:7;:22;52656:791::o;54463:676::-;50627:1;51223:7;;:19;;51215:63;;;;-1:-1:-1;;;51215:63:0;;23287:2:1;51215:63:0;;;23269:21:1;23326:2;23306:18;;;23299:30;23365:33;23345:18;;;23338:61;23416:18;;51215:63:0;23259:181:1;51215:63:0;50627:1;51356:7;:18;54599:12:::1;54606:4:::0;54599:6:::1;:12::i;:::-;54591:37;;;::::0;-1:-1:-1;;;54591:37:0;;19222:2:1;54591:37:0::1;::::0;::::1;19204:21:1::0;19261:2;19241:18;;;19234:30;19300:14;19280:18;;;19273:42;19332:18;;54591:37:0::1;19194:162:1::0;54591:37:0::1;54647:15;::::0;::::1;;54639:47;;;::::0;-1:-1:-1;;;54639:47:0;;12831:2:1;54639:47:0::1;::::0;::::1;12813:21:1::0;12870:2;12850:18;;;12843:30;12909:21;12889:18;;;12882:49;12948:18;;54639:47:0::1;12803:169:1::0;54639:47:0::1;54705:20;::::0;;;:12:::1;:20;::::0;;;;;::::1;;54697:51;;;::::0;-1:-1:-1;;;54697:51:0;;14294:2:1;54697:51:0::1;::::0;::::1;14276:21:1::0;14333:2;14313:18;;;14306:30;14372:20;14352:18;;;14345:48;14410:18;;54697:51:0::1;14266:168:1::0;55147:210:0;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;27192:4;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;:30;55209:50:::1;;;::::0;-1:-1:-1;;;55209:50:0;;19924:2:1;55209:50:0::1;::::0;::::1;19906:21:1::0;19963:2;19943:18;;;19936:30;20002:22;19982:18;;;19975:50;20042:18;;55209:50:0::1;19896:170:1::0;55209:50:0::1;55272:32;16289:10:::0;55296:7:::1;55272:9;:32::i;:::-;55320:29;::::0;23591:25:1;;;16289:10:0;;55320:29:::1;::::0;23579:2:1;23564:18;55320:29:0::1;;;;;;;55147:210:::0;:::o;56126:69::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56179:8:::1;:6;:8::i;56031:87::-:0;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56100:10:::1;::::0;;-1:-1:-1;;56086:24:0;::::1;56100:10;::::0;;;::::1;;;56099:11;56086:24:::0;;::::1;;::::0;;56031:87::o;21929:104::-;21985:13;22018:7;22011:14;;;;;:::i;23833:327::-;-1:-1:-1;;;;;23968:24:0;;16289:10;23968:24;;23960:62;;;;-1:-1:-1;;;23960:62:0;;15046:2:1;23960:62:0;;;15028:21:1;15085:2;15065:18;;;15058:30;15124:27;15104:18;;;15097:55;15169:18;;23960:62:0;15018:175:1;23960:62:0;16289:10;24035:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24035:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24035:53:0;;;;;;;;;;24104:48;;11173:41:1;;;24035:42:0;;16289:10;24104:48;;11146:18:1;24104:48:0;;;;;;;23833:327;;:::o;25215:365::-;25404:41;16289:10;25437:7;25404:18;:41::i;:::-;25382:140;;;;-1:-1:-1;;;25382:140:0;;22114:2:1;25382:140:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:34;22172:18;;;22165:62;22263:19;22243:18;;;22236:47;22300:19;;25382:140:0;22086:239:1;25382:140:0;25533:39;25547:4;25553:2;25557:7;25566:5;25533:13;:39::i;:::-;25215:365;;;;:::o;58209:298::-;27192:4;27216:16;;;:7;:16;;;;;;58337:13;;-1:-1:-1;;;;;27216:16:0;58368:49;;;;-1:-1:-1;;;58368:49:0;;21432:2:1;58368:49:0;;;21414:21:1;21471:2;21451:18;;;21444:30;21510:21;21490:18;;;21483:49;21549:18;;58368:49:0;21404:169:1;58368:49:0;58459:13;58479:18;58488:8;58479;:18::i;:::-;58442:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58428:71;;58209:298;;;:::o;55365:258::-;55533:25;;9600:7:1;55533:25:0;;;9588:20:1;55426:4:0;;9624:11:1;;55533:25:0;;;;;;;;;;;;55523:36;;;;;;55492:8;55475:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;55465:37;;;;;;:94;55443:150;;;;-1:-1:-1;;;55443:150:0;;21780:2:1;55443:150:0;;;21762:21:1;21819:1;21799:18;;;21792:29;21857:8;21837:18;;;21830:36;21883:18;;55443:150:0;21752:155:1;55443:150:0;-1:-1:-1;55611:4:0;;55365:258;-1:-1:-1;55365:258:0:o;58972:383::-;59163:21;;59210:28;;;;;-1:-1:-1;;;;;9810:55:1;;;59210:28:0;;;9792:74:1;59097:4:0;;59163:21;;;;;;59202:49;;;;59163:21;;59210;;9765:18:1;;59210:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59202:49:0;;59198:93;;;59275:4;59268:11;;;;;59198:93;-1:-1:-1;;;;;24402:25:0;;;24373:4;24402:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;59308:39;59301:46;58972:383;-1:-1:-1;;;;58972:383:0:o;55835:85::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;55898:8:::1;:14:::0;55835:85::o;48555:229::-;47728:6;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;-1:-1:-1;;;;;48658:22:0;::::1;48636:110;;;::::0;-1:-1:-1;;;48636:110:0;;13179:2:1;48636:110:0::1;::::0;::::1;13161:21:1::0;13218:2;13198:18;;;13191:30;13257:34;13237:18;;;13230:62;13328:8;13308:18;;;13301:36;13354:19;;48636:110:0::1;13151:228:1::0;48636:110:0::1;48757:19;48767:8;48757:9;:19::i;:::-;48555:229:::0;:::o;57230:300::-;47728:6;;57337:12;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;57372:9:::1;57367:156;57391:7;:14;57387:1;:18;57367:156;;;57431:30;57450:7;57458:1;57450:10;;;;;;-1:-1:-1::0;;;57450:10:0::1;;;;;;;;;;;;;;;57431:18;:30::i;:::-;57427:85;;;57492:4;57482:14;;57427:85;57407:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57367:156;;56693:294:::0;47728:6;;56797:12;;-1:-1:-1;;;;;47728:6:0;16289:10;47875:23;47867:68;;;;-1:-1:-1;;;47867:68:0;;19563:2:1;47867:68:0;;;19545:21:1;;;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19693:18;;47867:68:0;19535:182:1;47867:68:0;56832:9:::1;56827:153;56851:7;:14;56847:1;:18;56827:153;;;56891:27;56907:7;56915:1;56907:10;;;;;;-1:-1:-1::0;;;56907:10:0::1;;;;;;;;;;;;;;;56891:15;:27::i;:::-;56887:82;;;56949:4;56939:14;;56887:82;56867:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56827:153;;35399:300:::0;35546:4;-1:-1:-1;;;;;;35588:50:0;;35603:35;35588:50;;:103;;;35655:36;35679:11;35655:23;:36::i;31250:174::-;31325:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;31325:29:0;-1:-1:-1;;;;;31325:29:0;;;;;;;;:24;;31379:23;31325:24;31379:14;:23::i;:::-;-1:-1:-1;;;;;31370:46:0;;;;;;;;;;;31250:174;;:::o;28215:110::-;28291:26;28301:2;28305:7;28291:26;;;;;;;;;;;;:9;:26::i;27421:452::-;27550:4;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;27572:110;;;;-1:-1:-1;;;27572:110:0;;15400:2:1;27572:110:0;;;15382:21:1;15439:2;15419:18;;;15412:30;15478:34;15458:18;;;15451:62;15549:14;15529:18;;;15522:42;15581:19;;27572:110:0;15372:234:1;27572:110:0;27693:13;27709:23;27724:7;27709:14;:23::i;:::-;27693:39;;27762:5;-1:-1:-1;;;;;27751:16:0;:7;-1:-1:-1;;;;;27751:16:0;;:64;;;;27808:7;-1:-1:-1;;;;;27784:31:0;:20;27796:7;27784:11;:20::i;:::-;-1:-1:-1;;;;;27784:31:0;;27751:64;:113;;;;27832:32;27849:5;27856:7;27832:16;:32::i;30517:615::-;30690:4;-1:-1:-1;;;;;30663:31:0;:23;30678:7;30663:14;:23::i;:::-;-1:-1:-1;;;;;30663:31:0;;30641:122;;;;-1:-1:-1;;;30641:122:0;;20273:2:1;30641:122:0;;;20255:21:1;20312:2;20292:18;;;20285:30;20351:34;20331:18;;;20324:62;20422:11;20402:18;;;20395:39;20451:19;;30641:122:0;20245:231:1;30641:122:0;-1:-1:-1;;;;;30782:16:0;;30774:65;;;;-1:-1:-1;;;30774:65:0;;14641:2:1;30774:65:0;;;14623:21:1;14680:2;14660:18;;;14653:30;14719:34;14699:18;;;14692:62;14790:6;14770:18;;;14763:34;14814:19;;30774:65:0;14613:226:1;30774:65:0;30852:39;30873:4;30879:2;30883:7;30852:20;:39::i;:::-;30956:29;30973:1;30977:7;30956:8;:29::i;:::-;-1:-1:-1;;;;;30998:15:0;;;;;;:9;:15;;;;;:20;;31017:1;;30998:15;:20;;31017:1;;30998:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31029:13:0;;;;;;:9;:13;;;;;:18;;31046:1;;31029:13;:18;;31046:1;;31029:18;:::i;:::-;;;;-1:-1:-1;;31058:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;31058:21:0;-1:-1:-1;;;;;31058:21:0;;;;;;;;;31097:27;;31058:16;;31097:27;;;;;;;30517:615;;;:::o;43857:120::-;42869:7;;-1:-1:-1;;;42869:7:0;;;;43393:41;;;;-1:-1:-1;;;43393:41:0;;11651:2:1;43393:41:0;;;11633:21:1;11690:2;11670:18;;;11663:30;11729:22;11709:18;;;11702:50;11769:18;;43393:41:0;11623:170:1;43393:41:0;43916:7:::1;:15:::0;;;::::1;::::0;;43947:22:::1;16289:10:::0;43956:12:::1;43947:22;::::0;-1:-1:-1;;;;;9810:55:1;;;9792:74;;9780:2;9765:18;43947:22:0::1;;;;;;;43857:120::o:0;48792:173::-;48867:6;;;-1:-1:-1;;;;;48884:17:0;;;-1:-1:-1;;48884:17:0;;;;;;;48917:40;;48867:6;;;48884:17;48867:6;;48917:40;;48848:16;;48917:40;48792:173;;:::o;43598:118::-;42869:7;;-1:-1:-1;;;42869:7:0;;;;43123:9;43115:38;;;;-1:-1:-1;;;43115:38:0;;16502:2:1;43115:38:0;;;16484:21:1;16541:2;16521:18;;;16514:30;16580:18;16560;;;16553:46;16616:18;;43115:38:0;16474:166:1;43115:38:0;43658:7:::1;:14:::0;;;::::1;-1:-1:-1::0;;;43658:14:0::1;::::0;;43688:20:::1;43695:12;16289:10:::0;;16209:98;26462:352;26619:28;26629:4;26635:2;26639:7;26619:9;:28::i;:::-;26680:48;26703:4;26709:2;26713:7;26722:5;26680:22;:48::i;:::-;26658:148;;;;-1:-1:-1;;;26658:148:0;;12412:2:1;26658:148:0;;;12394:21:1;12451:2;12431:18;;;12424:30;12490:34;12470:18;;;12463:62;12561:20;12541:18;;;12534:48;12599:19;;26658:148:0;12384:240:1;59363:621:0;59443:27;59492:7;59488:50;;-1:-1:-1;;59516:10:0;;;;;;;;;;;;;;;;;;59363:621::o;59488:50::-;59560:2;59548:9;59595:69;59602:6;;59595:69;;59625:5;;;;:::i;:::-;;-1:-1:-1;59645:7:0;;-1:-1:-1;59650:2:0;59645:7;;:::i;:::-;;;59595:69;;;59674:17;59704:3;59694:14;;;;;;-1:-1:-1;;;59694:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59694:14:0;-1:-1:-1;59674:34:0;-1:-1:-1;59731:3:0;59745:202;59752:7;;59745:202;;59780:5;59784:1;59780;:5;:::i;:::-;59776:9;-1:-1:-1;59800:10:0;59831:7;59836:2;59831;:7;:::i;:::-;59830:14;;59842:2;59830:14;:::i;:::-;59825:19;;:2;:19;:::i;:::-;59814:31;;:2;:31;:::i;:::-;59800:46;;59861:9;59880:4;59873:12;;59861:24;;59910:2;59900:4;59905:1;59900:7;;;;;;-1:-1:-1;;;59900:7:0;;;;;;;;;;;;:12;;;;;;;;;;-1:-1:-1;59927:8:0;59933:2;59927:8;;:::i;:::-;;;59745:202;;;;;-1:-1:-1;59971:4:0;59363:621;-1:-1:-1;;;;59363:621:0:o;56995:227::-;57075:12;57109:20;;;:12;:20;;;;;;;;57105:110;;;-1:-1:-1;57169:5:0;57146:20;;;:12;:20;;;;;:28;;-1:-1:-1;;57146:28:0;;;;57105:110;56995:227;;;:::o;56477:208::-;56536:12;56566:20;;;:12;:20;;;;;;;;56561:117;;-1:-1:-1;56603:20:0;;;;:12;:20;;;;;:27;;-1:-1:-1;;56603:27:0;56626:4;56603:27;;;;;;56626:4;56477:208::o;20591:355::-;20738:4;-1:-1:-1;;;;;;20780:40:0;;20795:25;20780:40;;:105;;-1:-1:-1;;;;;;;20837:48:0;;20852:33;20837:48;20780:105;:158;;;-1:-1:-1;19320:25:0;-1:-1:-1;;;;;;19305:40:0;;;20902:36;19146:207;28552:321;28682:18;28688:2;28692:7;28682:5;:18::i;:::-;28733:54;28764:1;28768:2;28772:7;28781:5;28733:22;:54::i;:::-;28711:154;;;;-1:-1:-1;;;28711:154:0;;12412:2:1;28711:154:0;;;12394:21:1;12451:2;12431:18;;;12424:30;12490:34;12470:18;;;12463:62;12561:20;12541:18;;;12534:48;12599:19;;28711:154:0;12384:240:1;58515:229:0;42869:7;;-1:-1:-1;;;42869:7:0;;;;43123:9;43115:38;;;;-1:-1:-1;;;43115:38:0;;16502:2:1;43115:38:0;;;16484:21:1;16541:2;16521:18;;;16514:30;16580:18;16560;;;16553:46;16616:18;;43115:38:0;16474:166:1;43115:38:0;58691:45:::1;58718:4;58724:2;58728:7;58691:26;:45::i;31989:980::-:0;32144:4;-1:-1:-1;;;;;32165:13:0;;8190:20;8238:8;32161:801;;32218:175;;-1:-1:-1;;;32218:175:0;;-1:-1:-1;;;;;32218:36:0;;;;;:175;;16289:10;;32312:4;;32339:7;;32369:5;;32218:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32218:175:0;;;;;;;;-1:-1:-1;;32218:175:0;;;;;;;;;;;;:::i;:::-;;;32197:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32576:13:0;;32572:320;;32619:108;;-1:-1:-1;;;32619:108:0;;12412:2:1;32619:108:0;;;12394:21:1;12451:2;12431:18;;;12424:30;12490:34;12470:18;;;12463:62;12561:20;12541:18;;;12534:48;12599:19;;32619:108:0;12384:240:1;32572:320:0;32842:6;32836:13;32827:6;32823:2;32819:15;32812:38;32197:710;-1:-1:-1;;;;;;32457:51:0;-1:-1:-1;;;32457:51:0;;-1:-1:-1;32450:58:0;;32161:801;-1:-1:-1;32946:4:0;31989:980;;;;;;:::o;29209:382::-;-1:-1:-1;;;;;29289:16:0;;29281:61;;;;-1:-1:-1;;;29281:61:0;;18448:2:1;29281:61:0;;;18430:21:1;;;18467:18;;;18460:30;18526:34;18506:18;;;18499:62;18578:18;;29281:61:0;18420:182:1;29281:61:0;27192:4;27216:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27216:16:0;:30;29353:58;;;;-1:-1:-1;;;29353:58:0;;13937:2:1;29353:58:0;;;13919:21:1;13976:2;13956:18;;;13949:30;14015;13995:18;;;13988:58;14063:18;;29353:58:0;13909:178:1;29353:58:0;29424:45;29453:1;29457:2;29461:7;29424:20;:45::i;:::-;-1:-1:-1;;;;;29482:13:0;;;;;;:9;:13;;;;;:18;;29499:1;;29482:13;:18;;29499:1;;29482:18;:::i;:::-;;;;-1:-1:-1;;29511:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;29511:21:0;-1:-1:-1;;;;;29511:21:0;;;;;;;;29550:33;;29511:16;;;29550:33;;29511:16;;29550:33;29209:382;;:::o;37325:589::-;-1:-1:-1;;;;;37531:18:0;;37527:187;;37566:40;37598:7;38741:10;:17;;38714:24;;;;:15;:24;;;;;:44;;;38769:24;;;;;;;;;;;;38637:164;37566:40;37527:187;;;37636:2;-1:-1:-1;;;;;37628:10:0;:4;-1:-1:-1;;;;;37628:10:0;;37624:90;;37655:47;37688:4;37694:7;37655:32;:47::i;:::-;-1:-1:-1;;;;;37728:16:0;;37724:183;;37761:45;37798:7;37761:36;:45::i;37724:183::-;37834:4;-1:-1:-1;;;;;37828:10:0;:2;-1:-1:-1;;;;;37828:10:0;;37824:83;;37855:40;37883:2;37887:7;37855:27;:40::i;39428:1002::-;39708:22;39758:1;39733:22;39750:4;39733:16;:22::i;:::-;:26;;;;:::i;:::-;39770:18;39791:26;;;:17;:26;;;;;;39708:51;;-1:-1:-1;39924:28:0;;;39920:328;;-1:-1:-1;;;;;39991:18:0;;39969:19;39991:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40042:30;;;;;;:44;;;40159:30;;:17;:30;;;;;:43;;;39920:328;-1:-1:-1;40344:26:0;;;;:17;:26;;;;;;;;40337:33;;;-1:-1:-1;;;;;40388:18:0;;;;;:12;:18;;;;;:34;;;;;;;40381:41;39428:1002::o;40725:1079::-;41003:10;:17;40978:22;;41003:21;;41023:1;;41003:21;:::i;:::-;41035:18;41056:24;;;:15;:24;;;;;;41429:10;:26;;40978:46;;-1:-1:-1;41056:24:0;;40978:46;;41429:26;;;;-1:-1:-1;;;41429:26:0;;;;;;;;;;;;;;;;;41407:48;;41493:11;41468:10;41479;41468:22;;;;;;-1:-1:-1;;;41468:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;41573:28;;;:15;:28;;;;;;;:41;;;41745:24;;;;;41738:31;41780:10;:16;;;;;-1:-1:-1;;;41780:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;40725:1079;;;;:::o;38215:221::-;38300:14;38317:20;38334:2;38317:16;:20::i;:::-;-1:-1:-1;;;;;38348:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38393:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38215:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:743::-;479:5;532:3;525:4;517:6;513:17;509:27;499:2;;554:5;547;540:20;499:2;594:6;581:20;620:4;643:18;639:2;636:26;633:2;;;665:18;;:::i;:::-;711:2;708:1;704:10;734:28;758:2;754;750:11;734:28;:::i;:::-;796:15;;;827:12;;;;859:15;;;893;;;889:24;;886:33;-1:-1:-1;883:2:1;;;936:5;929;922:20;883:2;962:5;953:14;;976:163;990:2;987:1;984:9;976:163;;;1047:17;;1035:30;;1008:1;1001:9;;;;;1085:12;;;;1117;;976:163;;;-1:-1:-1;1157:5:1;489:679;-1:-1:-1;;;;;;;489:679:1:o;1173:229::-;1216:5;1269:3;1262:4;1254:6;1250:17;1246:27;1236:2;;1291:5;1284;1277:20;1236:2;1317:79;1392:3;1383:6;1370:20;1363:4;1355:6;1351:17;1317:79;:::i;:::-;1308:88;1226:176;-1:-1:-1;;;1226:176:1:o;1407:257::-;1466:6;1519:2;1507:9;1498:7;1494:23;1490:32;1487:2;;;1540:6;1532;1525:22;1487:2;1584:9;1571:23;1603:31;1628:5;1603:31;:::i;1669:261::-;1739:6;1792:2;1780:9;1771:7;1767:23;1763:32;1760:2;;;1813:6;1805;1798:22;1760:2;1850:9;1844:16;1869:31;1894:5;1869:31;:::i;1935:398::-;2003:6;2011;2064:2;2052:9;2043:7;2039:23;2035:32;2032:2;;;2085:6;2077;2070:22;2032:2;2129:9;2116:23;2148:31;2173:5;2148:31;:::i;:::-;2198:5;-1:-1:-1;2255:2:1;2240:18;;2227:32;2268:33;2227:32;2268:33;:::i;:::-;2320:7;2310:17;;;2022:311;;;;;:::o;2338:466::-;2415:6;2423;2431;2484:2;2472:9;2463:7;2459:23;2455:32;2452:2;;;2505:6;2497;2490:22;2452:2;2549:9;2536:23;2568:31;2593:5;2568:31;:::i;:::-;2618:5;-1:-1:-1;2675:2:1;2660:18;;2647:32;2688:33;2647:32;2688:33;:::i;:::-;2442:362;;2740:7;;-1:-1:-1;;;2794:2:1;2779:18;;;;2766:32;;2442:362::o;2809:824::-;2904:6;2912;2920;2928;2981:3;2969:9;2960:7;2956:23;2952:33;2949:2;;;3003:6;2995;2988:22;2949:2;3047:9;3034:23;3066:31;3091:5;3066:31;:::i;:::-;3116:5;-1:-1:-1;3173:2:1;3158:18;;3145:32;3186:33;3145:32;3186:33;:::i;:::-;3238:7;-1:-1:-1;3292:2:1;3277:18;;3264:32;;-1:-1:-1;3347:2:1;3332:18;;3319:32;3374:18;3363:30;;3360:2;;;3411:6;3403;3396:22;3360:2;3439:22;;3492:4;3484:13;;3480:27;-1:-1:-1;3470:2:1;;3526:6;3518;3511:22;3470:2;3554:73;3619:7;3614:2;3601:16;3596:2;3592;3588:11;3554:73;:::i;:::-;3544:83;;;2939:694;;;;;;;:::o;3638:436::-;3703:6;3711;3764:2;3752:9;3743:7;3739:23;3735:32;3732:2;;;3785:6;3777;3770:22;3732:2;3829:9;3816:23;3848:31;3873:5;3848:31;:::i;:::-;3898:5;-1:-1:-1;3955:2:1;3940:18;;3927:32;3997:15;;3990:23;3978:36;;3968:2;;4033:6;4025;4018:22;4079:325;4147:6;4155;4208:2;4196:9;4187:7;4183:23;4179:32;4176:2;;;4229:6;4221;4214:22;4176:2;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4166:238:1:o;4409:368::-;4493:6;4546:2;4534:9;4525:7;4521:23;4517:32;4514:2;;;4567:6;4559;4552:22;4514:2;4612:9;4599:23;4645:18;4637:6;4634:30;4631:2;;;4682:6;4674;4667:22;4631:2;4710:61;4763:7;4754:6;4743:9;4739:22;4710:61;:::i;4782:599::-;4885:6;4893;4946:2;4934:9;4925:7;4921:23;4917:32;4914:2;;;4967:6;4959;4952:22;4914:2;5012:9;4999:23;5041:18;5082:2;5074:6;5071:14;5068:2;;;5103:6;5095;5088:22;5068:2;5131:61;5184:7;5175:6;5164:9;5160:22;5131:61;:::i;:::-;5121:71;;5245:2;5234:9;5230:18;5217:32;5201:48;;5274:2;5264:8;5261:16;5258:2;;;5295:6;5287;5280:22;5258:2;;5323:52;5367:7;5356:8;5345:9;5341:24;5323:52;:::i;:::-;5313:62;;;4904:477;;;;;:::o;5386:255::-;5444:6;5497:2;5485:9;5476:7;5472:23;5468:32;5465:2;;;5518:6;5510;5503:22;5465:2;5562:9;5549:23;5581:30;5605:5;5581:30;:::i;5646:259::-;5715:6;5768:2;5756:9;5747:7;5743:23;5739:32;5736:2;;;5789:6;5781;5774:22;5736:2;5826:9;5820:16;5845:30;5869:5;5845:30;:::i;6205:342::-;6274:6;6327:2;6315:9;6306:7;6302:23;6298:32;6295:2;;;6348:6;6340;6333:22;6295:2;6393:9;6380:23;6426:18;6418:6;6415:30;6412:2;;;6463:6;6455;6448:22;6412:2;6491:50;6533:7;6524:6;6513:9;6509:22;6491:50;:::i;6552:190::-;6611:6;6664:2;6652:9;6643:7;6639:23;6635:32;6632:2;;;6685:6;6677;6670:22;6632:2;-1:-1:-1;6713:23:1;;6622:120;-1:-1:-1;6622:120:1:o;6747:410::-;6825:6;6833;6886:2;6874:9;6865:7;6861:23;6857:32;6854:2;;;6907:6;6899;6892:22;6854:2;6948:9;6935:23;6925:33;;7009:2;6998:9;6994:18;6981:32;7036:18;7028:6;7025:30;7022:2;;;7073:6;7065;7058:22;7022:2;7101:50;7143:7;7134:6;7123:9;7119:22;7101:50;:::i;7162:257::-;7203:3;7241:5;7235:12;7268:6;7263:3;7256:19;7284:63;7340:6;7333:4;7328:3;7324:14;7317:4;7310:5;7306:16;7284:63;:::i;:::-;7401:2;7380:15;-1:-1:-1;;7376:29:1;7367:39;;;;7408:4;7363:50;;7211:208;-1:-1:-1;;7211:208:1:o;7424:185::-;7466:3;7504:5;7498:12;7519:52;7564:6;7559:3;7552:4;7545:5;7541:16;7519:52;:::i;:::-;7587:16;;;;;7474:135;-1:-1:-1;;7474:135:1:o;7733:276::-;7864:3;7902:6;7896:13;7918:53;7964:6;7959:3;7952:4;7944:6;7940:17;7918:53;:::i;:::-;7987:16;;;;;7872:137;-1:-1:-1;;7872:137:1:o;8014:1367::-;8291:3;8320;8355:6;8349:13;8385:3;8407:1;8435:9;8431:2;8427:18;8417:28;;8495:2;8484:9;8480:18;8517;8507:2;;8561:4;8553:6;8549:17;8539:27;;8507:2;8587;8635;8627:6;8624:14;8604:18;8601:38;8598:2;;;-1:-1:-1;;;8669:3:1;8662:90;8775:4;8772:1;8765:15;8805:4;8800:3;8793:17;8598:2;8836:18;8863:104;;;;8981:1;8976:322;;;;8829:469;;8863:104;-1:-1:-1;;8896:24:1;;8884:37;;8941:16;;;;-1:-1:-1;8863:104:1;;8976:322;23954:4;23973:17;;;24023:4;24007:21;;9071:3;9087:165;9101:6;9098:1;9095:13;9087:165;;;9179:14;;9166:11;;;9159:35;9222:16;;;;9116:10;;9087:165;;;9091:3;;9281:6;9276:3;9272:16;9265:23;;8829:469;;;;;;;9314:61;9340:34;9370:3;7691;7679:16;;7720:1;7711:11;;7669:59;9340:34;9332:6;9314:61;:::i;:::-;9307:68;8299:1082;-1:-1:-1;;;;;8299:1082:1:o;9877:511::-;10071:4;-1:-1:-1;;;;;10181:2:1;10173:6;10169:15;10158:9;10151:34;10233:2;10225:6;10221:15;10216:2;10205:9;10201:18;10194:43;;10273:6;10268:2;10257:9;10253:18;10246:34;10316:3;10311:2;10300:9;10296:18;10289:31;10337:45;10377:3;10366:9;10362:19;10354:6;10337:45;:::i;:::-;10329:53;10080:308;-1:-1:-1;;;;;;10080:308:1:o;10393:635::-;10564:2;10616:21;;;10686:13;;10589:18;;;10708:22;;;10535:4;;10564:2;10787:15;;;;10761:2;10746:18;;;10535:4;10833:169;10847:6;10844:1;10841:13;10833:169;;;10908:13;;10896:26;;10977:15;;;;10942:12;;;;10869:1;10862:9;10833:169;;;-1:-1:-1;11019:3:1;;10544:484;-1:-1:-1;;;;;;10544:484:1:o;11225:219::-;11374:2;11363:9;11356:21;11337:4;11394:44;11434:2;11423:9;11419:18;11411:6;11394:44;:::i;23627:275::-;23698:2;23692:9;23763:2;23744:13;;-1:-1:-1;;23740:27:1;23728:40;;23798:18;23783:34;;23819:22;;;23780:62;23777:2;;;23845:18;;:::i;:::-;23881:2;23874:22;23672:230;;-1:-1:-1;23672:230:1:o;24039:128::-;24079:3;24110:1;24106:6;24103:1;24100:13;24097:2;;;24116:18;;:::i;:::-;-1:-1:-1;24152:9:1;;24087:80::o;24172:204::-;24210:3;24246:4;24243:1;24239:12;24278:4;24275:1;24271:12;24313:3;24307:4;24303:14;24298:3;24295:23;24292:2;;;24321:18;;:::i;:::-;24357:13;;24218:158;-1:-1:-1;;;24218:158:1:o;24381:274::-;24421:1;24447;24437:2;;-1:-1:-1;;;24479:1:1;24472:88;24583:4;24580:1;24573:15;24611:4;24608:1;24601:15;24437:2;-1:-1:-1;24640:9:1;;24427:228::o;24660:168::-;24700:7;24766:1;24762;24758:6;24754:14;24751:1;24748:21;24743:1;24736:9;24729:17;24725:45;24722:2;;;24773:18;;:::i;:::-;-1:-1:-1;24813:9:1;;24712:116::o;24833:125::-;24873:4;24901:1;24898;24895:8;24892:2;;;24906:18;;:::i;:::-;-1:-1:-1;24943:9:1;;24882:76::o;24963:258::-;25035:1;25045:113;25059:6;25056:1;25053:13;25045:113;;;25135:11;;;25129:18;25116:11;;;25109:39;25081:2;25074:10;25045:113;;;25176:6;25173:1;25170:13;25167:2;;;-1:-1:-1;;25211:1:1;25193:16;;25186:27;25016:205::o;25226:437::-;25305:1;25301:12;;;;25348;;;25369:2;;25423:4;25415:6;25411:17;25401:27;;25369:2;25476;25468:6;25465:14;25445:18;25442:38;25439:2;;;-1:-1:-1;;;25510:1:1;25503:88;25614:4;25611:1;25604:15;25642:4;25639:1;25632:15;25668:135;25707:3;-1:-1:-1;;25728:17:1;;25725:2;;;25748:18;;:::i;:::-;-1:-1:-1;25795:1:1;25784:13;;25715:88::o;25808:184::-;-1:-1:-1;;;25857:1:1;25850:88;25957:4;25954:1;25947:15;25981:4;25978:1;25971:15;25997:184;-1:-1:-1;;;26046:1:1;26039:88;26146:4;26143:1;26136:15;26170:4;26167:1;26160:15;26186:154;-1:-1:-1;;;;;26265:5:1;26261:54;26254:5;26251:65;26241:2;;26330:1;26327;26320:12;26345:177;-1:-1:-1;;;;;;26423:5:1;26419:78;26412:5;26409:89;26399:2;;26512:1;26509;26502:12

Swarm Source

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