ETH Price: $3,650.54 (-6.01%)

Token

Trippy GAN Toadz (TGAN)
 

Overview

Max Total Supply

0 TGAN

Holders

1,423

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
moonjeet.eth
Balance
10 TGAN
0x071108b08ba8ced39f331a2b565ecd923b7aceb4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
mint_tgan

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-09
*/

/**
 *Submitted for verification at Etherscan.io on 2022-01-06
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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




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


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



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


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


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


abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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


abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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


library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

contract mint_tgan is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenSupply;
    uint256 public constant MAX_SUPPLY = 5038;
    bool public saleIsActive = false;
    string private _baseTokenURI;
    constructor() ERC721("Trippy GAN Toadz", "TGAN") public { }
    function mint() public {
        require(saleIsActive, "No tgans 4 u yet");

        uint256 mintIndex = _tokenSupply.current() + 1;
        require(mintIndex <= MAX_SUPPLY, "No more tgans!");

        _tokenSupply.increment();
        _safeMint(msg.sender, mintIndex);
    }
    function remainingSupply() public view returns (uint256) {
        return MAX_SUPPLY - _tokenSupply.current();
    }
    function tokenSupply() public view returns (uint256) {
        return _tokenSupply.current();
    }
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }
    function toggleSale() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60806040526000600860006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601081526020017f5472697070792047414e20546f61647a000000000000000000000000000000008152506040518060400160405280600481526020017f5447414e000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b1929190620001c1565b508060019080519060200190620000ca929190620001c1565b505050620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61311480620002e66000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063b88d4fde1161007c578063b88d4fde14610352578063c87b56dd1461036e578063da0239a61461039e578063e985e9c5146103bc578063eb8d2444146103ec578063f2fde38b1461040a5761014d565b8063715018a6146102c85780637824407f146102d25780637d8966e4146102f05780638da5cb5b146102fa57806395d89b4114610318578063a22cb465146103365761014d565b806323b872dd1161011557806323b872dd146101f657806332cb6b0c1461021257806342842e0e1461023057806355f804b31461024c5780636352211e1461026857806370a08231146102985761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c60048036038101906101679190612077565b610426565b6040516101799190612518565b60405180910390f35b61018a610508565b6040516101979190612533565b60405180910390f35b6101ba60048036038101906101b5919061211a565b61059a565b6040516101c791906124b1565b60405180910390f35b6101ea60048036038101906101e59190612037565b61061f565b005b6101f4610737565b005b610210600480360381019061020b9190611f21565b6107fc565b005b61021a61085c565b6040516102279190612795565b60405180910390f35b61024a60048036038101906102459190611f21565b610862565b005b610266600480360381019061026191906120d1565b610882565b005b610282600480360381019061027d919061211a565b610918565b60405161028f91906124b1565b60405180910390f35b6102b260048036038101906102ad9190611eb4565b6109ca565b6040516102bf9190612795565b60405180910390f35b6102d0610a82565b005b6102da610b0a565b6040516102e79190612795565b60405180910390f35b6102f8610b1b565b005b610302610bc3565b60405161030f91906124b1565b60405180910390f35b610320610bed565b60405161032d9190612533565b60405180910390f35b610350600480360381019061034b9190611ff7565b610c7f565b005b61036c60048036038101906103679190611f74565b610c95565b005b6103886004803603810190610383919061211a565b610cf7565b6040516103959190612533565b60405180910390f35b6103a6610d9e565b6040516103b39190612795565b60405180910390f35b6103d660048036038101906103d19190611ee1565b610dbc565b6040516103e39190612518565b60405180910390f35b6103f4610e50565b6040516104019190612518565b60405180910390f35b610424600480360381019061041f9190611eb4565b610e63565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104f157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610501575061050082610f5b565b5b9050919050565b606060008054610517906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610543906129eb565b80156105905780601f1061056557610100808354040283529160200191610590565b820191906000526020600020905b81548152906001019060200180831161057357829003601f168201915b5050505050905090565b60006105a582610fc5565b6105e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105db906126d5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062a82610918565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290612755565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ba611031565b73ffffffffffffffffffffffffffffffffffffffff1614806106e957506106e8816106e3611031565b610dbc565b5b610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612655565b60405180910390fd5b6107328383611039565b505050565b600860009054906101000a900460ff16610786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077d906125d5565b60405180910390fd5b6000600161079460076110f2565b61079e919061287a565b90506113ae8111156107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90612595565b60405180910390fd5b6107ef6007611100565b6107f93382611116565b50565b61080d610807611031565b82611134565b61084c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084390612775565b60405180910390fd5b610857838383611212565b505050565b6113ae81565b61087d83838360405180602001604052806000815250610c95565b505050565b61088a611031565b73ffffffffffffffffffffffffffffffffffffffff166108a8610bc3565b73ffffffffffffffffffffffffffffffffffffffff16146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f5906126f5565b60405180910390fd5b8060099080519060200190610914929190611cc8565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b890612695565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612675565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a8a611031565b73ffffffffffffffffffffffffffffffffffffffff16610aa8610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906126f5565b60405180910390fd5b610b08600061146e565b565b6000610b1660076110f2565b905090565b610b23611031565b73ffffffffffffffffffffffffffffffffffffffff16610b41610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906126f5565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bfc906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c28906129eb565b8015610c755780601f10610c4a57610100808354040283529160200191610c75565b820191906000526020600020905b815481529060010190602001808311610c5857829003601f168201915b5050505050905090565b610c91610c8a611031565b8383611534565b5050565b610ca6610ca0611031565b83611134565b610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90612775565b60405180910390fd5b610cf1848484846116a1565b50505050565b6060610d0282610fc5565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890612735565b60405180910390fd5b6000610d4b6116fd565b90506000815111610d6b5760405180602001604052806000815250610d96565b80610d758461178f565b604051602001610d8692919061248d565b6040516020818303038152906040525b915050919050565b6000610daa60076110f2565b6113ae610db79190612901565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900460ff1681565b610e6b611031565b73ffffffffffffffffffffffffffffffffffffffff16610e89610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed6906126f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690612575565b60405180910390fd5b610f588161146e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110ac83610918565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6111308282604051806020016040528060008152506118f0565b5050565b600061113f82610fc5565b61117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612635565b60405180910390fd5b600061118983610918565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111f857508373ffffffffffffffffffffffffffffffffffffffff166111e08461059a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061120957506112088185610dbc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661123282610918565b73ffffffffffffffffffffffffffffffffffffffff1614611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127f90612715565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906125f5565b60405180910390fd5b61130383838361194b565b61130e600082611039565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461135e9190612901565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113b5919061287a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90612615565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116949190612518565b60405180910390a3505050565b6116ac848484611212565b6116b884848484611950565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90612555565b60405180910390fd5b50505050565b60606009805461170c906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611738906129eb565b80156117855780601f1061175a57610100808354040283529160200191611785565b820191906000526020600020905b81548152906001019060200180831161176857829003601f168201915b5050505050905090565b606060008214156117d7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118eb565b600082905060005b600082146118095780806117f290612a4e565b915050600a8261180291906128d0565b91506117df565b60008167ffffffffffffffff81111561182557611824612b84565b5b6040519080825280601f01601f1916602001820160405280156118575781602001600182028036833780820191505090505b5090505b600085146118e4576001826118709190612901565b9150600a8561187f9190612a97565b603061188b919061287a565b60f81b8183815181106118a1576118a0612b55565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118dd91906128d0565b945061185b565b8093505050505b919050565b6118fa8383611ae7565b6119076000848484611950565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612555565b60405180910390fd5b505050565b505050565b60006119718473ffffffffffffffffffffffffffffffffffffffff16611cb5565b15611ada578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261199a611031565b8786866040518563ffffffff1660e01b81526004016119bc94939291906124cc565b602060405180830381600087803b1580156119d657600080fd5b505af1925050508015611a0757506040513d601f19601f82011682018060405250810190611a0491906120a4565b60015b611a8a573d8060008114611a37576040519150601f19603f3d011682016040523d82523d6000602084013e611a3c565b606091505b50600081511415611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7990612555565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611adf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e906126b5565b60405180910390fd5b611b6081610fc5565b15611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906125b5565b60405180910390fd5b611bac6000838361194b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bfc919061287a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611cd4906129eb565b90600052602060002090601f016020900481019282611cf65760008555611d3d565b82601f10611d0f57805160ff1916838001178555611d3d565b82800160010185558215611d3d579182015b82811115611d3c578251825591602001919060010190611d21565b5b509050611d4a9190611d4e565b5090565b5b80821115611d67576000816000905550600101611d4f565b5090565b6000611d7e611d79846127d5565b6127b0565b905082815260208101848484011115611d9a57611d99612bb8565b5b611da58482856129a9565b509392505050565b6000611dc0611dbb84612806565b6127b0565b905082815260208101848484011115611ddc57611ddb612bb8565b5b611de78482856129a9565b509392505050565b600081359050611dfe81613082565b92915050565b600081359050611e1381613099565b92915050565b600081359050611e28816130b0565b92915050565b600081519050611e3d816130b0565b92915050565b600082601f830112611e5857611e57612bb3565b5b8135611e68848260208601611d6b565b91505092915050565b600082601f830112611e8657611e85612bb3565b5b8135611e96848260208601611dad565b91505092915050565b600081359050611eae816130c7565b92915050565b600060208284031215611eca57611ec9612bc2565b5b6000611ed884828501611def565b91505092915050565b60008060408385031215611ef857611ef7612bc2565b5b6000611f0685828601611def565b9250506020611f1785828601611def565b9150509250929050565b600080600060608486031215611f3a57611f39612bc2565b5b6000611f4886828701611def565b9350506020611f5986828701611def565b9250506040611f6a86828701611e9f565b9150509250925092565b60008060008060808587031215611f8e57611f8d612bc2565b5b6000611f9c87828801611def565b9450506020611fad87828801611def565b9350506040611fbe87828801611e9f565b925050606085013567ffffffffffffffff811115611fdf57611fde612bbd565b5b611feb87828801611e43565b91505092959194509250565b6000806040838503121561200e5761200d612bc2565b5b600061201c85828601611def565b925050602061202d85828601611e04565b9150509250929050565b6000806040838503121561204e5761204d612bc2565b5b600061205c85828601611def565b925050602061206d85828601611e9f565b9150509250929050565b60006020828403121561208d5761208c612bc2565b5b600061209b84828501611e19565b91505092915050565b6000602082840312156120ba576120b9612bc2565b5b60006120c884828501611e2e565b91505092915050565b6000602082840312156120e7576120e6612bc2565b5b600082013567ffffffffffffffff81111561210557612104612bbd565b5b61211184828501611e71565b91505092915050565b6000602082840312156121305761212f612bc2565b5b600061213e84828501611e9f565b91505092915050565b61215081612935565b82525050565b61215f81612947565b82525050565b600061217082612837565b61217a818561284d565b935061218a8185602086016129b8565b61219381612bc7565b840191505092915050565b60006121a982612842565b6121b3818561285e565b93506121c38185602086016129b8565b6121cc81612bc7565b840191505092915050565b60006121e282612842565b6121ec818561286f565b93506121fc8185602086016129b8565b80840191505092915050565b600061221560328361285e565b915061222082612bd8565b604082019050919050565b600061223860268361285e565b915061224382612c27565b604082019050919050565b600061225b600e8361285e565b915061226682612c76565b602082019050919050565b600061227e601c8361285e565b915061228982612c9f565b602082019050919050565b60006122a160108361285e565b91506122ac82612cc8565b602082019050919050565b60006122c460248361285e565b91506122cf82612cf1565b604082019050919050565b60006122e760198361285e565b91506122f282612d40565b602082019050919050565b600061230a602c8361285e565b915061231582612d69565b604082019050919050565b600061232d60388361285e565b915061233882612db8565b604082019050919050565b6000612350602a8361285e565b915061235b82612e07565b604082019050919050565b600061237360298361285e565b915061237e82612e56565b604082019050919050565b600061239660208361285e565b91506123a182612ea5565b602082019050919050565b60006123b9602c8361285e565b91506123c482612ece565b604082019050919050565b60006123dc60208361285e565b91506123e782612f1d565b602082019050919050565b60006123ff60298361285e565b915061240a82612f46565b604082019050919050565b6000612422602f8361285e565b915061242d82612f95565b604082019050919050565b600061244560218361285e565b915061245082612fe4565b604082019050919050565b600061246860318361285e565b915061247382613033565b604082019050919050565b6124878161299f565b82525050565b600061249982856121d7565b91506124a582846121d7565b91508190509392505050565b60006020820190506124c66000830184612147565b92915050565b60006080820190506124e16000830187612147565b6124ee6020830186612147565b6124fb604083018561247e565b818103606083015261250d8184612165565b905095945050505050565b600060208201905061252d6000830184612156565b92915050565b6000602082019050818103600083015261254d818461219e565b905092915050565b6000602082019050818103600083015261256e81612208565b9050919050565b6000602082019050818103600083015261258e8161222b565b9050919050565b600060208201905081810360008301526125ae8161224e565b9050919050565b600060208201905081810360008301526125ce81612271565b9050919050565b600060208201905081810360008301526125ee81612294565b9050919050565b6000602082019050818103600083015261260e816122b7565b9050919050565b6000602082019050818103600083015261262e816122da565b9050919050565b6000602082019050818103600083015261264e816122fd565b9050919050565b6000602082019050818103600083015261266e81612320565b9050919050565b6000602082019050818103600083015261268e81612343565b9050919050565b600060208201905081810360008301526126ae81612366565b9050919050565b600060208201905081810360008301526126ce81612389565b9050919050565b600060208201905081810360008301526126ee816123ac565b9050919050565b6000602082019050818103600083015261270e816123cf565b9050919050565b6000602082019050818103600083015261272e816123f2565b9050919050565b6000602082019050818103600083015261274e81612415565b9050919050565b6000602082019050818103600083015261276e81612438565b9050919050565b6000602082019050818103600083015261278e8161245b565b9050919050565b60006020820190506127aa600083018461247e565b92915050565b60006127ba6127cb565b90506127c68282612a1d565b919050565b6000604051905090565b600067ffffffffffffffff8211156127f0576127ef612b84565b5b6127f982612bc7565b9050602081019050919050565b600067ffffffffffffffff82111561282157612820612b84565b5b61282a82612bc7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128858261299f565b91506128908361299f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128c5576128c4612ac8565b5b828201905092915050565b60006128db8261299f565b91506128e68361299f565b9250826128f6576128f5612af7565b5b828204905092915050565b600061290c8261299f565b91506129178361299f565b92508282101561292a57612929612ac8565b5b828203905092915050565b60006129408261297f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156129d65780820151818401526020810190506129bb565b838111156129e5576000848401525b50505050565b60006002820490506001821680612a0357607f821691505b60208210811415612a1757612a16612b26565b5b50919050565b612a2682612bc7565b810181811067ffffffffffffffff82111715612a4557612a44612b84565b5b80604052505050565b6000612a598261299f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8c57612a8b612ac8565b5b600182019050919050565b6000612aa28261299f565b9150612aad8361299f565b925082612abd57612abc612af7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207467616e7321000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f207467616e73203420752079657400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61308b81612935565b811461309657600080fd5b50565b6130a281612947565b81146130ad57600080fd5b50565b6130b981612953565b81146130c457600080fd5b50565b6130d08161299f565b81146130db57600080fd5b5056fea264697066735822122037289ffb0ae3d97e3ec428207eb702f950d572fe76dec7b7040d78aaff168fc964736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063b88d4fde1161007c578063b88d4fde14610352578063c87b56dd1461036e578063da0239a61461039e578063e985e9c5146103bc578063eb8d2444146103ec578063f2fde38b1461040a5761014d565b8063715018a6146102c85780637824407f146102d25780637d8966e4146102f05780638da5cb5b146102fa57806395d89b4114610318578063a22cb465146103365761014d565b806323b872dd1161011557806323b872dd146101f657806332cb6b0c1461021257806342842e0e1461023057806355f804b31461024c5780636352211e1461026857806370a08231146102985761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c60048036038101906101679190612077565b610426565b6040516101799190612518565b60405180910390f35b61018a610508565b6040516101979190612533565b60405180910390f35b6101ba60048036038101906101b5919061211a565b61059a565b6040516101c791906124b1565b60405180910390f35b6101ea60048036038101906101e59190612037565b61061f565b005b6101f4610737565b005b610210600480360381019061020b9190611f21565b6107fc565b005b61021a61085c565b6040516102279190612795565b60405180910390f35b61024a60048036038101906102459190611f21565b610862565b005b610266600480360381019061026191906120d1565b610882565b005b610282600480360381019061027d919061211a565b610918565b60405161028f91906124b1565b60405180910390f35b6102b260048036038101906102ad9190611eb4565b6109ca565b6040516102bf9190612795565b60405180910390f35b6102d0610a82565b005b6102da610b0a565b6040516102e79190612795565b60405180910390f35b6102f8610b1b565b005b610302610bc3565b60405161030f91906124b1565b60405180910390f35b610320610bed565b60405161032d9190612533565b60405180910390f35b610350600480360381019061034b9190611ff7565b610c7f565b005b61036c60048036038101906103679190611f74565b610c95565b005b6103886004803603810190610383919061211a565b610cf7565b6040516103959190612533565b60405180910390f35b6103a6610d9e565b6040516103b39190612795565b60405180910390f35b6103d660048036038101906103d19190611ee1565b610dbc565b6040516103e39190612518565b60405180910390f35b6103f4610e50565b6040516104019190612518565b60405180910390f35b610424600480360381019061041f9190611eb4565b610e63565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104f157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610501575061050082610f5b565b5b9050919050565b606060008054610517906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610543906129eb565b80156105905780601f1061056557610100808354040283529160200191610590565b820191906000526020600020905b81548152906001019060200180831161057357829003601f168201915b5050505050905090565b60006105a582610fc5565b6105e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105db906126d5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062a82610918565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290612755565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ba611031565b73ffffffffffffffffffffffffffffffffffffffff1614806106e957506106e8816106e3611031565b610dbc565b5b610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612655565b60405180910390fd5b6107328383611039565b505050565b600860009054906101000a900460ff16610786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077d906125d5565b60405180910390fd5b6000600161079460076110f2565b61079e919061287a565b90506113ae8111156107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90612595565b60405180910390fd5b6107ef6007611100565b6107f93382611116565b50565b61080d610807611031565b82611134565b61084c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084390612775565b60405180910390fd5b610857838383611212565b505050565b6113ae81565b61087d83838360405180602001604052806000815250610c95565b505050565b61088a611031565b73ffffffffffffffffffffffffffffffffffffffff166108a8610bc3565b73ffffffffffffffffffffffffffffffffffffffff16146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f5906126f5565b60405180910390fd5b8060099080519060200190610914929190611cc8565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b890612695565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612675565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a8a611031565b73ffffffffffffffffffffffffffffffffffffffff16610aa8610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906126f5565b60405180910390fd5b610b08600061146e565b565b6000610b1660076110f2565b905090565b610b23611031565b73ffffffffffffffffffffffffffffffffffffffff16610b41610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e906126f5565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610bfc906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c28906129eb565b8015610c755780601f10610c4a57610100808354040283529160200191610c75565b820191906000526020600020905b815481529060010190602001808311610c5857829003601f168201915b5050505050905090565b610c91610c8a611031565b8383611534565b5050565b610ca6610ca0611031565b83611134565b610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90612775565b60405180910390fd5b610cf1848484846116a1565b50505050565b6060610d0282610fc5565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890612735565b60405180910390fd5b6000610d4b6116fd565b90506000815111610d6b5760405180602001604052806000815250610d96565b80610d758461178f565b604051602001610d8692919061248d565b6040516020818303038152906040525b915050919050565b6000610daa60076110f2565b6113ae610db79190612901565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900460ff1681565b610e6b611031565b73ffffffffffffffffffffffffffffffffffffffff16610e89610bc3565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed6906126f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690612575565b60405180910390fd5b610f588161146e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110ac83610918565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6111308282604051806020016040528060008152506118f0565b5050565b600061113f82610fc5565b61117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590612635565b60405180910390fd5b600061118983610918565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111f857508373ffffffffffffffffffffffffffffffffffffffff166111e08461059a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061120957506112088185610dbc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661123282610918565b73ffffffffffffffffffffffffffffffffffffffff1614611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127f90612715565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906125f5565b60405180910390fd5b61130383838361194b565b61130e600082611039565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461135e9190612901565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113b5919061287a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90612615565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116949190612518565b60405180910390a3505050565b6116ac848484611212565b6116b884848484611950565b6116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90612555565b60405180910390fd5b50505050565b60606009805461170c906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611738906129eb565b80156117855780601f1061175a57610100808354040283529160200191611785565b820191906000526020600020905b81548152906001019060200180831161176857829003601f168201915b5050505050905090565b606060008214156117d7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118eb565b600082905060005b600082146118095780806117f290612a4e565b915050600a8261180291906128d0565b91506117df565b60008167ffffffffffffffff81111561182557611824612b84565b5b6040519080825280601f01601f1916602001820160405280156118575781602001600182028036833780820191505090505b5090505b600085146118e4576001826118709190612901565b9150600a8561187f9190612a97565b603061188b919061287a565b60f81b8183815181106118a1576118a0612b55565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118dd91906128d0565b945061185b565b8093505050505b919050565b6118fa8383611ae7565b6119076000848484611950565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90612555565b60405180910390fd5b505050565b505050565b60006119718473ffffffffffffffffffffffffffffffffffffffff16611cb5565b15611ada578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261199a611031565b8786866040518563ffffffff1660e01b81526004016119bc94939291906124cc565b602060405180830381600087803b1580156119d657600080fd5b505af1925050508015611a0757506040513d601f19601f82011682018060405250810190611a0491906120a4565b60015b611a8a573d8060008114611a37576040519150601f19603f3d011682016040523d82523d6000602084013e611a3c565b606091505b50600081511415611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7990612555565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611adf565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e906126b5565b60405180910390fd5b611b6081610fc5565b15611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b97906125b5565b60405180910390fd5b611bac6000838361194b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bfc919061287a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611cd4906129eb565b90600052602060002090601f016020900481019282611cf65760008555611d3d565b82601f10611d0f57805160ff1916838001178555611d3d565b82800160010185558215611d3d579182015b82811115611d3c578251825591602001919060010190611d21565b5b509050611d4a9190611d4e565b5090565b5b80821115611d67576000816000905550600101611d4f565b5090565b6000611d7e611d79846127d5565b6127b0565b905082815260208101848484011115611d9a57611d99612bb8565b5b611da58482856129a9565b509392505050565b6000611dc0611dbb84612806565b6127b0565b905082815260208101848484011115611ddc57611ddb612bb8565b5b611de78482856129a9565b509392505050565b600081359050611dfe81613082565b92915050565b600081359050611e1381613099565b92915050565b600081359050611e28816130b0565b92915050565b600081519050611e3d816130b0565b92915050565b600082601f830112611e5857611e57612bb3565b5b8135611e68848260208601611d6b565b91505092915050565b600082601f830112611e8657611e85612bb3565b5b8135611e96848260208601611dad565b91505092915050565b600081359050611eae816130c7565b92915050565b600060208284031215611eca57611ec9612bc2565b5b6000611ed884828501611def565b91505092915050565b60008060408385031215611ef857611ef7612bc2565b5b6000611f0685828601611def565b9250506020611f1785828601611def565b9150509250929050565b600080600060608486031215611f3a57611f39612bc2565b5b6000611f4886828701611def565b9350506020611f5986828701611def565b9250506040611f6a86828701611e9f565b9150509250925092565b60008060008060808587031215611f8e57611f8d612bc2565b5b6000611f9c87828801611def565b9450506020611fad87828801611def565b9350506040611fbe87828801611e9f565b925050606085013567ffffffffffffffff811115611fdf57611fde612bbd565b5b611feb87828801611e43565b91505092959194509250565b6000806040838503121561200e5761200d612bc2565b5b600061201c85828601611def565b925050602061202d85828601611e04565b9150509250929050565b6000806040838503121561204e5761204d612bc2565b5b600061205c85828601611def565b925050602061206d85828601611e9f565b9150509250929050565b60006020828403121561208d5761208c612bc2565b5b600061209b84828501611e19565b91505092915050565b6000602082840312156120ba576120b9612bc2565b5b60006120c884828501611e2e565b91505092915050565b6000602082840312156120e7576120e6612bc2565b5b600082013567ffffffffffffffff81111561210557612104612bbd565b5b61211184828501611e71565b91505092915050565b6000602082840312156121305761212f612bc2565b5b600061213e84828501611e9f565b91505092915050565b61215081612935565b82525050565b61215f81612947565b82525050565b600061217082612837565b61217a818561284d565b935061218a8185602086016129b8565b61219381612bc7565b840191505092915050565b60006121a982612842565b6121b3818561285e565b93506121c38185602086016129b8565b6121cc81612bc7565b840191505092915050565b60006121e282612842565b6121ec818561286f565b93506121fc8185602086016129b8565b80840191505092915050565b600061221560328361285e565b915061222082612bd8565b604082019050919050565b600061223860268361285e565b915061224382612c27565b604082019050919050565b600061225b600e8361285e565b915061226682612c76565b602082019050919050565b600061227e601c8361285e565b915061228982612c9f565b602082019050919050565b60006122a160108361285e565b91506122ac82612cc8565b602082019050919050565b60006122c460248361285e565b91506122cf82612cf1565b604082019050919050565b60006122e760198361285e565b91506122f282612d40565b602082019050919050565b600061230a602c8361285e565b915061231582612d69565b604082019050919050565b600061232d60388361285e565b915061233882612db8565b604082019050919050565b6000612350602a8361285e565b915061235b82612e07565b604082019050919050565b600061237360298361285e565b915061237e82612e56565b604082019050919050565b600061239660208361285e565b91506123a182612ea5565b602082019050919050565b60006123b9602c8361285e565b91506123c482612ece565b604082019050919050565b60006123dc60208361285e565b91506123e782612f1d565b602082019050919050565b60006123ff60298361285e565b915061240a82612f46565b604082019050919050565b6000612422602f8361285e565b915061242d82612f95565b604082019050919050565b600061244560218361285e565b915061245082612fe4565b604082019050919050565b600061246860318361285e565b915061247382613033565b604082019050919050565b6124878161299f565b82525050565b600061249982856121d7565b91506124a582846121d7565b91508190509392505050565b60006020820190506124c66000830184612147565b92915050565b60006080820190506124e16000830187612147565b6124ee6020830186612147565b6124fb604083018561247e565b818103606083015261250d8184612165565b905095945050505050565b600060208201905061252d6000830184612156565b92915050565b6000602082019050818103600083015261254d818461219e565b905092915050565b6000602082019050818103600083015261256e81612208565b9050919050565b6000602082019050818103600083015261258e8161222b565b9050919050565b600060208201905081810360008301526125ae8161224e565b9050919050565b600060208201905081810360008301526125ce81612271565b9050919050565b600060208201905081810360008301526125ee81612294565b9050919050565b6000602082019050818103600083015261260e816122b7565b9050919050565b6000602082019050818103600083015261262e816122da565b9050919050565b6000602082019050818103600083015261264e816122fd565b9050919050565b6000602082019050818103600083015261266e81612320565b9050919050565b6000602082019050818103600083015261268e81612343565b9050919050565b600060208201905081810360008301526126ae81612366565b9050919050565b600060208201905081810360008301526126ce81612389565b9050919050565b600060208201905081810360008301526126ee816123ac565b9050919050565b6000602082019050818103600083015261270e816123cf565b9050919050565b6000602082019050818103600083015261272e816123f2565b9050919050565b6000602082019050818103600083015261274e81612415565b9050919050565b6000602082019050818103600083015261276e81612438565b9050919050565b6000602082019050818103600083015261278e8161245b565b9050919050565b60006020820190506127aa600083018461247e565b92915050565b60006127ba6127cb565b90506127c68282612a1d565b919050565b6000604051905090565b600067ffffffffffffffff8211156127f0576127ef612b84565b5b6127f982612bc7565b9050602081019050919050565b600067ffffffffffffffff82111561282157612820612b84565b5b61282a82612bc7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128858261299f565b91506128908361299f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128c5576128c4612ac8565b5b828201905092915050565b60006128db8261299f565b91506128e68361299f565b9250826128f6576128f5612af7565b5b828204905092915050565b600061290c8261299f565b91506129178361299f565b92508282101561292a57612929612ac8565b5b828203905092915050565b60006129408261297f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156129d65780820151818401526020810190506129bb565b838111156129e5576000848401525b50505050565b60006002820490506001821680612a0357607f821691505b60208210811415612a1757612a16612b26565b5b50919050565b612a2682612bc7565b810181811067ffffffffffffffff82111715612a4557612a44612b84565b5b80604052505050565b6000612a598261299f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8c57612a8b612ac8565b5b600182019050919050565b6000612aa28261299f565b9150612aad8361299f565b925082612abd57612abc612af7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207467616e7321000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f207467616e73203420752079657400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61308b81612935565b811461309657600080fd5b50565b6130a281612947565b81146130ad57600080fd5b50565b6130b981612953565b81146130c457600080fd5b50565b6130d08161299f565b81146130db57600080fd5b5056fea264697066735822122037289ffb0ae3d97e3ec428207eb702f950d572fe76dec7b7040d78aaff168fc964736f6c63430008070033

Deployed Bytecode Sourcemap

33737:1157:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18409:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19354:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20913:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20436:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34055:283;;;:::i;:::-;;21663:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33868:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22073:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34695:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19048:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18778:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31914:103;;;:::i;:::-;;34468:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34805:86;;;:::i;:::-;;31263:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19523:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21206:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22329:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19698:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34344:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21432:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33916:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32172:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18409:305;18511:4;18563:25;18548:40;;;:11;:40;;;;:105;;;;18620:33;18605:48;;;:11;:48;;;;18548:105;:158;;;;18670:36;18694:11;18670:23;:36::i;:::-;18548:158;18528:178;;18409:305;;;:::o;19354:100::-;19408:13;19441:5;19434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19354:100;:::o;20913:221::-;20989:7;21017:16;21025:7;21017;:16::i;:::-;21009:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21102:15;:24;21118:7;21102:24;;;;;;;;;;;;;;;;;;;;;21095:31;;20913:221;;;:::o;20436:411::-;20517:13;20533:23;20548:7;20533:14;:23::i;:::-;20517:39;;20581:5;20575:11;;:2;:11;;;;20567:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;20675:5;20659:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20684:37;20701:5;20708:12;:10;:12::i;:::-;20684:16;:37::i;:::-;20659:62;20637:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;20818:21;20827:2;20831:7;20818:8;:21::i;:::-;20506:341;20436:411;;:::o;34055:283::-;34097:12;;;;;;;;;;;34089:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34143:17;34188:1;34163:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;34143:46;;33905:4;34208:9;:23;;34200:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;34263:24;:12;:22;:24::i;:::-;34298:32;34308:10;34320:9;34298;:32::i;:::-;34078:260;34055:283::o;21663:339::-;21858:41;21877:12;:10;:12::i;:::-;21891:7;21858:18;:41::i;:::-;21850:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21966:28;21976:4;21982:2;21986:7;21966:9;:28::i;:::-;21663:339;;;:::o;33868:41::-;33905:4;33868:41;:::o;22073:185::-;22211:39;22228:4;22234:2;22238:7;22211:39;;;;;;;;;;;;:16;:39::i;:::-;22073:185;;;:::o;34695:104::-;31494:12;:10;:12::i;:::-;31483:23;;:7;:5;:7::i;:::-;:23;;;31475:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34784:7:::1;34768:13;:23;;;;;;;;;;;;:::i;:::-;;34695:104:::0;:::o;19048:239::-;19120:7;19140:13;19156:7;:16;19164:7;19156:16;;;;;;;;;;;;;;;;;;;;;19140:32;;19208:1;19191:19;;:5;:19;;;;19183:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19274:5;19267:12;;;19048:239;;;:::o;18778:208::-;18850:7;18895:1;18878:19;;:5;:19;;;;18870:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18962:9;:16;18972:5;18962:16;;;;;;;;;;;;;;;;18955:23;;18778:208;;;:::o;31914:103::-;31494:12;:10;:12::i;:::-;31483:23;;:7;:5;:7::i;:::-;:23;;;31475:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31979:30:::1;32006:1;31979:18;:30::i;:::-;31914:103::o:0;34468:101::-;34512:7;34539:22;:12;:20;:22::i;:::-;34532:29;;34468:101;:::o;34805:86::-;31494:12;:10;:12::i;:::-;31483:23;;:7;:5;:7::i;:::-;:23;;;31475:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34871:12:::1;;;;;;;;;;;34870:13;34855:12;;:28;;;;;;;;;;;;;;;;;;34805:86::o:0;31263:87::-;31309:7;31336:6;;;;;;;;;;;31329:13;;31263:87;:::o;19523:104::-;19579:13;19612:7;19605:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19523:104;:::o;21206:155::-;21301:52;21320:12;:10;:12::i;:::-;21334:8;21344;21301:18;:52::i;:::-;21206:155;;:::o;22329:328::-;22504:41;22523:12;:10;:12::i;:::-;22537:7;22504:18;:41::i;:::-;22496:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22610:39;22624:4;22630:2;22634:7;22643:5;22610:13;:39::i;:::-;22329:328;;;;:::o;19698:334::-;19771:13;19805:16;19813:7;19805;:16::i;:::-;19797:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;19886:21;19910:10;:8;:10::i;:::-;19886:34;;19962:1;19944:7;19938:21;:25;:86;;;;;;;;;;;;;;;;;19990:7;19999:18;:7;:16;:18::i;:::-;19973:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19938:86;19931:93;;;19698:334;;;:::o;34344:118::-;34392:7;34432:22;:12;:20;:22::i;:::-;33905:4;34419:35;;;;:::i;:::-;34412:42;;34344:118;:::o;21432:164::-;21529:4;21553:18;:25;21572:5;21553:25;;;;;;;;;;;;;;;:35;21579:8;21553:35;;;;;;;;;;;;;;;;;;;;;;;;;21546:42;;21432:164;;;;:::o;33916:32::-;;;;;;;;;;;;;:::o;32172:201::-;31494:12;:10;:12::i;:::-;31483:23;;:7;:5;:7::i;:::-;:23;;;31475:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32281:1:::1;32261:22;;:8;:22;;;;32253:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32337:28;32356:8;32337:18;:28::i;:::-;32172:201:::0;:::o;17268:157::-;17353:4;17392:25;17377:40;;;:11;:40;;;;17370:47;;17268:157;;;:::o;24167:127::-;24232:4;24284:1;24256:30;;:7;:16;24264:7;24256:16;;;;;;;;;;;;;;;;;;;;;:30;;;;24249:37;;24167:127;;;:::o;14996:98::-;15049:7;15076:10;15069:17;;14996:98;:::o;28149:174::-;28251:2;28224:15;:24;28240:7;28224:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28307:7;28303:2;28269:46;;28278:23;28293:7;28278:14;:23::i;:::-;28269:46;;;;;;;;;;;;28149:174;;:::o;33144:114::-;33209:7;33236;:14;;;33229:21;;33144:114;;;:::o;33266:127::-;33373:1;33355:7;:14;;;:19;;;;;;;;;;;33266:127;:::o;25151:110::-;25227:26;25237:2;25241:7;25227:26;;;;;;;;;;;;:9;:26::i;:::-;25151:110;;:::o;24461:348::-;24554:4;24579:16;24587:7;24579;:16::i;:::-;24571:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24655:13;24671:23;24686:7;24671:14;:23::i;:::-;24655:39;;24724:5;24713:16;;:7;:16;;;:51;;;;24757:7;24733:31;;:20;24745:7;24733:11;:20::i;:::-;:31;;;24713:51;:87;;;;24768:32;24785:5;24792:7;24768:16;:32::i;:::-;24713:87;24705:96;;;24461:348;;;;:::o;27453:578::-;27612:4;27585:31;;:23;27600:7;27585:14;:23::i;:::-;:31;;;27577:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27695:1;27681:16;;:2;:16;;;;27673:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27751:39;27772:4;27778:2;27782:7;27751:20;:39::i;:::-;27855:29;27872:1;27876:7;27855:8;:29::i;:::-;27916:1;27897:9;:15;27907:4;27897:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;27945:1;27928:9;:13;27938:2;27928:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27976:2;27957:7;:16;27965:7;27957:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28015:7;28011:2;27996:27;;28005:4;27996:27;;;;;;;;;;;;27453:578;;;:::o;32533:191::-;32607:16;32626:6;;;;;;;;;;;32607:25;;32652:8;32643:6;;:17;;;;;;;;;;;;;;;;;;32707:8;32676:40;;32697:8;32676:40;;;;;;;;;;;;32596:128;32533:191;:::o;28465:315::-;28620:8;28611:17;;:5;:17;;;;28603:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;28707:8;28669:18;:25;28688:5;28669:25;;;;;;;;;;;;;;;:35;28695:8;28669:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;28753:8;28731:41;;28746:5;28731:41;;;28763:8;28731:41;;;;;;:::i;:::-;;;;;;;;28465:315;;;:::o;23539:::-;23696:28;23706:4;23712:2;23716:7;23696:9;:28::i;:::-;23743:48;23766:4;23772:2;23776:7;23785:5;23743:22;:48::i;:::-;23735:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23539:315;;;;:::o;34575:114::-;34635:13;34668;34661:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34575:114;:::o;15400:723::-;15456:13;15686:1;15677:5;:10;15673:53;;;15704:10;;;;;;;;;;;;;;;;;;;;;15673:53;15736:12;15751:5;15736:20;;15767:14;15792:78;15807:1;15799:4;:9;15792:78;;15825:8;;;;;:::i;:::-;;;;15856:2;15848:10;;;;;:::i;:::-;;;15792:78;;;15880:19;15912:6;15902:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15880:39;;15930:154;15946:1;15937:5;:10;15930:154;;15974:1;15964:11;;;;;:::i;:::-;;;16041:2;16033:5;:10;;;;:::i;:::-;16020:2;:24;;;;:::i;:::-;16007:39;;15990:6;15997;15990:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16070:2;16061:11;;;;;:::i;:::-;;;15930:154;;;16108:6;16094:21;;;;;15400:723;;;;:::o;25488:321::-;25618:18;25624:2;25628:7;25618:5;:18::i;:::-;25669:54;25700:1;25704:2;25708:7;25717:5;25669:22;:54::i;:::-;25647:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25488:321;;;:::o;30716:126::-;;;;:::o;29345:799::-;29500:4;29521:15;:2;:13;;;:15::i;:::-;29517:620;;;29573:2;29557:36;;;29594:12;:10;:12::i;:::-;29608:4;29614:7;29623:5;29557:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29553:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29816:1;29799:6;:13;:18;29795:272;;;29842:60;;;;;;;;;;:::i;:::-;;;;;;;;29795:272;30017:6;30011:13;30002:6;29998:2;29994:15;29987:38;29553:529;29690:41;;;29680:51;;;:6;:51;;;;29673:58;;;;;29517:620;30121:4;30114:11;;29345:799;;;;;;;:::o;26145:382::-;26239:1;26225:16;;:2;:16;;;;26217:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;26298:16;26306:7;26298;:16::i;:::-;26297:17;26289:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26360:45;26389:1;26393:2;26397:7;26360:20;:45::i;:::-;26435:1;26418:9;:13;26428:2;26418:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;26466:2;26447:7;:16;26455:7;26447:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26511:7;26507:2;26486:33;;26503:1;26486:33;;;;;;;;;;;;26145:382;;:::o;7630:387::-;7690:4;7898:12;7965:7;7953:20;7945:28;;8008:1;8001:4;:8;7994:15;;;7630:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:118::-;15299:24;15317:5;15299:24;:::i;:::-;15294:3;15287:37;15212:118;;:::o;15336:435::-;15516:3;15538:95;15629:3;15620:6;15538:95;:::i;:::-;15531:102;;15650:95;15741:3;15732:6;15650:95;:::i;:::-;15643:102;;15762:3;15755:10;;15336:435;;;;;:::o;15777:222::-;15870:4;15908:2;15897:9;15893:18;15885:26;;15921:71;15989:1;15978:9;15974:17;15965:6;15921:71;:::i;:::-;15777:222;;;;:::o;16005:640::-;16200:4;16238:3;16227:9;16223:19;16215:27;;16252:71;16320:1;16309:9;16305:17;16296:6;16252:71;:::i;:::-;16333:72;16401:2;16390:9;16386:18;16377:6;16333:72;:::i;:::-;16415;16483:2;16472:9;16468:18;16459:6;16415:72;:::i;:::-;16534:9;16528:4;16524:20;16519:2;16508:9;16504:18;16497:48;16562:76;16633:4;16624:6;16562:76;:::i;:::-;16554:84;;16005:640;;;;;;;:::o;16651:210::-;16738:4;16776:2;16765:9;16761:18;16753:26;;16789:65;16851:1;16840:9;16836:17;16827:6;16789:65;:::i;:::-;16651:210;;;;:::o;16867:313::-;16980:4;17018:2;17007:9;17003:18;16995:26;;17067:9;17061:4;17057:20;17053:1;17042:9;17038:17;17031:47;17095:78;17168:4;17159:6;17095:78;:::i;:::-;17087:86;;16867:313;;;;:::o;17186:419::-;17352:4;17390:2;17379:9;17375:18;17367:26;;17439:9;17433:4;17429:20;17425:1;17414:9;17410:17;17403:47;17467:131;17593:4;17467:131;:::i;:::-;17459:139;;17186:419;;;:::o;17611:::-;17777:4;17815:2;17804:9;17800:18;17792:26;;17864:9;17858:4;17854:20;17850:1;17839:9;17835:17;17828:47;17892:131;18018:4;17892:131;:::i;:::-;17884:139;;17611:419;;;:::o;18036:::-;18202:4;18240:2;18229:9;18225:18;18217:26;;18289:9;18283:4;18279:20;18275:1;18264:9;18260:17;18253:47;18317:131;18443:4;18317:131;:::i;:::-;18309:139;;18036:419;;;:::o;18461:::-;18627:4;18665:2;18654:9;18650:18;18642:26;;18714:9;18708:4;18704:20;18700:1;18689:9;18685:17;18678:47;18742:131;18868:4;18742:131;:::i;:::-;18734:139;;18461:419;;;:::o;18886:::-;19052:4;19090:2;19079:9;19075:18;19067:26;;19139:9;19133:4;19129:20;19125:1;19114:9;19110:17;19103:47;19167:131;19293:4;19167:131;:::i;:::-;19159:139;;18886:419;;;:::o;19311:::-;19477:4;19515:2;19504:9;19500:18;19492:26;;19564:9;19558:4;19554:20;19550:1;19539:9;19535:17;19528:47;19592:131;19718:4;19592:131;:::i;:::-;19584:139;;19311:419;;;:::o;19736:::-;19902:4;19940:2;19929:9;19925:18;19917:26;;19989:9;19983:4;19979:20;19975:1;19964:9;19960:17;19953:47;20017:131;20143:4;20017:131;:::i;:::-;20009:139;;19736:419;;;:::o;20161:::-;20327:4;20365:2;20354:9;20350:18;20342:26;;20414:9;20408:4;20404:20;20400:1;20389:9;20385:17;20378:47;20442:131;20568:4;20442:131;:::i;:::-;20434:139;;20161:419;;;:::o;20586:::-;20752:4;20790:2;20779:9;20775:18;20767:26;;20839:9;20833:4;20829:20;20825:1;20814:9;20810:17;20803:47;20867:131;20993:4;20867:131;:::i;:::-;20859:139;;20586:419;;;:::o;21011:::-;21177:4;21215:2;21204:9;21200:18;21192:26;;21264:9;21258:4;21254:20;21250:1;21239:9;21235:17;21228:47;21292:131;21418:4;21292:131;:::i;:::-;21284:139;;21011:419;;;:::o;21436:::-;21602:4;21640:2;21629:9;21625:18;21617:26;;21689:9;21683:4;21679:20;21675:1;21664:9;21660:17;21653:47;21717:131;21843:4;21717:131;:::i;:::-;21709:139;;21436:419;;;:::o;21861:::-;22027:4;22065:2;22054:9;22050:18;22042:26;;22114:9;22108:4;22104:20;22100:1;22089:9;22085:17;22078:47;22142:131;22268:4;22142:131;:::i;:::-;22134:139;;21861:419;;;:::o;22286:::-;22452:4;22490:2;22479:9;22475:18;22467:26;;22539:9;22533:4;22529:20;22525:1;22514:9;22510:17;22503:47;22567:131;22693:4;22567:131;:::i;:::-;22559:139;;22286:419;;;:::o;22711:::-;22877:4;22915:2;22904:9;22900:18;22892:26;;22964:9;22958:4;22954:20;22950:1;22939:9;22935:17;22928:47;22992:131;23118:4;22992:131;:::i;:::-;22984:139;;22711:419;;;:::o;23136:::-;23302:4;23340:2;23329:9;23325:18;23317:26;;23389:9;23383:4;23379:20;23375:1;23364:9;23360:17;23353:47;23417:131;23543:4;23417:131;:::i;:::-;23409:139;;23136:419;;;:::o;23561:::-;23727:4;23765:2;23754:9;23750:18;23742:26;;23814:9;23808:4;23804:20;23800:1;23789:9;23785:17;23778:47;23842:131;23968:4;23842:131;:::i;:::-;23834:139;;23561:419;;;:::o;23986:::-;24152:4;24190:2;24179:9;24175:18;24167:26;;24239:9;24233:4;24229:20;24225:1;24214:9;24210:17;24203:47;24267:131;24393:4;24267:131;:::i;:::-;24259:139;;23986:419;;;:::o;24411:::-;24577:4;24615:2;24604:9;24600:18;24592:26;;24664:9;24658:4;24654:20;24650:1;24639:9;24635:17;24628:47;24692:131;24818:4;24692:131;:::i;:::-;24684:139;;24411:419;;;:::o;24836:222::-;24929:4;24967:2;24956:9;24952:18;24944:26;;24980:71;25048:1;25037:9;25033:17;25024:6;24980:71;:::i;:::-;24836:222;;;;:::o;25064:129::-;25098:6;25125:20;;:::i;:::-;25115:30;;25154:33;25182:4;25174:6;25154:33;:::i;:::-;25064:129;;;:::o;25199:75::-;25232:6;25265:2;25259:9;25249:19;;25199:75;:::o;25280:307::-;25341:4;25431:18;25423:6;25420:30;25417:56;;;25453:18;;:::i;:::-;25417:56;25491:29;25513:6;25491:29;:::i;:::-;25483:37;;25575:4;25569;25565:15;25557:23;;25280:307;;;:::o;25593:308::-;25655:4;25745:18;25737:6;25734:30;25731:56;;;25767:18;;:::i;:::-;25731:56;25805:29;25827:6;25805:29;:::i;:::-;25797:37;;25889:4;25883;25879:15;25871:23;;25593:308;;;:::o;25907:98::-;25958:6;25992:5;25986:12;25976:22;;25907:98;;;:::o;26011:99::-;26063:6;26097:5;26091:12;26081:22;;26011:99;;;:::o;26116:168::-;26199:11;26233:6;26228:3;26221:19;26273:4;26268:3;26264:14;26249:29;;26116:168;;;;:::o;26290:169::-;26374:11;26408:6;26403:3;26396:19;26448:4;26443:3;26439:14;26424:29;;26290:169;;;;:::o;26465:148::-;26567:11;26604:3;26589:18;;26465:148;;;;:::o;26619:305::-;26659:3;26678:20;26696:1;26678:20;:::i;:::-;26673:25;;26712:20;26730:1;26712:20;:::i;:::-;26707:25;;26866:1;26798:66;26794:74;26791:1;26788:81;26785:107;;;26872:18;;:::i;:::-;26785:107;26916:1;26913;26909:9;26902:16;;26619:305;;;;:::o;26930:185::-;26970:1;26987:20;27005:1;26987:20;:::i;:::-;26982:25;;27021:20;27039:1;27021:20;:::i;:::-;27016:25;;27060:1;27050:35;;27065:18;;:::i;:::-;27050:35;27107:1;27104;27100:9;27095:14;;26930:185;;;;:::o;27121:191::-;27161:4;27181:20;27199:1;27181:20;:::i;:::-;27176:25;;27215:20;27233:1;27215:20;:::i;:::-;27210:25;;27254:1;27251;27248:8;27245:34;;;27259:18;;:::i;:::-;27245:34;27304:1;27301;27297:9;27289:17;;27121:191;;;;:::o;27318:96::-;27355:7;27384:24;27402:5;27384:24;:::i;:::-;27373:35;;27318:96;;;:::o;27420:90::-;27454:7;27497:5;27490:13;27483:21;27472:32;;27420:90;;;:::o;27516:149::-;27552:7;27592:66;27585:5;27581:78;27570:89;;27516:149;;;:::o;27671:126::-;27708:7;27748:42;27741:5;27737:54;27726:65;;27671:126;;;:::o;27803:77::-;27840:7;27869:5;27858:16;;27803:77;;;:::o;27886:154::-;27970:6;27965:3;27960;27947:30;28032:1;28023:6;28018:3;28014:16;28007:27;27886:154;;;:::o;28046:307::-;28114:1;28124:113;28138:6;28135:1;28132:13;28124:113;;;28223:1;28218:3;28214:11;28208:18;28204:1;28199:3;28195:11;28188:39;28160:2;28157:1;28153:10;28148:15;;28124:113;;;28255:6;28252:1;28249:13;28246:101;;;28335:1;28326:6;28321:3;28317:16;28310:27;28246:101;28095:258;28046:307;;;:::o;28359:320::-;28403:6;28440:1;28434:4;28430:12;28420:22;;28487:1;28481:4;28477:12;28508:18;28498:81;;28564:4;28556:6;28552:17;28542:27;;28498:81;28626:2;28618:6;28615:14;28595:18;28592:38;28589:84;;;28645:18;;:::i;:::-;28589:84;28410:269;28359:320;;;:::o;28685:281::-;28768:27;28790:4;28768:27;:::i;:::-;28760:6;28756:40;28898:6;28886:10;28883:22;28862:18;28850:10;28847:34;28844:62;28841:88;;;28909:18;;:::i;:::-;28841:88;28949:10;28945:2;28938:22;28728:238;28685:281;;:::o;28972:233::-;29011:3;29034:24;29052:5;29034:24;:::i;:::-;29025:33;;29080:66;29073:5;29070:77;29067:103;;;29150:18;;:::i;:::-;29067:103;29197:1;29190:5;29186:13;29179:20;;28972:233;;;:::o;29211:176::-;29243:1;29260:20;29278:1;29260:20;:::i;:::-;29255:25;;29294:20;29312:1;29294:20;:::i;:::-;29289:25;;29333:1;29323:35;;29338:18;;:::i;:::-;29323:35;29379:1;29376;29372:9;29367:14;;29211:176;;;;:::o;29393:180::-;29441:77;29438:1;29431:88;29538:4;29535:1;29528:15;29562:4;29559:1;29552:15;29579:180;29627:77;29624:1;29617:88;29724:4;29721:1;29714:15;29748:4;29745:1;29738:15;29765:180;29813:77;29810:1;29803:88;29910:4;29907:1;29900:15;29934:4;29931:1;29924:15;29951:180;29999:77;29996:1;29989:88;30096:4;30093:1;30086:15;30120:4;30117:1;30110:15;30137:180;30185:77;30182:1;30175:88;30282:4;30279:1;30272:15;30306:4;30303:1;30296:15;30323:117;30432:1;30429;30422:12;30446:117;30555:1;30552;30545:12;30569:117;30678:1;30675;30668:12;30692:117;30801:1;30798;30791:12;30815:102;30856:6;30907:2;30903:7;30898:2;30891:5;30887:14;30883:28;30873:38;;30815:102;;;:::o;30923:237::-;31063:34;31059:1;31051:6;31047:14;31040:58;31132:20;31127:2;31119:6;31115:15;31108:45;30923:237;:::o;31166:225::-;31306:34;31302:1;31294:6;31290:14;31283:58;31375:8;31370:2;31362:6;31358:15;31351:33;31166:225;:::o;31397:164::-;31537:16;31533:1;31525:6;31521:14;31514:40;31397:164;:::o;31567:178::-;31707:30;31703:1;31695:6;31691:14;31684:54;31567:178;:::o;31751:166::-;31891:18;31887:1;31879:6;31875:14;31868:42;31751:166;:::o;31923:223::-;32063:34;32059:1;32051:6;32047:14;32040:58;32132:6;32127:2;32119:6;32115:15;32108:31;31923:223;:::o;32152:175::-;32292:27;32288:1;32280:6;32276:14;32269:51;32152:175;:::o;32333:231::-;32473:34;32469:1;32461:6;32457:14;32450:58;32542:14;32537:2;32529:6;32525:15;32518:39;32333:231;:::o;32570:243::-;32710:34;32706:1;32698:6;32694:14;32687:58;32779:26;32774:2;32766:6;32762:15;32755:51;32570:243;:::o;32819:229::-;32959:34;32955:1;32947:6;32943:14;32936:58;33028:12;33023:2;33015:6;33011:15;33004:37;32819:229;:::o;33054:228::-;33194:34;33190:1;33182:6;33178:14;33171:58;33263:11;33258:2;33250:6;33246:15;33239:36;33054:228;:::o;33288:182::-;33428:34;33424:1;33416:6;33412:14;33405:58;33288:182;:::o;33476:231::-;33616:34;33612:1;33604:6;33600:14;33593:58;33685:14;33680:2;33672:6;33668:15;33661:39;33476:231;:::o;33713:182::-;33853:34;33849:1;33841:6;33837:14;33830:58;33713:182;:::o;33901:228::-;34041:34;34037:1;34029:6;34025:14;34018:58;34110:11;34105:2;34097:6;34093:15;34086:36;33901:228;:::o;34135:234::-;34275:34;34271:1;34263:6;34259:14;34252:58;34344:17;34339:2;34331:6;34327:15;34320:42;34135:234;:::o;34375:220::-;34515:34;34511:1;34503:6;34499:14;34492:58;34584:3;34579:2;34571:6;34567:15;34560:28;34375:220;:::o;34601:236::-;34741:34;34737:1;34729:6;34725:14;34718:58;34810:19;34805:2;34797:6;34793:15;34786:44;34601:236;:::o;34843:122::-;34916:24;34934:5;34916:24;:::i;:::-;34909:5;34906:35;34896:63;;34955:1;34952;34945:12;34896:63;34843:122;:::o;34971:116::-;35041:21;35056:5;35041:21;:::i;:::-;35034:5;35031:32;35021:60;;35077:1;35074;35067:12;35021:60;34971:116;:::o;35093:120::-;35165:23;35182:5;35165:23;:::i;:::-;35158:5;35155:34;35145:62;;35203:1;35200;35193:12;35145:62;35093:120;:::o;35219:122::-;35292:24;35310:5;35292:24;:::i;:::-;35285:5;35282:35;35272:63;;35331:1;35328;35321:12;35272:63;35219:122;:::o

Swarm Source

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