ETH Price: $3,420.48 (-0.58%)
Gas: 3 Gwei

Token

GameDisease (GD)
 

Overview

Max Total Supply

9,270 GD

Holders

1,225

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
duckingwhimsical.eth
Balance
3 GD
0xC1c0e9750fAB87ac871eA40D005063F3750fe143
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Game Disease Collection is composed by 9,999 unique PFP collectibles. Every single NFT created is different from the rest: singular and inimitable.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GameDisease

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;


/*

    █████▀███████████████████████████████████████████████████████████████
    █─▄▄▄▄██▀▄─██▄─▀█▀─▄█▄─▄▄─███▄─▄▄▀█▄─▄█─▄▄▄▄█▄─▄▄─██▀▄─██─▄▄▄▄█▄─▄▄─█
    █─██▄─██─▀─███─█▄█─███─▄█▀████─██─██─██▄▄▄▄─██─▄█▀██─▀─██▄▄▄▄─██─▄█▀█
    ▀▄▄▄▄▄▀▄▄▀▄▄▀▄▄▄▀▄▄▄▀▄▄▄▄▄▀▀▀▄▄▄▄▀▀▄▄▄▀▄▄▄▄▄▀▄▄▄▄▄▀▄▄▀▄▄▀▄▄▄▄▄▀▄▄▄▄▄▀


                                       .:--==----:..                                      
                               .:===----==+====-------::.:::                              
                            .-+*##%###***+--===+---------:=+*-                            
                         -*%%%%%%%%%%%%%%%%#+*+========---==-==.....                      
                       :#%%%%%%%%%%%%%%%%%%%%%#+----=+=---==-:==***++=-.                  
                      -#%%%%%@@@@@@@@@@@@@@@@@%%%*--------==----*#@@@%+--:-:              
                      ###%%%%@@@@@@@@@@@@@@@@@@@@@%*=---=====--:++#@*==-:-==-             
                    .=###%%%@@@@@@@%%%%%%%%@@@@@@@@@@*=--=+===--+*-#--:::-===             
                   .==###%%%@@%%@@@%%#####%%@@@@@@@@@@@*==-=+=-=*#+#########=.            
                  -*#*-##%%%%%#%%@@%%#**+*%%#*+++*#%@@@@%*====++#%%@#++==+*##:            
                 --=--:-#%#%%%==++#%@%#==*%+=-++::--+%%@@@%+++=+%@@*==---:-=-=            
                 .=----=+#++=---:=+#@@#==%#=-=%@#*--:*%%%%**#++*%@%+===-.:=+::            
                =##%#*-+*#**+++==**#@#+-=@#+==*##+==-*#***#%@@**@###%%%%%%##:             
              .#@@@%@#=%@*#%%##%%%%%*+=-=*%%#*****+===+++=+*+#@%%#%@@@@@@@@@%.            
               %@@@@@@***+++++***#*++==::==*%%#**++++++==-=+==*%#.*@@@@@@@@@@=            
                *@@@@@#+--==*###*#%%%%%%##+=***#**##*++++-.---:*@..+%##**+==:             
                  :-==**++****++###%%%%##%#*=++++###****+- :--:#%+                        
                      =#++++##%%@@@@@@%+%%#**#++*+##***+=..--:.***                        
                      .#++*#*#%%%#**++###*+#@@%***##***=:.-=-..*+=                        
                       +++%%#%%%#%%%@%%%@@%#%@@#**##**=::-=-::==:                         
                       :**%#*@@@@@@@@@%%##%@@@%**###*=--=+=: :=-                          
                        =#%%*%@@@%#*##*++*%@@@%=+##*==-=+=-::-.                           
                         *%#%##@#+++%*++*%@@@%#:-**=====+=--=.                            
                          *%#%##*+++%+==*%@@@#+-=+========--.                             
                           -%#%#*++*#=+=+##%%#+=--===-==-=-:                              
                            .#%%**+**===**%%#*+--====--===-                               
                              **++++====**@#**=-====--====                                
                              -%=+=+-==*+#%#*+=========--:                                
                              +*+++==+**-%#*+=-==++===-=-                                 
                             .#+++++=+==#**+=--=+++===--                                  
                              +%@%#%*#+****=-=+++++=--=.                                  
                               :+=*##*-+**+-=+++++==--:                                   
                                  -+#****+==+++++=----                                    
                                  :%###*+++++*+++---=.                                    
                                  .:=%%###*****++----                                     
                                     #@@%#*****+=-=-.                                     
                                     :%@%#*****+----                                      
                                      =%%##****+----                                      
                                       +%##***+=--::                                      
                                        #%#**++----:             
*/

// made with love for The Game Disease by tinque.
// dsc tinque@8854

// SPDX-License-Identifier: MIT

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


// COMMENT ANDRE: add merkle
// import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";


contract Splitter is Context {
    using SafeMath for uint256;
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;
    uint256[5] private _shares;
    uint256[5] private _released;
    uint256[5] private _payeeOutputIndex;
    address[][5] private _payeeAccounts;

    constructor() {
        uint payee = 0;

        _shares[payee] = 95;
        _payeeAccounts[payee].push(0xC63f9B0000B7c346d97CC82A0513720023B78AB3);
        _payeeAccounts[payee].push(0x41957aDA7C03Ea49B991FcBde56a9AE205dE7b13);
        _payeeAccounts[payee].push(0x9090f44F984468f29a2F94913fff24043B5E4776);

        payee++;

        _shares[payee] = 95;
        _payeeAccounts[payee].push(0x630E495249FA4050e781f3B803C4e8C9c4d6ceBC);
        _payeeAccounts[payee].push(0x41957aDA7C03Ea49B991FcBde56a9AE205dE7b13);
        _payeeAccounts[payee].push(0x9090f44F984468f29a2F94913fff24043B5E4776);

        payee++;
        _payeeAccounts[payee].push(0x4107705D474bEB1361Cd594C4043D4d0d0a4E22b);
        _payeeAccounts[payee].push(0x41957aDA7C03Ea49B991FcBde56a9AE205dE7b13);
        _payeeAccounts[payee].push(0x9090f44F984468f29a2F94913fff24043B5E4776);
        _shares[payee] = 95;

        payee++;
        _payeeAccounts[payee].push(0x47E56C9921fD2847EE51d8020E8954a4a1b94F71);
        _payeeAccounts[payee].push(0x9090f44F984468f29a2F94913fff24043B5E4776);
        _payeeAccounts[payee].push(0x41957aDA7C03Ea49B991FcBde56a9AE205dE7b13);
        _shares[payee] = 95;

        payee++;
        _payeeAccounts[payee].push(0x2784A0aa97985709dAE212112C3Ab2E6f7347143);
        _payeeAccounts[payee].push(0x9090f44F984468f29a2F94913fff24043B5E4776);
        _shares[payee] = 20;

        _totalShares = _shares[0] + _shares[1] + _shares[2] + _shares[3] + _shares[4];
    }


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

    function isActivePayee(address addr) private view returns (bool) {
        return  _payeeAccounts[0][_payeeOutputIndex[0]] == addr || 
                _payeeAccounts[1][_payeeOutputIndex[1]] == addr || 
                _payeeAccounts[2][_payeeOutputIndex[2]] == addr || 
                _payeeAccounts[3][_payeeOutputIndex[3]] == addr || 
                _payeeAccounts[4][_payeeOutputIndex[4]] == addr;
    }


    function release() public {
        require(isActivePayee(msg.sender), 'not an active payee');

        for (uint256 i = 0; i < _payeeAccounts.length; i++) {
            uint256 totalReceived = address(this).balance.add(_totalReleased);
            uint256 payment = totalReceived.mul(_shares[i]).div(_totalShares).sub(_released[i]);
            if (payment > 0) {
                _released[i] = _released[i].add(payment);
                _totalReleased = _totalReleased.add(payment);
                address account = _payeeAccounts[i][_payeeOutputIndex[i]];
                Address.sendValue(payable(account), payment);
            }
        }
    }

    function respawn(uint256 payeeIndex) public {
        require(isActivePayee(msg.sender), 'not an active payee');
        require(payeeIndex < 5, 'invalid payee index');
        require(_payeeOutputIndex[payeeIndex] < _payeeAccounts[payeeIndex].length - 1, "No more respawns");
        _payeeOutputIndex[payeeIndex] += 1;
    }
}

contract GameDisease is ERC721, Ownable, Splitter, ERC721Enumerable {
  using SafeMath for uint256;

    event gifted(uint256 indexed tokenId, address indexed to);
    event minted(uint256 indexed tokenId, address indexed by);
    event bought(uint256 indexed tokenId, address indexed by);
    event PermanentURI(string _value, uint256 indexed _id);

    mapping(address => bool) public EARLY_BIRDS;

    string public PROVENANCE_HASH = "611f8478445246ab15a022c42642210f479a47e863a012d8a84fe53ff8fe5e7c";

    address public OG_COLLECTION_1 = 0x1c903a2F35Fb7c6dC1792dAeC11c033f8B222D5B;
    address public OG_COLLECTION_2 = 0x83815C9D5790bdDc2B83490D13412E6Abb2BEbBe;
    uint256 public OGS_GIFT_ALLOCATION = 661;
    uint256 public TEAM_ALLOCATION = 60;
    uint256 public MAX_SUPPLY = 9999;
    uint256 public OPEN_SALE_MAX_MINTS_PER_WALLET = 15;
    uint256 public EARLY_BIRD_WHITELIST_MINTS = 3;
    uint256 public MINT_PRICE = 0.2 ether;
    
    // 13hs EST 28/10/2021
    uint256 public EARLY_BIRD_START = 1635440400;
    // 17hs EST 28/10/2021
    uint256 public SALE_START = 1635454800;
    // 17hs EST 29/10/201
    uint256 public OG_GIFT_CLAIM_END = 1635541200;
    // 13hs EST 1/11/2021
    uint256 public REVEAL = 1635786000;

    uint256 public reserved = OGS_GIFT_ALLOCATION + TEAM_ALLOCATION;
    uint256 public infected = 0;
    uint256 public claimedgifts = 0;
    uint8 public baseUriChanges = 0;
    string public baseUri;
    bool public shuffled = false;
    uint256 public shuffleOffset = 0;
    uint256 public lastBlockHash = 0;
    mapping(address => bool) public earlyMinters;
    mapping(address => uint256) public openSaleMinters;
    mapping(address => bool) public giftClaimers;
    mapping(address => mapping(uint256 => bool)) OGS_claimed_gifts;
    mapping(address => mapping(uint256 => bool)) OGS_early_mints;

    constructor() ERC721("GameDisease", "GD")
    {   
        // placeholder metadata
        baseUri = "ipfs://QmTnfpW6bf1MWcHX3PAQKeb3eMrhxF3Uzj8iGxoeNsFdfa/";
    }

    /* private */

    function tokenReward(address collection, uint256 tokenId) view private returns (uint256) {
        uint256 rewards = 0;
        if (collection == OG_COLLECTION_1) {
            if (tokenId == 19600030001) {
                rewards += 20; // How much am I w0rth? https://opensea.io/assets/0x1c903a2F35Fb7c6dC1792dAeC11c033f8B222D5B/19600030001
            } else if (tokenId >= 19600010001 && tokenId <= 19600010023) {
                rewards += 6; // How I l0st my last days https://opensea.io/assets/0x1c903a2F35Fb7c6dC1792dAeC11c033f8B222D5B/19600010001
            } else if (tokenId >= 19600020001 && tokenId <= 19600020043) {
                rewards += 4; // TO TH3 M000000000000N https://opensea.io/assets/0x1c903a2F35Fb7c6dC1792dAeC11c033f8B222D5B/19600020001
            } else if (tokenId >= 19600040001 && tokenId <= 19600040150) {
                rewards += 3; // I'm 0 years old and I'm a crypto artist https://opensea.io/assets/0x1c903a2F35Fb7c6dC1792dAeC11c033f8B222D5B/19600040001
            }
        } else if (collection == OG_COLLECTION_2) {
            if (tokenId >= 35900010001 && tokenId <= 35900010010) {
                rewards += 8; // HYP3 BOI https://opensea.io/assets/0x83815c9d5790bddc2b83490d13412e6abb2bebbe/35900010001
            } else if (tokenId >= 35900020001 && tokenId <= 35900020100) {
                rewards += 4; // Mamabicho's Pilgrimage https://opensea.io/assets/0x83815c9d5790bddc2b83490d13412e6abb2bebbe/35900020001
            } else if (tokenId >= 35900030001 && tokenId <= 35900030333) {
                rewards += 3; // Rat in a $ofa https://opensea.io/assets/0x83815c9d5790bddc2b83490d13412e6abb2bebbe/35900030001
            }
        }
        return rewards;
    }


    function claimOGEarlyMintReward() private returns (uint256){
        uint256 earlyMints = 0;
        address[2] memory collections = [OG_COLLECTION_1, OG_COLLECTION_2];
        for (uint256 j = 0; j < collections.length; j++) {
            address collection = collections[j];
            uint256 balance = ERC721Enumerable(collection).balanceOf(msg.sender);
            for (uint256 i = 0; i < balance; i++) {
                uint256 tokenId = ERC721Enumerable(collection).tokenOfOwnerByIndex(msg.sender, i);
                if (!OGS_early_mints[collection][tokenId]) {
                    OGS_early_mints[collection][tokenId] = true;
                    earlyMints += tokenReward(collection, tokenId);
                } 
            }
        }
        return earlyMints;
    }


    function mint(uint256 tokenId) private returns (uint256) {
        require(totalSupply() < MAX_SUPPLY, 'no more tokens left');
        _safeMint(msg.sender, tokenId);
        emit minted(tokenId, msg.sender);
        return tokenId;
    }


    /* owner */

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        require(baseUriChanges < 3, 'out of attempts');
        baseUriChanges += 1;
        baseUri = newBaseURI;
    }

    function reveal() public onlyOwner {
        require(block.timestamp > REVEAL, 'not yet');
        require(!shuffled, 'can only reveal once');
        shuffled = true;
        shuffleOffset = lastBlockHash % MAX_SUPPLY;
    }

    function whitelist(address[] memory addresses) public onlyOwner {
        require(block.timestamp < EARLY_BIRD_START, 'too late');
        for (uint256 i = 0; i < addresses.length; i++) {
            EARLY_BIRDS[addresses[i]] = true;
        }
    }

    function perish(uint256 amount) public onlyOwner {        
        require(reserved > 0, 'its all done now');
        require(amount > 0, 'amount is <= 0');
        require(block.timestamp > OG_GIFT_CLAIM_END, "gifts havent ended yet");
        while (reserved > 0 && amount > 0) {
            uint256 tokenId = MAX_SUPPLY - claimedgifts;
            mint(tokenId);
            emit gifted(tokenId, msg.sender);
            claimedgifts+=1;
            reserved-=1;
            amount-=1;
        }
    }


    /* views */

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

    function checkRemainingMints() public view returns (uint256) {
        uint256 remaining = OPEN_SALE_MAX_MINTS_PER_WALLET - openSaleMinters[msg.sender];
        uint256 available = MAX_SUPPLY - totalSupply().add(reserved);       
        return remaining <= available ? remaining : available;
    }

    function checkEarlyMintReward() public view returns (uint256) {
        if (earlyMinters[msg.sender]) {
            return 0;
        }

        int256 available = int256(MAX_SUPPLY - totalSupply().add(reserved));       
        if (available <= 0) {
            return 0;
        }

        uint256 reward = 0;
        if (EARLY_BIRDS[msg.sender]) {  
            reward += EARLY_BIRD_WHITELIST_MINTS;
        }

        address[2] memory collections = [OG_COLLECTION_1, OG_COLLECTION_2];
        for (uint256 j = 0; j < collections.length; j++) {
            address collection = collections[j];
            uint256 balance = ERC721Enumerable(collection).balanceOf(msg.sender);
            for (uint256 i = 0; i < balance; i++) {
                uint256 tokenId = ERC721Enumerable(collection).tokenOfOwnerByIndex(msg.sender, i);
                if (!OGS_early_mints[collection][tokenId]) {
                    reward += tokenReward(collection, tokenId);
                } 
            }
        }

        return reward <= uint256(available) ? reward : uint256(available);
    }
    
    function checkGiftReward() public view returns (uint256) {
        if (giftClaimers[msg.sender]) {
            return 0;
        }

        int256 remainingGifts = int256(reserved - TEAM_ALLOCATION);
        if (remainingGifts <= 0) {
            return 0;
        }

        uint256 gifts = 0;
        address[2] memory collections = [OG_COLLECTION_1, OG_COLLECTION_2];
        for (uint256 j = 0; j < collections.length; j++) {
            address collection = collections[j];
            uint256 balance = ERC721Enumerable(collection).balanceOf(msg.sender);
            for (uint256 i = 0; i < balance; i++) {
                uint256 tokenId = ERC721Enumerable(collection).tokenOfOwnerByIndex(msg.sender, i);
                uint256 rewards = tokenReward(collection, tokenId);
                if (rewards > 0 && !OGS_claimed_gifts[collection][tokenId]) {
                    gifts += 1;
                }
            }
        }
        
        return gifts <= uint256(remainingGifts) ? gifts : uint256(remainingGifts);
    }


    /* public */

    function spreadDiseases(uint amount) public payable {
        require(amount > 0, "what are you doing?");
        require(block.timestamp > EARLY_BIRD_START, "Get out");
        require(MINT_PRICE.mul(amount) <= msg.value, "won't cut");
        uint256 available = MAX_SUPPLY - totalSupply().add(reserved);
        require(available > 0, "there are no more left");
        require(amount <= available, 'sorry, I cant return the change.');

        if (block.timestamp < SALE_START) {
            require(!earlyMinters[msg.sender], 'already minted early bird');
            earlyMinters[msg.sender] = true;
            uint256 earlyMintAmount = 0;
            if (EARLY_BIRDS[msg.sender]) {
                earlyMintAmount += EARLY_BIRD_WHITELIST_MINTS;
            }
            earlyMintAmount += claimOGEarlyMintReward();
            require(earlyMintAmount > 0, 'no early mints for you');
            require(amount <= earlyMintAmount, 'early mint limit exceeded');
        } else {
            int256 remainingMints = int256(OPEN_SALE_MAX_MINTS_PER_WALLET) - int256(openSaleMinters[msg.sender]);
            require(remainingMints > 0, 'minted too much with this wallet');
            require(amount <= uint256(remainingMints), 'sorry, I cant return the change.');
            openSaleMinters[msg.sender] += amount;
        }
        
        for(uint i = 0; i < amount; i++) {
            uint256 tokenId = ++infected;
            mint(tokenId);
            emit bought(tokenId, msg.sender);
        }

        lastBlockHash = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
    }

    function OGGift() public {
        require(block.timestamp > EARLY_BIRD_START, "Get out");
        require(block.timestamp < OG_GIFT_CLAIM_END, "too late");
        require(!giftClaimers[msg.sender], 'can only claim gifts once');
        giftClaimers[msg.sender] = true;
        int256 remaining = int256(reserved - TEAM_ALLOCATION);
        require(remaining > 0, 'im sorry');

        uint256 gifts = 0;
        address[2] memory collections = [OG_COLLECTION_1, OG_COLLECTION_2];
        for (uint256 j = 0; j < collections.length; j++) {
            address collection = collections[j];
            uint256 balance = ERC721Enumerable(collection).balanceOf(msg.sender);
            for (uint256 i = 0; i < balance; i++) {
                uint256 tokenId = ERC721Enumerable(collection).tokenOfOwnerByIndex(msg.sender, i);
                uint256 rewards = tokenReward(collection, tokenId);
                if (rewards > 0 && !OGS_claimed_gifts[collection][tokenId]) {
                    OGS_claimed_gifts[collection][tokenId] = true;
                    gifts += 1;
                }
            }
        }
        require(gifts > 0, 'no gifts for you');

        uint256 amount = gifts < uint256(remaining) ? gifts : uint256(remaining);
        for (uint256 i = 0; i < amount; i++) {
            // gifts get last tokens.
            uint256 tokenId = MAX_SUPPLY - claimedgifts - i;
            mint(tokenId);
            emit gifted(tokenId, msg.sender);
        }
        reserved -= amount;
        claimedgifts += amount;
    }


    /* neccesary overridings, i guess */

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

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

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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"gifted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"minted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"EARLY_BIRDS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLY_BIRD_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLY_BIRD_WHITELIST_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OGGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OGS_GIFT_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_COLLECTION_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_COLLECTION_2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_GIFT_CLAIM_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPEN_SALE_MAX_MINTS_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_ALLOCATION","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":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriChanges","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkEarlyMintReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkGiftReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkRemainingMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedgifts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyMinters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"giftClaimers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lastBlockHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"openSaleMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"perish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"payeeIndex","type":"uint256"}],"name":"respawn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shuffleOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shuffled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spreadDiseases","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040908152608081815290620049c460a0398051620000299160229160209091019062000798565b50602380546001600160a01b0319908116731c903a2f35fb7c6dc1792daec11c033f8b222d5b17909155602480549091167383815c9d5790bddc2b83490d13412e6abb2bebbe1790556102956025819055603c602681905561270f602755600f60285560036029556702c68af0bb140000602a5563617ad710602b5563617b0f50602c5563617c60d0602d556361801d10602e55620000c8916200083e565b602f556000603081905560318190556032805460ff1990811690915560348054909116905560358190556036553480156200010257600080fd5b50604080518082018252600b81526a47616d654469736561736560a81b60208083019182528351808501909452600284526111d160f21b908401528151919291620001509160009162000798565b5080516200016690600190602084019062000798565b505050620001836200017d6200074260201b60201c565b62000746565b605f600955601880546001808201835560008381527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e92830180546001600160a01b031990811673c63f9b0000b7c346d97cc82a0513720023b78ab317909155845480840186558401805482167341957ada7c03ea49b991fcbde56a9ae205de7b1317905584549283019094559101805490921660008051602062004a048339815191521790915580620002378162000896565b915050605f600982600581106200025e57634e487b7160e01b600052603260045260246000fd5b0155601881600581106200028257634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b03191673630e495249fa4050e781f3b803c4e8c9c4d6cebc17905560188160058110620002dc57634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b0319167341957ada7c03ea49b991fcbde56a9ae205de7b13179055601881600581106200033657634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b03191660008051602062004a0483398151915217905580620003758162000896565b915050601881600581106200039a57634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b031916734107705d474beb1361cd594c4043d4d0d0a4e22b17905560188160058110620003f457634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b0319167341957ada7c03ea49b991fcbde56a9ae205de7b13179055601881600581106200044e57634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b03191660008051602062004a04833981519152179055605f60098260058110620004a557634e487b7160e01b600052603260045260246000fd5b015580620004b38162000896565b91505060188160058110620004d857634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b0319167347e56c9921fd2847ee51d8020e8954a4a1b94f71179055601881600581106200053257634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b03191660008051602062004a04833981519152179055601881600581106200058757634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b0319167341957ada7c03ea49b991fcbde56a9ae205de7b13179055605f60098260058110620005e357634e487b7160e01b600052603260045260246000fd5b015580620005f18162000896565b915050601881600581106200061657634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b031916732784a0aa97985709dae212112c3ab2e6f7347143179055601881600581106200067057634e487b7160e01b600052603260045260246000fd5b018054600181018255600091825260209091200180546001600160a01b03191660008051602062004a04833981519152179055601460098260058110620006c757634e487b7160e01b600052603260045260246000fd5b0155600d54600c54600b54600a54600954620006e491906200083e565b620006f091906200083e565b620006fc91906200083e565b6200070891906200083e565b60075550604080516060810190915260368082526200498e602083013980516200073b9160339160209091019062000798565b50620008ca565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620007a69062000859565b90600052602060002090601f016020900481019282620007ca576000855562000815565b82601f10620007e557805160ff191683800117855562000815565b8280016001018555821562000815579182015b8281111562000815578251825591602001919060010190620007f8565b506200082392915062000827565b5090565b5b8082111562000823576000815560010162000828565b60008219821115620008545762000854620008b4565b500190565b6002810460018216806200086e57607f821691505b602082108114156200089057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620008ad57620008ad620008b4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6140b480620008da6000396000f3fe6080604052600436106102745760003560e01c806301ffc9a7146102c0578063056f903d146102f657806306fdde0314610318578063081812fc1461033a578063095ea7b31461036757806318160ddd146103895780631851a715146103ab5780631d3c50a7146103c057806322673030146103d557806323b872dd146103ea5780632f745c591461040a57806332cb6b0c1461042a5780633bd94b111461043f57806342842e0e146104545780634da60596146104745780634f6ccce71461048957806355f804b3146104a957806356924f9f146104c95780635c0ecfad146104e95780636352211e146104fe57806370a082311461051e578063715018a61461053e5780637304b4af146105535780637e2ccf071461057357806382651bd01461058857806386d1a69f1461059d57806386d90095146105b257806387af9869146105c75780638d6c11ea146105e75780638da5cb5b1461060757806395d89b411461061c5780639abc832014610631578063a22cb46514610646578063a26461fb14610666578063a475b5dd1461067b578063b2a301a114610690578063b88d4fde146106a5578063bd8aa780146106c5578063bffa7fe8146106e5578063c002d23d146106fa578063c5c89c151461070f578063c868d5fb14610724578063c87b56dd14610739578063c95c0cde14610759578063cb82d91c1461076e578063d749c79d14610783578063e40e6013146107a3578063e8a02a98146107b8578063e985e9c5146107d8578063f2fde38b146107f8578063f4524dfd14610818578063f52099221461082d578063fd99cbed14610840578063fe60d12c14610855578063ff1b65561461086a576102bb565b366102bb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a261087f565b346040516102b19291906134a2565b60405180910390a1005b600080fd5b3480156102cc57600080fd5b506102e06102db36600461333b565b610884565b6040516102ed91906134bb565b60405180910390f35b34801561030257600080fd5b5061030b610897565b6040516102ed9190613e53565b34801561032457600080fd5b5061032d6108a0565b6040516102ed91906134c6565b34801561034657600080fd5b5061035a6103553660046133b8565b610932565b6040516102ed9190613451565b34801561037357600080fd5b50610387610382366004613265565b61097e565b005b34801561039557600080fd5b5061039e610a16565b6040516102ed9190613e4a565b3480156103b757600080fd5b5061039e610a1c565b3480156103cc57600080fd5b5061039e610a22565b3480156103e157600080fd5b5061039e610a28565b3480156103f657600080fd5b50610387610405366004613178565b610a2e565b34801561041657600080fd5b5061039e610425366004613265565b610a66565b34801561043657600080fd5b5061039e610ab8565b34801561044b57600080fd5b5061039e610abe565b34801561046057600080fd5b5061038761046f366004613178565b610ac4565b34801561048057600080fd5b5061039e610adf565b34801561049557600080fd5b5061039e6104a43660046133b8565b610ae5565b3480156104b557600080fd5b506103876104c4366004613373565b610b40565b3480156104d557600080fd5b506103876104e43660046133b8565b610bf1565b3480156104f557600080fd5b5061039e610ce0565b34801561050a57600080fd5b5061035a6105193660046133b8565b610ce6565b34801561052a57600080fd5b5061039e61053936600461312c565b610d1b565b34801561054a57600080fd5b50610387610d5f565b34801561055f57600080fd5b506102e061056e36600461312c565b610daa565b34801561057f57600080fd5b5061035a610dbf565b34801561059457600080fd5b5061039e610dce565b3480156105a957600080fd5b50610387610dd4565b3480156105be57600080fd5b5061039e610f8d565b3480156105d357600080fd5b506102e06105e236600461312c565b610f93565b3480156105f357600080fd5b506103876106023660046133b8565b610fa8565b34801561061357600080fd5b5061035a6110e0565b34801561062857600080fd5b5061032d6110ef565b34801561063d57600080fd5b5061032d6110fe565b34801561065257600080fd5b5061038761066136600461322b565b61118c565b34801561067257600080fd5b5061038761125a565b34801561068757600080fd5b506103876115fd565b34801561069c57600080fd5b5061039e6116a2565b3480156106b157600080fd5b506103876106c03660046131b3565b61190c565b3480156106d157600080fd5b506103876106e036600461328e565b61194b565b3480156106f157600080fd5b506102e0611a21565b34801561070657600080fd5b5061039e611a2a565b34801561071b57600080fd5b5061039e611a30565b34801561073057600080fd5b5061039e611a36565b34801561074557600080fd5b5061032d6107543660046133b8565b611c64565b34801561076557600080fd5b5061039e611ce7565b34801561077a57600080fd5b5061035a611ced565b34801561078f57600080fd5b5061039e61079e36600461312c565b611cfc565b3480156107af57600080fd5b5061039e611d0e565b3480156107c457600080fd5b506102e06107d336600461312c565b611d14565b3480156107e457600080fd5b506102e06107f3366004613146565b611d29565b34801561080457600080fd5b5061038761081336600461312c565b611d57565b34801561082457600080fd5b5061039e611dc5565b61038761083b3660046133b8565b611e1b565b34801561084c57600080fd5b5061039e6120de565b34801561086157600080fd5b5061039e6120e4565b34801561087657600080fd5b5061032d6120ea565b335b90565b600061088f826120f7565b90505b919050565b60325460ff1681565b6060600080546108af90613f7c565b80601f01602080910402602001604051908101604052809291908181526020018280546108db90613f7c565b80156109285780601f106108fd57610100808354040283529160200191610928565b820191906000526020600020905b81548152906001019060200180831161090b57829003601f168201915b5050505050905090565b600061093d8261211c565b6109625760405162461bcd60e51b815260040161095990613ae8565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061098982610ce6565b9050806001600160a01b0316836001600160a01b031614156109bd5760405162461bcd60e51b815260040161095990613c72565b806001600160a01b03166109cf61087f565b6001600160a01b031614806109eb57506109eb816107f361087f565b610a075760405162461bcd60e51b8152600401610959906138a5565b610a118383612139565b505050565b601f5490565b60355481565b60305481565b602c5481565b610a3f610a3961087f565b826121a7565b610a5b5760405162461bcd60e51b815260040161095990613cd4565b610a1183838361222c565b6000610a7183610d1b565b8210610a8f5760405162461bcd60e51b8152600401610959906134d9565b506001600160a01b03919091166000908152601d60209081526040808320938352929052205490565b60275481565b602b5481565b610a118383836040518060200160405280600081525061190c565b60255481565b6000610aef610a16565b8210610b0d5760405162461bcd60e51b815260040161095990613d25565b601f8281548110610b2e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610b4861087f565b6001600160a01b0316610b596110e0565b6001600160a01b031614610b7f5760405162461bcd60e51b815260040161095990613b34565b603254600360ff90911610610ba65760405162461bcd60e51b815260040161095990613abf565b6032805460019190600090610bbf90849060ff16613ea2565b92506101000a81548160ff021916908360ff1602179055508060339080519060200190610bed929190613025565b5050565b610bfa33612347565b610c165760405162461bcd60e51b815260040161095990613845565b60058110610c365760405162461bcd60e51b815260040161095990613e1d565b600160188260058110610c5957634e487b7160e01b600052603260045260246000fd5b0154610c659190613f39565b60138260058110610c8657634e487b7160e01b600052603260045260246000fd5b015410610ca55760405162461bcd60e51b81526004016109599061370b565b600160138260058110610cc857634e487b7160e01b600052603260045260246000fd5b016000828254610cd89190613e8a565b909155505050565b60365481565b6000818152600260205260408120546001600160a01b03168061088f5760405162461bcd60e51b815260040161095990613977565b60006001600160a01b038216610d435760405162461bcd60e51b81526004016109599061392d565b506001600160a01b031660009081526003602052604090205490565b610d6761087f565b6001600160a01b0316610d786110e0565b6001600160a01b031614610d9e5760405162461bcd60e51b815260040161095990613b34565b610da860006124c4565b565b60216020526000908152604090205460ff1681565b6023546001600160a01b031681565b602e5481565b610ddd33612347565b610df95760405162461bcd60e51b815260040161095990613845565b60005b6005811015610f8a576000610e1c6008544761251690919063ffffffff16565b90506000610e85600e8460058110610e4457634e487b7160e01b600052603260045260246000fd5b0154610e7f600754610e7960098860058110610e7057634e487b7160e01b600052603260045260246000fd5b01548790612522565b9061252e565b9061253a565b90508015610f7557610eba81600e8560058110610eb257634e487b7160e01b600052603260045260246000fd5b015490612516565b600e8460058110610edb57634e487b7160e01b600052603260045260246000fd5b0155600854610eea9082612516565b600855600060188460058110610f1057634e487b7160e01b600052603260045260246000fd5b0160138560058110610f3257634e487b7160e01b600052603260045260246000fd5b015481548110610f5257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050610f738183612546565b505b50508080610f8290613fb7565b915050610dfc565b50565b60285481565b60396020526000908152604090205460ff1681565b610fb061087f565b6001600160a01b0316610fc16110e0565b6001600160a01b031614610fe75760405162461bcd60e51b815260040161095990613b34565b6000602f54116110095760405162461bcd60e51b815260040161095990613df3565b600081116110295760405162461bcd60e51b81526004016109599061366c565b602d54421161104a5760405162461bcd60e51b8152600401610959906139c0565b6000602f5411801561105c5750600081115b15610f8a5760006031546027546110739190613f39565b905061107e816125e2565b506040513390829060008051602061403f83398151915290600090a36001603160008282546110ad9190613e8a565b925050819055506001602f60008282546110c79190613f39565b909155506110d89050600183613f39565b91505061104a565b6006546001600160a01b031690565b6060600180546108af90613f7c565b6033805461110b90613f7c565b80601f016020809104026020016040519081016040528092919081815260200182805461113790613f7c565b80156111845780601f1061115957610100808354040283529160200191611184565b820191906000526020600020905b81548152906001019060200180831161116757829003601f168201915b505050505081565b61119461087f565b6001600160a01b0316826001600160a01b031614156111c55760405162461bcd60e51b8152600401610959906136d8565b80600560006111d261087f565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561121661087f565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161124e91906134bb565b60405180910390a35050565b602b54421161127b5760405162461bcd60e51b815260040161095990613c24565b602d54421061129c5760405162461bcd60e51b815260040161095990613d9e565b3360009081526039602052604090205460ff16156112cc5760405162461bcd60e51b815260040161095990613dc0565b336000908152603960205260408120805460ff19166001179055602654602f546112f69190613f39565b9050600081136113185760405162461bcd60e51b81526004016109599061364a565b604080518082019091526023546001600160a01b039081168252602454166020820152600090815b600281101561153057600082826002811061136b57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016113a09190613451565b60206040518083038186803b1580156113b857600080fd5b505afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f091906133d0565b905060005b8181101561151a57604051632f745c5960e01b81526000906001600160a01b03851690632f745c599061142e90339086906004016134a2565b60206040518083038186803b15801561144657600080fd5b505afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147e91906133d0565b9050600061148c8583612647565b90506000811180156114c257506001600160a01b0385166000908152603a6020908152604080832085845290915290205460ff16155b15611505576001600160a01b0385166000908152603a602090815260408083208584529091529020805460ff191660019081179091556115029089613e8a565b97505b5050808061151290613fb7565b9150506113f5565b505050808061152890613fb7565b915050611340565b50600082116115515760405162461bcd60e51b8152600401610959906135bc565b60008383106115605783611562565b825b905060005b818110156115c6576000816031546027546115829190613f39565b61158c9190613f39565b9050611597816125e2565b506040513390829060008051602061403f83398151915290600090a350806115be81613fb7565b915050611567565b5080602f60008282546115d99190613f39565b9250508190555080603160008282546115f29190613e8a565b909155505050505050565b61160561087f565b6001600160a01b03166116166110e0565b6001600160a01b03161461163c5760405162461bcd60e51b815260040161095990613b34565b602e54421161165d5760405162461bcd60e51b815260040161095990613cb3565b60345460ff16156116805760405162461bcd60e51b81526004016109599061361c565b6034805460ff1916600117905560275460365461169d9190613fd2565b603555565b3360009081526037602052604081205460ff16156116c257506000610881565b60006116d8602f546116d2610a16565b90612516565b6027546116e59190613f39565b9050600081136116f9576000915050610881565b3360009081526021602052604081205460ff16156117215760295461171e9082613e8a565b90505b604080518082019091526023546001600160a01b03908116825260245416602082015260005b60028110156118f357600082826002811061177257634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016117a79190613451565b60206040518083038186803b1580156117bf57600080fd5b505afa1580156117d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f791906133d0565b905060005b818110156118dd57604051632f745c5960e01b81526000906001600160a01b03851690632f745c599061183590339086906004016134a2565b60206040518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188591906133d0565b6001600160a01b0385166000908152603b6020908152604080832084845290915290205490915060ff166118ca576118bd8482612647565b6118c79088613e8a565b96505b50806118d581613fb7565b9150506117fc565b50505080806118eb90613fb7565b915050611747565b50828211156119025782611904565b815b935050505090565b61191d61191761087f565b836121a7565b6119395760405162461bcd60e51b815260040161095990613cd4565b6119458484848461279b565b50505050565b61195361087f565b6001600160a01b03166119646110e0565b6001600160a01b03161461198a5760405162461bcd60e51b815260040161095990613b34565b602b5442106119ab5760405162461bcd60e51b815260040161095990613d9e565b60005b8151811015610bed576001602160008484815181106119dd57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a1981613fb7565b9150506119ae565b60345460ff1681565b602a5481565b60295481565b3360009081526039602052604081205460ff1615611a5657506000610881565b6000602654602f54611a689190613f39565b905060008113611a7c576000915050610881565b604080518082019091526023546001600160a01b039081168252602454166020820152600090815b60028110156118f3576000828260028110611acf57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401611b049190613451565b60206040518083038186803b158015611b1c57600080fd5b505afa158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5491906133d0565b905060005b81811015611c4e57604051632f745c5960e01b81526000906001600160a01b03851690632f745c5990611b9290339086906004016134a2565b60206040518083038186803b158015611baa57600080fd5b505afa158015611bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be291906133d0565b90506000611bf08583612647565b9050600081118015611c2657506001600160a01b0385166000908152603a6020908152604080832085845290915290205460ff16155b15611c3957611c36600189613e8a565b97505b50508080611c4690613fb7565b915050611b59565b5050508080611c5c90613fb7565b915050611aa4565b6060611c6f8261211c565b611c8b5760405162461bcd60e51b815260040161095990613bb2565b6000611c956127ce565b90506000815111611cb55760405180602001604052806000815250611ce0565b80611cbf846127dd565b604051602001611cd0929190613414565b6040516020818303038152906040525b9392505050565b60315481565b6024546001600160a01b031681565b60386020526000908152604090205481565b602d5481565b60376020526000908152604090205460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611d5f61087f565b6001600160a01b0316611d706110e0565b6001600160a01b031614611d965760405162461bcd60e51b815260040161095990613b34565b6001600160a01b038116611dbc5760405162461bcd60e51b815260040161095990613576565b610f8a816124c4565b336000908152603860205260408120546028548291611de391613f39565b90506000611df5602f546116d2610a16565b602754611e029190613f39565b905080821115611e125780611e14565b815b9250505090565b60008111611e3b5760405162461bcd60e51b815260040161095990613c45565b602b544211611e5c5760405162461bcd60e51b815260040161095990613c24565b602a543490611e6b9083612522565b1115611e895760405162461bcd60e51b815260040161095990613c01565b6000611e99602f546116d2610a16565b602754611ea69190613f39565b905060008111611ec85760405162461bcd60e51b8152600401610959906138fd565b80821115611ee85760405162461bcd60e51b8152600401610959906139f0565b602c54421015611fb9573360009081526037602052604090205460ff1615611f225760405162461bcd60e51b815260040161095990613872565b336000908152603760209081526040808320805460ff19166001179055602190915281205460ff1615611f5f57602954611f5c9082613e8a565b90505b611f676128f7565b611f719082613e8a565b905060008111611f935760405162461bcd60e51b815260040161095990613a25565b80831115611fb35760405162461bcd60e51b815260040161095990613735565b5061203e565b33600090815260386020526040812054602854611fd69190613efa565b905060008113611ff85760405162461bcd60e51b815260040161095990613a55565b808311156120185760405162461bcd60e51b8152600401610959906139f0565b3360009081526038602052604081208054859290612037908490613e8a565b9091555050505b60005b828110156120ab57600060306000815461205a90613fb7565b9182905550905061206a816125e2565b50604051339082907f2c9b5e9655a41ab13c5183c231239df125ecbd546a947624c913cfd43094906e90600090a350806120a381613fb7565b915050612041565b5044426040516020016120bf929190613443565b60408051601f1981840301815291905280516020909101206036555050565b60265481565b602f5481565b6022805461110b90613f7c565b60006001600160e01b0319821663780e9d6360e01b148061088f575061088f82612b03565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216e82610ce6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121b28261211c565b6121ce5760405162461bcd60e51b8152600401610959906137f9565b60006121d983610ce6565b9050806001600160a01b0316846001600160a01b031614806122145750836001600160a01b031661220984610932565b6001600160a01b0316145b8061222457506122248185611d29565b949350505050565b826001600160a01b031661223f82610ce6565b6001600160a01b0316146122655760405162461bcd60e51b815260040161095990613b69565b6001600160a01b03821661228b5760405162461bcd60e51b815260040161095990613694565b612296838383612b43565b6122a1600082612139565b6001600160a01b03831660009081526003602052604081208054600192906122ca908490613f39565b90915550506001600160a01b03821660009081526003602052604081208054600192906122f8908490613e8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061405f83398151915291a4505050565b601354601880546000926001600160a01b0385169291811061237957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614806123db5750601454601980546001600160a01b038516929081106123c457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b806124275750601554601a80546001600160a01b0385169290811061241057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b806124735750601654601b80546001600160a01b0385169290811061245c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b8061088f5750601754601c80546001600160a01b038516929081106124a857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161492915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611ce08284613e8a565b6000611ce08284613edb565b6000611ce08284613ec7565b6000611ce08284613f39565b804710156125665760405162461bcd60e51b8152600401610959906137c2565b6000826001600160a01b03168260405161257f90610881565b60006040518083038185875af1925050503d80600081146125bc576040519150601f19603f3d011682016040523d82523d6000602084013e6125c1565b606091505b5050905080610a115760405162461bcd60e51b815260040161095990613768565b60006027546125ef610a16565b1061260c5760405162461bcd60e51b815260040161095990613d71565b6126163383612b4e565b604051339083907f6887a0e53a7f04b5ed4b8f7dc007a901af127436d4dfff9b84b347e35e58455390600090a35090565b60235460009081906001600160a01b0385811691161415612707578264049040b93114156126815761267a601482613e8a565b9050612702565b640490406b11831015801561269b5750640490406b278311155b156126ab5761267a600682613e8a565b64049040922183101580156126c5575064049040924b8311155b156126d55761267a600482613e8a565b64049040e04183101580156126ef575064049040e0d68311155b15612702576126ff600382613e8a565b90505b611ce0565b6024546001600160a01b0385811691161415611ce05764085bceae118310158015612737575064085bceae1a8311155b15612747576126ff600882613e8a565b64085bced5218310158015612761575064085bced5848311155b15612771576126ff600482613e8a565b64085bcefc31831015801561278b575064085bcefd7d8311155b15611ce057612224600382613e8a565b6127a684848461222c565b6127b284848484612b68565b6119455760405162461bcd60e51b815260040161095990613524565b6060603380546108af90613f7c565b60608161280257506040805180820190915260018152600360fc1b6020820152610892565b8160005b811561282c578061281681613fb7565b91506128259050600a83613ec7565b9150612806565b6000816001600160401b0381111561285457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561287e576020820181803683370190505b5090505b841561222457612893600183613f39565b91506128a0600a86613fd2565b6128ab906030613e8a565b60f81b8183815181106128ce57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506128f0600a86613ec7565b9450612882565b604080518082019091526023546001600160a01b0390811682526024541660208201526000908190815b6002811015612afb57600082826002811061294c57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016129819190613451565b60206040518083038186803b15801561299957600080fd5b505afa1580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d191906133d0565b905060005b81811015612ae557604051632f745c5960e01b81526000906001600160a01b03851690632f745c5990612a0f90339086906004016134a2565b60206040518083038186803b158015612a2757600080fd5b505afa158015612a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5f91906133d0565b6001600160a01b0385166000908152603b6020908152604080832084845290915290205490915060ff16612ad2576001600160a01b0384166000908152603b602090815260408083208484529091529020805460ff19166001179055612ac58482612647565b612acf9088613e8a565b96505b5080612add81613fb7565b9150506129d6565b5050508080612af390613fb7565b915050612921565b509091505090565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b8061088f575061088f82612c83565b610a11838383612c9c565b610bed828260405180602001604052806000815250612d25565b6000612b7c846001600160a01b0316612d58565b15612c7857836001600160a01b031663150b7a02612b9861087f565b8786866040518563ffffffff1660e01b8152600401612bba9493929190613465565b602060405180830381600087803b158015612bd457600080fd5b505af1925050508015612c04575060408051601f3d908101601f19168201909252612c0191810190613357565b60015b612c5e573d808015612c32576040519150601f19603f3d011682016040523d82523d6000602084013e612c37565b606091505b508051612c565760405162461bcd60e51b815260040161095990613524565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612224565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612ca7838383610a11565b6001600160a01b038316612cc357612cbe81612d5e565b612ce6565b816001600160a01b0316836001600160a01b031614612ce657612ce68382612da1565b6001600160a01b038216612d0257612cfd81612e3e565b610a11565b826001600160a01b0316826001600160a01b031614610a1157610a118282612f14565b612d2f8383612f58565b612d3c6000848484612b68565b610a115760405162461bcd60e51b815260040161095990613524565b3b151590565b601f805460008381526020805260408120829055600182018355919091527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070155565b60006001612dae84610d1b565b612db89190613f39565b6000838152601e6020526040902054909150808214612e0b576001600160a01b0384166000908152601d602090815260408083208584528252808320548484528184208190558352601e90915290208190555b506000918252601e602090815260408084208490556001600160a01b039094168352601d81528383209183525290812055565b601f54600090612e5090600190613f39565b6000838152602080526040812054601f8054939450909284908110612e8557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080601f8381548110612eb457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281529080526040808220849055858252812055601f805480612ef857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f1f83610d1b565b6001600160a01b039093166000908152601d602090815260408083208684528252808320859055938252601e9052919091209190915550565b6001600160a01b038216612f7e5760405162461bcd60e51b815260040161095990613a8a565b612f878161211c565b15612fa45760405162461bcd60e51b8152600401610959906135e6565b612fb060008383612b43565b6001600160a01b0382166000908152600360205260408120805460019290612fd9908490613e8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038616908117909155905183929060008051602061405f833981519152908290a45050565b82805461303190613f7c565b90600052602060002090601f0160209004810192826130535760008555613099565b82601f1061306c57805160ff1916838001178555613099565b82800160010185558215613099579182015b8281111561309957825182559160200191906001019061307e565b506130a59291506130a9565b5090565b5b808211156130a557600081556001016130aa565b60006001600160401b038311156130d7576130d7614012565b6130ea601f8401601f1916602001613e61565b90508281528383830111156130fe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461089257600080fd5b60006020828403121561313d578081fd5b611ce082613115565b60008060408385031215613158578081fd5b61316183613115565b915061316f60208401613115565b90509250929050565b60008060006060848603121561318c578081fd5b61319584613115565b92506131a360208501613115565b9150604084013590509250925092565b600080600080608085870312156131c8578081fd5b6131d185613115565b93506131df60208601613115565b92506040850135915060608501356001600160401b03811115613200578182fd5b8501601f81018713613210578182fd5b61321f878235602084016130be565b91505092959194509250565b6000806040838503121561323d578182fd5b61324683613115565b91506020830135801515811461325a578182fd5b809150509250929050565b60008060408385031215613277578182fd5b61328083613115565b946020939093013593505050565b600060208083850312156132a0578182fd5b82356001600160401b03808211156132b6578384fd5b818501915085601f8301126132c9578384fd5b8135818111156132db576132db614012565b83810291506132eb848301613e61565b8181528481019084860184860187018a1015613305578788fd5b8795505b8386101561332e5761331a81613115565b835260019590950194918601918601613309565b5098975050505050505050565b60006020828403121561334c578081fd5b8135611ce081614028565b600060208284031215613368578081fd5b8151611ce081614028565b600060208284031215613384578081fd5b81356001600160401b03811115613399578182fd5b8201601f810184136133a9578182fd5b612224848235602084016130be565b6000602082840312156133c9578081fd5b5035919050565b6000602082840312156133e1578081fd5b5051919050565b60008151808452613400816020860160208601613f50565b601f01601f19169290920160200192915050565b60008351613426818460208801613f50565b83519083019061343a818360208801613f50565b01949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613498908301846133e8565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611ce060208301846133e8565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526010908201526f6e6f20676966747320666f7220796f7560801b604082015260600190565b6020808252601c908201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604082015260600190565b60208082526014908201527363616e206f6e6c792072657665616c206f6e636560601b604082015260600190565b602080825260089082015267696d20736f72727960c01b604082015260600190565b6020808252600e908201526d0616d6f756e74206973203c3d20360941b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604082015260600190565b60208082526010908201526f4e6f206d6f7265207265737061776e7360801b604082015260600190565b60208082526019908201527819585c9b1e481b5a5b9d081b1a5b5a5d08195e18d959591959603a1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726040820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601390820152726e6f7420616e2061637469766520706179656560681b604082015260600190565b602080825260199082015278185b1c9958591e481b5a5b9d19590819585c9b1e48189a5c99603a1b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776040820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606082015260800190565b6020808252601690820152751d1a195c9948185c99481b9bc81b5bdc99481b19599d60521b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526016908201527519da599d1cc81a185d995b9d08195b991959081e595d60521b604082015260600190565b6020808252818101527f736f7272792c20492063616e742072657475726e20746865206368616e67652e604082015260600190565b6020808252601690820152756e6f206561726c79206d696e747320666f7220796f7560501b604082015260600190565b6020808252818101527f6d696e74656420746f6f206d756368207769746820746869732077616c6c6574604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252600f908201526e6f7574206f6620617474656d70747360881b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252600990820152681ddbdb89dd0818dd5d60ba1b604082015260600190565b60208082526007908201526611d95d081bdd5d60ca1b604082015260600190565b602080825260139082015272776861742061726520796f7520646f696e673f60681b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252600790820152661b9bdd081e595d60ca1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601390820152721b9bc81b5bdc99481d1bdad95b9cc81b19599d606a1b604082015260600190565b602080825260089082015267746f6f206c61746560c01b604082015260600190565b60208082526019908201527863616e206f6e6c7920636c61696d206769667473206f6e636560381b604082015260600190565b60208082526010908201526f69747320616c6c20646f6e65206e6f7760801b604082015260600190565b6020808252601390820152720d2dcecc2d8d2c840e0c2f2caca40d2dcc8caf606b1b604082015260600190565b90815260200190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715613e8257613e82614012565b604052919050565b60008219821115613e9d57613e9d613fe6565b500190565b600060ff821660ff84168060ff03821115613ebf57613ebf613fe6565b019392505050565b600082613ed657613ed6613ffc565b500490565b6000816000190483118215151615613ef557613ef5613fe6565b500290565b60008083128015600160ff1b850184121615613f1857613f18613fe6565b6001600160ff1b0384018313811615613f3357613f33613fe6565b50500390565b600082821015613f4b57613f4b613fe6565b500390565b60005b83811015613f6b578181015183820152602001613f53565b838111156119455750506000910152565b600281046001821680613f9057607f821691505b60208210811415613fb157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613fcb57613fcb613fe6565b5060010190565b600082613fe157613fe1613ffc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8a57600080fdfe3bb03f550359214550f03fa46a05a60816be1decea6360453e61af120048cfe9ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b1b73f6bfbb320db180e5990d95eaff08d7d9e19ada58e25eb7d395efe96347864736f6c63430008000033697066733a2f2f516d546e667057366266314d57634858335041514b656233654d7268784633557a6a386947786f654e73466466612f363131663834373834343532343661623135613032326334323634323231306634373961343765383633613031326438613834666535336666386665356537630000000000000000000000009090f44f984468f29a2f94913fff24043b5e4776

Deployed Bytecode

0x6080604052600436106102745760003560e01c806301ffc9a7146102c0578063056f903d146102f657806306fdde0314610318578063081812fc1461033a578063095ea7b31461036757806318160ddd146103895780631851a715146103ab5780631d3c50a7146103c057806322673030146103d557806323b872dd146103ea5780632f745c591461040a57806332cb6b0c1461042a5780633bd94b111461043f57806342842e0e146104545780634da60596146104745780634f6ccce71461048957806355f804b3146104a957806356924f9f146104c95780635c0ecfad146104e95780636352211e146104fe57806370a082311461051e578063715018a61461053e5780637304b4af146105535780637e2ccf071461057357806382651bd01461058857806386d1a69f1461059d57806386d90095146105b257806387af9869146105c75780638d6c11ea146105e75780638da5cb5b1461060757806395d89b411461061c5780639abc832014610631578063a22cb46514610646578063a26461fb14610666578063a475b5dd1461067b578063b2a301a114610690578063b88d4fde146106a5578063bd8aa780146106c5578063bffa7fe8146106e5578063c002d23d146106fa578063c5c89c151461070f578063c868d5fb14610724578063c87b56dd14610739578063c95c0cde14610759578063cb82d91c1461076e578063d749c79d14610783578063e40e6013146107a3578063e8a02a98146107b8578063e985e9c5146107d8578063f2fde38b146107f8578063f4524dfd14610818578063f52099221461082d578063fd99cbed14610840578063fe60d12c14610855578063ff1b65561461086a576102bb565b366102bb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a261087f565b346040516102b19291906134a2565b60405180910390a1005b600080fd5b3480156102cc57600080fd5b506102e06102db36600461333b565b610884565b6040516102ed91906134bb565b60405180910390f35b34801561030257600080fd5b5061030b610897565b6040516102ed9190613e53565b34801561032457600080fd5b5061032d6108a0565b6040516102ed91906134c6565b34801561034657600080fd5b5061035a6103553660046133b8565b610932565b6040516102ed9190613451565b34801561037357600080fd5b50610387610382366004613265565b61097e565b005b34801561039557600080fd5b5061039e610a16565b6040516102ed9190613e4a565b3480156103b757600080fd5b5061039e610a1c565b3480156103cc57600080fd5b5061039e610a22565b3480156103e157600080fd5b5061039e610a28565b3480156103f657600080fd5b50610387610405366004613178565b610a2e565b34801561041657600080fd5b5061039e610425366004613265565b610a66565b34801561043657600080fd5b5061039e610ab8565b34801561044b57600080fd5b5061039e610abe565b34801561046057600080fd5b5061038761046f366004613178565b610ac4565b34801561048057600080fd5b5061039e610adf565b34801561049557600080fd5b5061039e6104a43660046133b8565b610ae5565b3480156104b557600080fd5b506103876104c4366004613373565b610b40565b3480156104d557600080fd5b506103876104e43660046133b8565b610bf1565b3480156104f557600080fd5b5061039e610ce0565b34801561050a57600080fd5b5061035a6105193660046133b8565b610ce6565b34801561052a57600080fd5b5061039e61053936600461312c565b610d1b565b34801561054a57600080fd5b50610387610d5f565b34801561055f57600080fd5b506102e061056e36600461312c565b610daa565b34801561057f57600080fd5b5061035a610dbf565b34801561059457600080fd5b5061039e610dce565b3480156105a957600080fd5b50610387610dd4565b3480156105be57600080fd5b5061039e610f8d565b3480156105d357600080fd5b506102e06105e236600461312c565b610f93565b3480156105f357600080fd5b506103876106023660046133b8565b610fa8565b34801561061357600080fd5b5061035a6110e0565b34801561062857600080fd5b5061032d6110ef565b34801561063d57600080fd5b5061032d6110fe565b34801561065257600080fd5b5061038761066136600461322b565b61118c565b34801561067257600080fd5b5061038761125a565b34801561068757600080fd5b506103876115fd565b34801561069c57600080fd5b5061039e6116a2565b3480156106b157600080fd5b506103876106c03660046131b3565b61190c565b3480156106d157600080fd5b506103876106e036600461328e565b61194b565b3480156106f157600080fd5b506102e0611a21565b34801561070657600080fd5b5061039e611a2a565b34801561071b57600080fd5b5061039e611a30565b34801561073057600080fd5b5061039e611a36565b34801561074557600080fd5b5061032d6107543660046133b8565b611c64565b34801561076557600080fd5b5061039e611ce7565b34801561077a57600080fd5b5061035a611ced565b34801561078f57600080fd5b5061039e61079e36600461312c565b611cfc565b3480156107af57600080fd5b5061039e611d0e565b3480156107c457600080fd5b506102e06107d336600461312c565b611d14565b3480156107e457600080fd5b506102e06107f3366004613146565b611d29565b34801561080457600080fd5b5061038761081336600461312c565b611d57565b34801561082457600080fd5b5061039e611dc5565b61038761083b3660046133b8565b611e1b565b34801561084c57600080fd5b5061039e6120de565b34801561086157600080fd5b5061039e6120e4565b34801561087657600080fd5b5061032d6120ea565b335b90565b600061088f826120f7565b90505b919050565b60325460ff1681565b6060600080546108af90613f7c565b80601f01602080910402602001604051908101604052809291908181526020018280546108db90613f7c565b80156109285780601f106108fd57610100808354040283529160200191610928565b820191906000526020600020905b81548152906001019060200180831161090b57829003601f168201915b5050505050905090565b600061093d8261211c565b6109625760405162461bcd60e51b815260040161095990613ae8565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061098982610ce6565b9050806001600160a01b0316836001600160a01b031614156109bd5760405162461bcd60e51b815260040161095990613c72565b806001600160a01b03166109cf61087f565b6001600160a01b031614806109eb57506109eb816107f361087f565b610a075760405162461bcd60e51b8152600401610959906138a5565b610a118383612139565b505050565b601f5490565b60355481565b60305481565b602c5481565b610a3f610a3961087f565b826121a7565b610a5b5760405162461bcd60e51b815260040161095990613cd4565b610a1183838361222c565b6000610a7183610d1b565b8210610a8f5760405162461bcd60e51b8152600401610959906134d9565b506001600160a01b03919091166000908152601d60209081526040808320938352929052205490565b60275481565b602b5481565b610a118383836040518060200160405280600081525061190c565b60255481565b6000610aef610a16565b8210610b0d5760405162461bcd60e51b815260040161095990613d25565b601f8281548110610b2e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610b4861087f565b6001600160a01b0316610b596110e0565b6001600160a01b031614610b7f5760405162461bcd60e51b815260040161095990613b34565b603254600360ff90911610610ba65760405162461bcd60e51b815260040161095990613abf565b6032805460019190600090610bbf90849060ff16613ea2565b92506101000a81548160ff021916908360ff1602179055508060339080519060200190610bed929190613025565b5050565b610bfa33612347565b610c165760405162461bcd60e51b815260040161095990613845565b60058110610c365760405162461bcd60e51b815260040161095990613e1d565b600160188260058110610c5957634e487b7160e01b600052603260045260246000fd5b0154610c659190613f39565b60138260058110610c8657634e487b7160e01b600052603260045260246000fd5b015410610ca55760405162461bcd60e51b81526004016109599061370b565b600160138260058110610cc857634e487b7160e01b600052603260045260246000fd5b016000828254610cd89190613e8a565b909155505050565b60365481565b6000818152600260205260408120546001600160a01b03168061088f5760405162461bcd60e51b815260040161095990613977565b60006001600160a01b038216610d435760405162461bcd60e51b81526004016109599061392d565b506001600160a01b031660009081526003602052604090205490565b610d6761087f565b6001600160a01b0316610d786110e0565b6001600160a01b031614610d9e5760405162461bcd60e51b815260040161095990613b34565b610da860006124c4565b565b60216020526000908152604090205460ff1681565b6023546001600160a01b031681565b602e5481565b610ddd33612347565b610df95760405162461bcd60e51b815260040161095990613845565b60005b6005811015610f8a576000610e1c6008544761251690919063ffffffff16565b90506000610e85600e8460058110610e4457634e487b7160e01b600052603260045260246000fd5b0154610e7f600754610e7960098860058110610e7057634e487b7160e01b600052603260045260246000fd5b01548790612522565b9061252e565b9061253a565b90508015610f7557610eba81600e8560058110610eb257634e487b7160e01b600052603260045260246000fd5b015490612516565b600e8460058110610edb57634e487b7160e01b600052603260045260246000fd5b0155600854610eea9082612516565b600855600060188460058110610f1057634e487b7160e01b600052603260045260246000fd5b0160138560058110610f3257634e487b7160e01b600052603260045260246000fd5b015481548110610f5257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050610f738183612546565b505b50508080610f8290613fb7565b915050610dfc565b50565b60285481565b60396020526000908152604090205460ff1681565b610fb061087f565b6001600160a01b0316610fc16110e0565b6001600160a01b031614610fe75760405162461bcd60e51b815260040161095990613b34565b6000602f54116110095760405162461bcd60e51b815260040161095990613df3565b600081116110295760405162461bcd60e51b81526004016109599061366c565b602d54421161104a5760405162461bcd60e51b8152600401610959906139c0565b6000602f5411801561105c5750600081115b15610f8a5760006031546027546110739190613f39565b905061107e816125e2565b506040513390829060008051602061403f83398151915290600090a36001603160008282546110ad9190613e8a565b925050819055506001602f60008282546110c79190613f39565b909155506110d89050600183613f39565b91505061104a565b6006546001600160a01b031690565b6060600180546108af90613f7c565b6033805461110b90613f7c565b80601f016020809104026020016040519081016040528092919081815260200182805461113790613f7c565b80156111845780601f1061115957610100808354040283529160200191611184565b820191906000526020600020905b81548152906001019060200180831161116757829003601f168201915b505050505081565b61119461087f565b6001600160a01b0316826001600160a01b031614156111c55760405162461bcd60e51b8152600401610959906136d8565b80600560006111d261087f565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561121661087f565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161124e91906134bb565b60405180910390a35050565b602b54421161127b5760405162461bcd60e51b815260040161095990613c24565b602d54421061129c5760405162461bcd60e51b815260040161095990613d9e565b3360009081526039602052604090205460ff16156112cc5760405162461bcd60e51b815260040161095990613dc0565b336000908152603960205260408120805460ff19166001179055602654602f546112f69190613f39565b9050600081136113185760405162461bcd60e51b81526004016109599061364a565b604080518082019091526023546001600160a01b039081168252602454166020820152600090815b600281101561153057600082826002811061136b57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016113a09190613451565b60206040518083038186803b1580156113b857600080fd5b505afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f091906133d0565b905060005b8181101561151a57604051632f745c5960e01b81526000906001600160a01b03851690632f745c599061142e90339086906004016134a2565b60206040518083038186803b15801561144657600080fd5b505afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147e91906133d0565b9050600061148c8583612647565b90506000811180156114c257506001600160a01b0385166000908152603a6020908152604080832085845290915290205460ff16155b15611505576001600160a01b0385166000908152603a602090815260408083208584529091529020805460ff191660019081179091556115029089613e8a565b97505b5050808061151290613fb7565b9150506113f5565b505050808061152890613fb7565b915050611340565b50600082116115515760405162461bcd60e51b8152600401610959906135bc565b60008383106115605783611562565b825b905060005b818110156115c6576000816031546027546115829190613f39565b61158c9190613f39565b9050611597816125e2565b506040513390829060008051602061403f83398151915290600090a350806115be81613fb7565b915050611567565b5080602f60008282546115d99190613f39565b9250508190555080603160008282546115f29190613e8a565b909155505050505050565b61160561087f565b6001600160a01b03166116166110e0565b6001600160a01b03161461163c5760405162461bcd60e51b815260040161095990613b34565b602e54421161165d5760405162461bcd60e51b815260040161095990613cb3565b60345460ff16156116805760405162461bcd60e51b81526004016109599061361c565b6034805460ff1916600117905560275460365461169d9190613fd2565b603555565b3360009081526037602052604081205460ff16156116c257506000610881565b60006116d8602f546116d2610a16565b90612516565b6027546116e59190613f39565b9050600081136116f9576000915050610881565b3360009081526021602052604081205460ff16156117215760295461171e9082613e8a565b90505b604080518082019091526023546001600160a01b03908116825260245416602082015260005b60028110156118f357600082826002811061177257634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016117a79190613451565b60206040518083038186803b1580156117bf57600080fd5b505afa1580156117d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f791906133d0565b905060005b818110156118dd57604051632f745c5960e01b81526000906001600160a01b03851690632f745c599061183590339086906004016134a2565b60206040518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188591906133d0565b6001600160a01b0385166000908152603b6020908152604080832084845290915290205490915060ff166118ca576118bd8482612647565b6118c79088613e8a565b96505b50806118d581613fb7565b9150506117fc565b50505080806118eb90613fb7565b915050611747565b50828211156119025782611904565b815b935050505090565b61191d61191761087f565b836121a7565b6119395760405162461bcd60e51b815260040161095990613cd4565b6119458484848461279b565b50505050565b61195361087f565b6001600160a01b03166119646110e0565b6001600160a01b03161461198a5760405162461bcd60e51b815260040161095990613b34565b602b5442106119ab5760405162461bcd60e51b815260040161095990613d9e565b60005b8151811015610bed576001602160008484815181106119dd57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a1981613fb7565b9150506119ae565b60345460ff1681565b602a5481565b60295481565b3360009081526039602052604081205460ff1615611a5657506000610881565b6000602654602f54611a689190613f39565b905060008113611a7c576000915050610881565b604080518082019091526023546001600160a01b039081168252602454166020820152600090815b60028110156118f3576000828260028110611acf57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401611b049190613451565b60206040518083038186803b158015611b1c57600080fd5b505afa158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5491906133d0565b905060005b81811015611c4e57604051632f745c5960e01b81526000906001600160a01b03851690632f745c5990611b9290339086906004016134a2565b60206040518083038186803b158015611baa57600080fd5b505afa158015611bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be291906133d0565b90506000611bf08583612647565b9050600081118015611c2657506001600160a01b0385166000908152603a6020908152604080832085845290915290205460ff16155b15611c3957611c36600189613e8a565b97505b50508080611c4690613fb7565b915050611b59565b5050508080611c5c90613fb7565b915050611aa4565b6060611c6f8261211c565b611c8b5760405162461bcd60e51b815260040161095990613bb2565b6000611c956127ce565b90506000815111611cb55760405180602001604052806000815250611ce0565b80611cbf846127dd565b604051602001611cd0929190613414565b6040516020818303038152906040525b9392505050565b60315481565b6024546001600160a01b031681565b60386020526000908152604090205481565b602d5481565b60376020526000908152604090205460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611d5f61087f565b6001600160a01b0316611d706110e0565b6001600160a01b031614611d965760405162461bcd60e51b815260040161095990613b34565b6001600160a01b038116611dbc5760405162461bcd60e51b815260040161095990613576565b610f8a816124c4565b336000908152603860205260408120546028548291611de391613f39565b90506000611df5602f546116d2610a16565b602754611e029190613f39565b905080821115611e125780611e14565b815b9250505090565b60008111611e3b5760405162461bcd60e51b815260040161095990613c45565b602b544211611e5c5760405162461bcd60e51b815260040161095990613c24565b602a543490611e6b9083612522565b1115611e895760405162461bcd60e51b815260040161095990613c01565b6000611e99602f546116d2610a16565b602754611ea69190613f39565b905060008111611ec85760405162461bcd60e51b8152600401610959906138fd565b80821115611ee85760405162461bcd60e51b8152600401610959906139f0565b602c54421015611fb9573360009081526037602052604090205460ff1615611f225760405162461bcd60e51b815260040161095990613872565b336000908152603760209081526040808320805460ff19166001179055602190915281205460ff1615611f5f57602954611f5c9082613e8a565b90505b611f676128f7565b611f719082613e8a565b905060008111611f935760405162461bcd60e51b815260040161095990613a25565b80831115611fb35760405162461bcd60e51b815260040161095990613735565b5061203e565b33600090815260386020526040812054602854611fd69190613efa565b905060008113611ff85760405162461bcd60e51b815260040161095990613a55565b808311156120185760405162461bcd60e51b8152600401610959906139f0565b3360009081526038602052604081208054859290612037908490613e8a565b9091555050505b60005b828110156120ab57600060306000815461205a90613fb7565b9182905550905061206a816125e2565b50604051339082907f2c9b5e9655a41ab13c5183c231239df125ecbd546a947624c913cfd43094906e90600090a350806120a381613fb7565b915050612041565b5044426040516020016120bf929190613443565b60408051601f1981840301815291905280516020909101206036555050565b60265481565b602f5481565b6022805461110b90613f7c565b60006001600160e01b0319821663780e9d6360e01b148061088f575061088f82612b03565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216e82610ce6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121b28261211c565b6121ce5760405162461bcd60e51b8152600401610959906137f9565b60006121d983610ce6565b9050806001600160a01b0316846001600160a01b031614806122145750836001600160a01b031661220984610932565b6001600160a01b0316145b8061222457506122248185611d29565b949350505050565b826001600160a01b031661223f82610ce6565b6001600160a01b0316146122655760405162461bcd60e51b815260040161095990613b69565b6001600160a01b03821661228b5760405162461bcd60e51b815260040161095990613694565b612296838383612b43565b6122a1600082612139565b6001600160a01b03831660009081526003602052604081208054600192906122ca908490613f39565b90915550506001600160a01b03821660009081526003602052604081208054600192906122f8908490613e8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061405f83398151915291a4505050565b601354601880546000926001600160a01b0385169291811061237957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614806123db5750601454601980546001600160a01b038516929081106123c457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b806124275750601554601a80546001600160a01b0385169290811061241057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b806124735750601654601b80546001600160a01b0385169290811061245c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b8061088f5750601754601c80546001600160a01b038516929081106124a857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161492915050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611ce08284613e8a565b6000611ce08284613edb565b6000611ce08284613ec7565b6000611ce08284613f39565b804710156125665760405162461bcd60e51b8152600401610959906137c2565b6000826001600160a01b03168260405161257f90610881565b60006040518083038185875af1925050503d80600081146125bc576040519150601f19603f3d011682016040523d82523d6000602084013e6125c1565b606091505b5050905080610a115760405162461bcd60e51b815260040161095990613768565b60006027546125ef610a16565b1061260c5760405162461bcd60e51b815260040161095990613d71565b6126163383612b4e565b604051339083907f6887a0e53a7f04b5ed4b8f7dc007a901af127436d4dfff9b84b347e35e58455390600090a35090565b60235460009081906001600160a01b0385811691161415612707578264049040b93114156126815761267a601482613e8a565b9050612702565b640490406b11831015801561269b5750640490406b278311155b156126ab5761267a600682613e8a565b64049040922183101580156126c5575064049040924b8311155b156126d55761267a600482613e8a565b64049040e04183101580156126ef575064049040e0d68311155b15612702576126ff600382613e8a565b90505b611ce0565b6024546001600160a01b0385811691161415611ce05764085bceae118310158015612737575064085bceae1a8311155b15612747576126ff600882613e8a565b64085bced5218310158015612761575064085bced5848311155b15612771576126ff600482613e8a565b64085bcefc31831015801561278b575064085bcefd7d8311155b15611ce057612224600382613e8a565b6127a684848461222c565b6127b284848484612b68565b6119455760405162461bcd60e51b815260040161095990613524565b6060603380546108af90613f7c565b60608161280257506040805180820190915260018152600360fc1b6020820152610892565b8160005b811561282c578061281681613fb7565b91506128259050600a83613ec7565b9150612806565b6000816001600160401b0381111561285457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561287e576020820181803683370190505b5090505b841561222457612893600183613f39565b91506128a0600a86613fd2565b6128ab906030613e8a565b60f81b8183815181106128ce57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506128f0600a86613ec7565b9450612882565b604080518082019091526023546001600160a01b0390811682526024541660208201526000908190815b6002811015612afb57600082826002811061294c57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016129819190613451565b60206040518083038186803b15801561299957600080fd5b505afa1580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d191906133d0565b905060005b81811015612ae557604051632f745c5960e01b81526000906001600160a01b03851690632f745c5990612a0f90339086906004016134a2565b60206040518083038186803b158015612a2757600080fd5b505afa158015612a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5f91906133d0565b6001600160a01b0385166000908152603b6020908152604080832084845290915290205490915060ff16612ad2576001600160a01b0384166000908152603b602090815260408083208484529091529020805460ff19166001179055612ac58482612647565b612acf9088613e8a565b96505b5080612add81613fb7565b9150506129d6565b5050508080612af390613fb7565b915050612921565b509091505090565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b8061088f575061088f82612c83565b610a11838383612c9c565b610bed828260405180602001604052806000815250612d25565b6000612b7c846001600160a01b0316612d58565b15612c7857836001600160a01b031663150b7a02612b9861087f565b8786866040518563ffffffff1660e01b8152600401612bba9493929190613465565b602060405180830381600087803b158015612bd457600080fd5b505af1925050508015612c04575060408051601f3d908101601f19168201909252612c0191810190613357565b60015b612c5e573d808015612c32576040519150601f19603f3d011682016040523d82523d6000602084013e612c37565b606091505b508051612c565760405162461bcd60e51b815260040161095990613524565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612224565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612ca7838383610a11565b6001600160a01b038316612cc357612cbe81612d5e565b612ce6565b816001600160a01b0316836001600160a01b031614612ce657612ce68382612da1565b6001600160a01b038216612d0257612cfd81612e3e565b610a11565b826001600160a01b0316826001600160a01b031614610a1157610a118282612f14565b612d2f8383612f58565b612d3c6000848484612b68565b610a115760405162461bcd60e51b815260040161095990613524565b3b151590565b601f805460008381526020805260408120829055600182018355919091527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070155565b60006001612dae84610d1b565b612db89190613f39565b6000838152601e6020526040902054909150808214612e0b576001600160a01b0384166000908152601d602090815260408083208584528252808320548484528184208190558352601e90915290208190555b506000918252601e602090815260408084208490556001600160a01b039094168352601d81528383209183525290812055565b601f54600090612e5090600190613f39565b6000838152602080526040812054601f8054939450909284908110612e8557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080601f8381548110612eb457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281529080526040808220849055858252812055601f805480612ef857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f1f83610d1b565b6001600160a01b039093166000908152601d602090815260408083208684528252808320859055938252601e9052919091209190915550565b6001600160a01b038216612f7e5760405162461bcd60e51b815260040161095990613a8a565b612f878161211c565b15612fa45760405162461bcd60e51b8152600401610959906135e6565b612fb060008383612b43565b6001600160a01b0382166000908152600360205260408120805460019290612fd9908490613e8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038616908117909155905183929060008051602061405f833981519152908290a45050565b82805461303190613f7c565b90600052602060002090601f0160209004810192826130535760008555613099565b82601f1061306c57805160ff1916838001178555613099565b82800160010185558215613099579182015b8281111561309957825182559160200191906001019061307e565b506130a59291506130a9565b5090565b5b808211156130a557600081556001016130aa565b60006001600160401b038311156130d7576130d7614012565b6130ea601f8401601f1916602001613e61565b90508281528383830111156130fe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461089257600080fd5b60006020828403121561313d578081fd5b611ce082613115565b60008060408385031215613158578081fd5b61316183613115565b915061316f60208401613115565b90509250929050565b60008060006060848603121561318c578081fd5b61319584613115565b92506131a360208501613115565b9150604084013590509250925092565b600080600080608085870312156131c8578081fd5b6131d185613115565b93506131df60208601613115565b92506040850135915060608501356001600160401b03811115613200578182fd5b8501601f81018713613210578182fd5b61321f878235602084016130be565b91505092959194509250565b6000806040838503121561323d578182fd5b61324683613115565b91506020830135801515811461325a578182fd5b809150509250929050565b60008060408385031215613277578182fd5b61328083613115565b946020939093013593505050565b600060208083850312156132a0578182fd5b82356001600160401b03808211156132b6578384fd5b818501915085601f8301126132c9578384fd5b8135818111156132db576132db614012565b83810291506132eb848301613e61565b8181528481019084860184860187018a1015613305578788fd5b8795505b8386101561332e5761331a81613115565b835260019590950194918601918601613309565b5098975050505050505050565b60006020828403121561334c578081fd5b8135611ce081614028565b600060208284031215613368578081fd5b8151611ce081614028565b600060208284031215613384578081fd5b81356001600160401b03811115613399578182fd5b8201601f810184136133a9578182fd5b612224848235602084016130be565b6000602082840312156133c9578081fd5b5035919050565b6000602082840312156133e1578081fd5b5051919050565b60008151808452613400816020860160208601613f50565b601f01601f19169290920160200192915050565b60008351613426818460208801613f50565b83519083019061343a818360208801613f50565b01949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613498908301846133e8565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611ce060208301846133e8565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526010908201526f6e6f20676966747320666f7220796f7560801b604082015260600190565b6020808252601c908201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604082015260600190565b60208082526014908201527363616e206f6e6c792072657665616c206f6e636560601b604082015260600190565b602080825260089082015267696d20736f72727960c01b604082015260600190565b6020808252600e908201526d0616d6f756e74206973203c3d20360941b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604082015260600190565b60208082526010908201526f4e6f206d6f7265207265737061776e7360801b604082015260600190565b60208082526019908201527819585c9b1e481b5a5b9d081b1a5b5a5d08195e18d959591959603a1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726040820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601390820152726e6f7420616e2061637469766520706179656560681b604082015260600190565b602080825260199082015278185b1c9958591e481b5a5b9d19590819585c9b1e48189a5c99603a1b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776040820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606082015260800190565b6020808252601690820152751d1a195c9948185c99481b9bc81b5bdc99481b19599d60521b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526016908201527519da599d1cc81a185d995b9d08195b991959081e595d60521b604082015260600190565b6020808252818101527f736f7272792c20492063616e742072657475726e20746865206368616e67652e604082015260600190565b6020808252601690820152756e6f206561726c79206d696e747320666f7220796f7560501b604082015260600190565b6020808252818101527f6d696e74656420746f6f206d756368207769746820746869732077616c6c6574604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252600f908201526e6f7574206f6620617474656d70747360881b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252600990820152681ddbdb89dd0818dd5d60ba1b604082015260600190565b60208082526007908201526611d95d081bdd5d60ca1b604082015260600190565b602080825260139082015272776861742061726520796f7520646f696e673f60681b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252600790820152661b9bdd081e595d60ca1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601390820152721b9bc81b5bdc99481d1bdad95b9cc81b19599d606a1b604082015260600190565b602080825260089082015267746f6f206c61746560c01b604082015260600190565b60208082526019908201527863616e206f6e6c7920636c61696d206769667473206f6e636560381b604082015260600190565b60208082526010908201526f69747320616c6c20646f6e65206e6f7760801b604082015260600190565b6020808252601390820152720d2dcecc2d8d2c840e0c2f2caca40d2dcc8caf606b1b604082015260600190565b90815260200190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715613e8257613e82614012565b604052919050565b60008219821115613e9d57613e9d613fe6565b500190565b600060ff821660ff84168060ff03821115613ebf57613ebf613fe6565b019392505050565b600082613ed657613ed6613ffc565b500490565b6000816000190483118215151615613ef557613ef5613fe6565b500290565b60008083128015600160ff1b850184121615613f1857613f18613fe6565b6001600160ff1b0384018313811615613f3357613f33613fe6565b50500390565b600082821015613f4b57613f4b613fe6565b500390565b60005b83811015613f6b578181015183820152602001613f53565b838111156119455750506000910152565b600281046001821680613f9057607f821691505b60208210811415613fb157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613fcb57613fcb613fe6565b5060010190565b600082613fe157613fe1613ffc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f8a57600080fdfe3bb03f550359214550f03fa46a05a60816be1decea6360453e61af120048cfe9ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b1b73f6bfbb320db180e5990d95eaff08d7d9e19ada58e25eb7d395efe96347864736f6c63430008000033

Deployed Bytecode Sourcemap

57970:12514:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56479:40;56495:12;:10;:12::i;:::-;56509:9;56479:40;;;;;;;:::i;:::-;;;;;;;;57970:12514;;;;;70252:229;;;;;;;;;;-1:-1:-1;70252:229:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59386:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25916:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27475:221::-;;;;;;;;;;-1:-1:-1;27475:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26998:411::-;;;;;;;;;;-1:-1:-1;26998:411:0;;;;;:::i;:::-;;:::i;:::-;;39667:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59487:32::-;;;;;;;;;;;;;:::i;59314:27::-;;;;;;;;;;;;;:::i;59050:38::-;;;;;;;;;;;;;:::i;28365:339::-;;;;;;;;;;-1:-1:-1;28365:339:0;;;;;:::i;:::-;;:::i;39335:256::-;;;;;;;;;;-1:-1:-1;39335:256:0;;;;;:::i;:::-;;:::i;58745:32::-;;;;;;;;;;;;;:::i;58971:44::-;;;;;;;;;;;;;:::i;28775:185::-;;;;;;;;;;-1:-1:-1;28775:185:0;;;;;:::i;:::-;;:::i;58656:40::-;;;;;;;;;;;;;:::i;39857:233::-;;;;;;;;;;-1:-1:-1;39857:233:0;;;;;:::i;:::-;;:::i;62888:189::-;;;;;;;;;;-1:-1:-1;62888:189:0;;;;;:::i;:::-;;:::i;57632:331::-;;;;;;;;;;-1:-1:-1;57632:331:0;;;;;:::i;:::-;;:::i;59526:32::-;;;;;;;;;;;;;:::i;25610:239::-;;;;;;;;;;-1:-1:-1;25610:239:0;;;;;:::i;:::-;;:::i;25340:208::-;;;;;;;;;;-1:-1:-1;25340:208:0;;;;;:::i;:::-;;:::i;46830:94::-;;;;;;;;;;;;;:::i;58333:43::-;;;;;;;;;;-1:-1:-1;58333:43:0;;;;;:::i;:::-;;:::i;58492:75::-;;;;;;;;;;;;;:::i;59201:34::-;;;;;;;;;;;;;:::i;56960:664::-;;;;;;;;;;;;;:::i;58784:50::-;;;;;;;;;;;;;:::i;59673:44::-;;;;;;;;;;-1:-1:-1;59673:44:0;;;;;:::i;:::-;;:::i;63585:516::-;;;;;;;;;;-1:-1:-1;63585:516:0;;;;;:::i;:::-;;:::i;46179:87::-;;;;;;;;;;;;;:::i;26085:104::-;;;;;;;;;;;;;:::i;59424:21::-;;;;;;;;;;;;;:::i;27768:295::-;;;;;;;;;;-1:-1:-1;27768:295:0;;;;;:::i;:::-;;:::i;68399:1568::-;;;;;;;;;;;;;:::i;63085:230::-;;;;;;;;;;;;;:::i;64548:1108::-;;;;;;;;;;;;;:::i;29031:328::-;;;;;;;;;;-1:-1:-1;29031:328:0;;;;;:::i;:::-;;:::i;63323:254::-;;;;;;;;;;-1:-1:-1;63323:254:0;;;;;:::i;:::-;;:::i;59452:28::-;;;;;;;;;;;;;:::i;58893:37::-;;;;;;;;;;;;;:::i;58841:45::-;;;;;;;;;;;;;:::i;65668:1054::-;;;;;;;;;;;;;:::i;26260:334::-;;;;;;;;;;-1:-1:-1;26260:334:0;;;;;:::i;:::-;;:::i;59348:31::-;;;;;;;;;;;;;:::i;58574:75::-;;;;;;;;;;;;;:::i;59616:50::-;;;;;;;;;;-1:-1:-1;59616:50:0;;;;;:::i;:::-;;:::i;59122:45::-;;;;;;;;;;;;;:::i;59565:44::-;;;;;;;;;;-1:-1:-1;59565:44:0;;;;;:::i;:::-;;:::i;28134:164::-;;;;;;;;;;-1:-1:-1;28134:164:0;;;;;:::i;:::-;;:::i;47079:192::-;;;;;;;;;;-1:-1:-1;47079:192:0;;;;;:::i;:::-;;:::i;64238:302::-;;;;;;;;;;;;;:::i;66752:1639::-;;;;;;:::i;:::-;;:::i;58703:35::-;;;;;;;;;;;;;:::i;59244:63::-;;;;;;;;;;;;;:::i;58385:98::-;;;;;;;;;;;;;:::i;20373:::-;20453:10;20373:98;;:::o;70252:229::-;70408:4;70437:36;70461:11;70437:23;:36::i;:::-;70430:43;;70252:229;;;;:::o;59386:31::-;;;;;;:::o;25916:100::-;25970:13;26003:5;25996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25916:100;:::o;27475:221::-;27551:7;27579:16;27587:7;27579;:16::i;:::-;27571:73;;;;-1:-1:-1;;;27571:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;27664:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27664:24:0;;27475:221::o;26998:411::-;27079:13;27095:23;27110:7;27095:14;:23::i;:::-;27079:39;;27143:5;-1:-1:-1;;;;;27137:11:0;:2;-1:-1:-1;;;;;27137:11:0;;;27129:57;;;;-1:-1:-1;;;27129:57:0;;;;;;;:::i;:::-;27237:5;-1:-1:-1;;;;;27221:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27221:21:0;;:62;;;;27246:37;27263:5;27270:12;:10;:12::i;27246:37::-;27199:168;;;;-1:-1:-1;;;27199:168:0;;;;;;;:::i;:::-;27380:21;27389:2;27393:7;27380:8;:21::i;:::-;26998:411;;;:::o;39667:113::-;39755:10;:17;39667:113;:::o;59487:32::-;;;;:::o;59314:27::-;;;;:::o;59050:38::-;;;;:::o;28365:339::-;28560:41;28579:12;:10;:12::i;:::-;28593:7;28560:18;:41::i;:::-;28552:103;;;;-1:-1:-1;;;28552:103:0;;;;;;;:::i;:::-;28668:28;28678:4;28684:2;28688:7;28668:9;:28::i;39335:256::-;39432:7;39468:23;39485:5;39468:16;:23::i;:::-;39460:5;:31;39452:87;;;;-1:-1:-1;;;39452:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;39557:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39335:256::o;58745:32::-;;;;:::o;58971:44::-;;;;:::o;28775:185::-;28913:39;28930:4;28936:2;28940:7;28913:39;;;;;;;;;;;;:16;:39::i;58656:40::-;;;;:::o;39857:233::-;39932:7;39968:30;:28;:30::i;:::-;39960:5;:38;39952:95;;;;-1:-1:-1;;;39952:95:0;;;;;;;:::i;:::-;40065:10;40076:5;40065:17;;;;;;-1:-1:-1;;;40065:17:0;;;;;;;;;;;;;;;;;40058:24;;39857:233;;;:::o;62888:189::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;62970:14:::1;::::0;62987:1:::1;62970:14;::::0;;::::1;:18;62962:46;;;;-1:-1:-1::0;;;62962:46:0::1;;;;;;;:::i;:::-;63019:14;:19:::0;;63037:1:::1;::::0;63019:14;::::1;::::0;:19:::1;::::0;63037:1;;63019:19:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;63059:10;63049:7;:20;;;;;;;;;;;;:::i;:::-;;62888:189:::0;:::o;57632:331::-;57695:25;57709:10;57695:13;:25::i;:::-;57687:57;;;;-1:-1:-1;;;57687:57:0;;;;;;;:::i;:::-;57776:1;57763:10;:14;57755:46;;;;-1:-1:-1;;;57755:46:0;;;;;;;:::i;:::-;57888:1;57852:14;57867:10;57852:26;;;;;-1:-1:-1;;;57852:26:0;;;;;;;;;;:33;:37;;;;:::i;:::-;57820:17;57838:10;57820:29;;;;;-1:-1:-1;;;57820:29:0;;;;;;;;;;;:69;57812:98;;;;-1:-1:-1;;;57812:98:0;;;;;;;:::i;:::-;57954:1;57921:17;57939:10;57921:29;;;;;-1:-1:-1;;;57921:29:0;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;;57632:331:0:o;59526:32::-;;;;:::o;25610:239::-;25682:7;25718:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25718:16:0;25753:19;25745:73;;;;-1:-1:-1;;;25745:73:0;;;;;;;:::i;25340:208::-;25412:7;-1:-1:-1;;;;;25440:19:0;;25432:74;;;;-1:-1:-1;;;25432:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25524:16:0;;;;;:9;:16;;;;;;;25340:208::o;46830:94::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;46895:21:::1;46913:1;46895:9;:21::i;:::-;46830:94::o:0;58333:43::-;;;;;;;;;;;;;;;:::o;58492:75::-;;;-1:-1:-1;;;;;58492:75:0;;:::o;59201:34::-;;;;:::o;56960:664::-;57005:25;57019:10;57005:13;:25::i;:::-;56997:57;;;;-1:-1:-1;;;56997:57:0;;;;;;;:::i;:::-;57072:9;57067:550;57091:21;57087:1;:25;57067:550;;;57134:21;57158:41;57184:14;;57158:21;:25;;:41;;;;:::i;:::-;57134:65;;57214:15;57232:65;57284:9;57294:1;57284:12;;;;;-1:-1:-1;;;57284:12:0;;;;;;;;;;;57232:47;57266:12;;57232:29;57250:7;57258:1;57250:10;;;;;-1:-1:-1;;;57250:10:0;;;;;;;;;;;57232:13;;:17;:29::i;:::-;:33;;:47::i;:::-;:51;;:65::i;:::-;57214:83;-1:-1:-1;57316:11:0;;57312:294;;57363:25;57380:7;57363:9;57373:1;57363:12;;;;;-1:-1:-1;;;57363:12:0;;;;;;;;;;;;:16;:25::i;:::-;57348:9;57358:1;57348:12;;;;;-1:-1:-1;;;57348:12:0;;;;;;;;;;:40;57424:14;;:27;;57443:7;57424:18;:27::i;:::-;57407:14;:44;57470:15;57488:14;57503:1;57488:17;;;;;-1:-1:-1;;;57488:17:0;;;;;;;;;;57506;57524:1;57506:20;;;;;-1:-1:-1;;;57506:20:0;;;;;;;;;;;57488:39;;;;;;-1:-1:-1;;;57488:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57488:39:0;;-1:-1:-1;57546:44:0;57488:39;57582:7;57546:17;:44::i;:::-;57312:294;;57067:550;;57114:3;;;;;:::i;:::-;;;;57067:550;;;;56960:664::o;58784:50::-;;;;:::o;59673:44::-;;;;;;;;;;;;;;;:::o;63585:516::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;63672:1:::1;63661:8;;:12;63653:41;;;;-1:-1:-1::0;;;63653:41:0::1;;;;;;;:::i;:::-;63722:1;63713:6;:10;63705:37;;;;-1:-1:-1::0;;;63705:37:0::1;;;;;;;:::i;:::-;63779:17;;63761:15;:35;63753:70;;;;-1:-1:-1::0;;;63753:70:0::1;;;;;;;:::i;:::-;63852:1;63841:8;;:12;:26;;;;;63866:1;63857:6;:10;63841:26;63834:260;;;63884:15;63915:12;;63902:10;;:25;;;;:::i;:::-;63884:43;;63942:13;63947:7;63942:4;:13::i;:::-;-1:-1:-1::0;63975:27:0::1;::::0;63991:10:::1;::::0;63982:7;;-1:-1:-1;;;;;;;;;;;63975:27:0;;;::::1;64031:1;64017:12;;:15;;;;;;;:::i;:::-;;;;;;;;64057:1;64047:8;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;64073:9:0::1;::::0;-1:-1:-1;64081:1:0::1;64073:9:::0;::::1;:::i;:::-;;;63834:260;;;46179:87:::0;46252:6;;-1:-1:-1;;;;;46252:6:0;46179:87;:::o;26085:104::-;26141:13;26174:7;26167:14;;;;;:::i;59424:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27768:295::-;27883:12;:10;:12::i;:::-;-1:-1:-1;;;;;27871:24:0;:8;-1:-1:-1;;;;;27871:24:0;;;27863:62;;;;-1:-1:-1;;;27863:62:0;;;;;;;:::i;:::-;27983:8;27938:18;:32;27957:12;:10;:12::i;:::-;-1:-1:-1;;;;;27938:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;27938:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;27938:53:0;;;;;;;;;;;28022:12;:10;:12::i;:::-;-1:-1:-1;;;;;28007:48:0;;28046:8;28007:48;;;;;;:::i;:::-;;;;;;;;27768:295;;:::o;68399:1568::-;68461:16;;68443:15;:34;68435:54;;;;-1:-1:-1;;;68435:54:0;;;;;;;:::i;:::-;68526:17;;68508:15;:35;68500:56;;;;-1:-1:-1;;;68500:56:0;;;;;;;:::i;:::-;68589:10;68576:24;;;;:12;:24;;;;;;;;68575:25;68567:63;;;;-1:-1:-1;;;68567:63:0;;;;;;;:::i;:::-;68654:10;68641:24;;;;:12;:24;;;;;:31;;-1:-1:-1;;68641:31:0;68668:4;68641:31;;;68720:15;;68709:8;;:26;;68720:15;68709:26;:::i;:::-;68683:53;;68767:1;68755:9;:13;68747:34;;;;-1:-1:-1;;;68747:34:0;;;;;;;:::i;:::-;68822:66;;;;;;;;;68855:15;;-1:-1:-1;;;;;68855:15:0;;;68822:66;;68872:15;;;68822:66;;;;68794:13;;;68899:630;68923:18;68919:1;:22;68899:630;;;68963:18;68984:11;68996:1;68984:14;;;;;-1:-1:-1;;;68984:14:0;;;;;;;;;;;;;68963:35;;69013:15;69048:10;-1:-1:-1;;;;;69031:38:0;;69070:10;69031:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69013:68;;69101:9;69096:422;69120:7;69116:1;:11;69096:422;;;69171:63;;-1:-1:-1;;;69171:63:0;;69153:15;;-1:-1:-1;;;;;69171:48:0;;;;;:63;;69220:10;;69232:1;;69171:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69153:81;;69253:15;69271:32;69283:10;69295:7;69271:11;:32::i;:::-;69253:50;;69336:1;69326:7;:11;:54;;;;-1:-1:-1;;;;;;69342:29:0;;;;;;:17;:29;;;;;;;;:38;;;;;;;;;;;69341:39;69326:54;69322:181;;;-1:-1:-1;;;;;69405:29:0;;;;;;:17;:29;;;;;;;;:38;;;;;;;;:45;;-1:-1:-1;;69405:45:0;69446:4;69405:45;;;;;;69473:10;;;;:::i;:::-;;;69322:181;69096:422;;69129:3;;;;;:::i;:::-;;;;69096:422;;;;68899:630;;68943:3;;;;;:::i;:::-;;;;68899:630;;;;69555:1;69547:5;:9;69539:38;;;;-1:-1:-1;;;69539:38:0;;;;;;;:::i;:::-;69590:14;69623:9;69607:5;:26;:55;;69652:9;69607:55;;;69636:5;69607:55;69590:72;;69678:9;69673:225;69697:6;69693:1;:10;69673:225;;;69764:15;69810:1;69795:12;;69782:10;;:25;;;;:::i;:::-;:29;;;;:::i;:::-;69764:47;;69826:13;69831:7;69826:4;:13::i;:::-;-1:-1:-1;69859:27:0;;69875:10;;69866:7;;-1:-1:-1;;;;;;;;;;;69859:27:0;;;;-1:-1:-1;69705:3:0;;;;:::i;:::-;;;;69673:225;;;;69920:6;69908:8;;:18;;;;;;;:::i;:::-;;;;;;;;69953:6;69937:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;68399:1568:0:o;63085:230::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;63157:6:::1;;63139:15;:24;63131:44;;;;-1:-1:-1::0;;;63131:44:0::1;;;;;;;:::i;:::-;63195:8;::::0;::::1;;63194:9;63186:42;;;;-1:-1:-1::0;;;63186:42:0::1;;;;;;;:::i;:::-;63239:8;:15:::0;;-1:-1:-1;;63239:15:0::1;63250:4;63239:15;::::0;;63297:10:::1;::::0;63281:13:::1;::::0;:26:::1;::::0;63297:10;63281:26:::1;:::i;:::-;63265:13;:42:::0;63085:230::o;64548:1108::-;64638:10;64601:7;64625:24;;;:12;:24;;;;;;;;64621:65;;;-1:-1:-1;64673:1:0;64666:8;;64621:65;64698:16;64737:27;64755:8;;64737:13;:11;:13::i;:::-;:17;;:27::i;:::-;64724:10;;:40;;;;:::i;:::-;64698:67;;64800:1;64787:9;:14;64783:55;;64825:1;64818:8;;;;;64783:55;64895:10;64850:14;64883:23;;;:11;:23;;;;;;;;64879:94;;;64935:26;;64925:36;;;;:::i;:::-;;;64879:94;64985:66;;;;;;;;;65018:15;;-1:-1:-1;;;;;65018:15:0;;;64985:66;;65035:15;;;64985:66;;;;:29;65062:509;65086:18;65082:1;:22;65062:509;;;65126:18;65147:11;65159:1;65147:14;;;;;-1:-1:-1;;;65147:14:0;;;;;;;;;;;;;65126:35;;65176:15;65211:10;-1:-1:-1;;;;;65194:38:0;;65233:10;65194:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65176:68;;65264:9;65259:301;65283:7;65279:1;:11;65259:301;;;65334:63;;-1:-1:-1;;;65334:63:0;;65316:15;;-1:-1:-1;;;;;65334:48:0;;;;;:63;;65383:10;;65395:1;;65334:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65421:27:0;;;;;;:15;:27;;;;;;;;:36;;;;;;;;;65316:81;;-1:-1:-1;65421:36:0;;65416:128;;65492:32;65504:10;65516:7;65492:11;:32::i;:::-;65482:42;;;;:::i;:::-;;;65416:128;-1:-1:-1;65292:3:0;;;;:::i;:::-;;;;65259:301;;;;65062:509;;65106:3;;;;;:::i;:::-;;;;65062:509;;;;65608:9;65590:6;:28;;:58;;65638:9;65590:58;;;65621:6;65590:58;65583:65;;;;;64548:1108;:::o;29031:328::-;29206:41;29225:12;:10;:12::i;:::-;29239:7;29206:18;:41::i;:::-;29198:103;;;;-1:-1:-1;;;29198:103:0;;;;;;;:::i;:::-;29312:39;29326:4;29332:2;29336:7;29345:5;29312:13;:39::i;:::-;29031:328;;;;:::o;63323:254::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;63424:16:::1;;63406:15;:34;63398:55;;;;-1:-1:-1::0;;;63398:55:0::1;;;;;;;:::i;:::-;63469:9;63464:106;63488:9;:16;63484:1;:20;63464:106;;;63554:4;63526:11;:25;63538:9;63548:1;63538:12;;;;;;-1:-1:-1::0;;;63538:12:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;63526:25:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;63526:25:0;:32;;-1:-1:-1;;63526:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63506:3;::::1;::::0;::::1;:::i;:::-;;;;63464:106;;59452:28:::0;;;;;;:::o;58893:37::-;;;;:::o;58841:45::-;;;;:::o;65668:1054::-;65753:10;65716:7;65740:24;;;:12;:24;;;;;;;;65736:65;;;-1:-1:-1;65788:1:0;65781:8;;65736:65;65813:21;65855:15;;65844:8;;:26;;;;:::i;:::-;65813:58;;65904:1;65886:14;:19;65882:60;;65929:1;65922:8;;;;;65882:60;65982:66;;;;;;;;;66015:15;;-1:-1:-1;;;;;66015:15:0;;;65982:66;;66032:15;;;65982:66;;;;65954:13;;;66059:562;66083:18;66079:1;:22;66059:562;;;66123:18;66144:11;66156:1;66144:14;;;;;-1:-1:-1;;;66144:14:0;;;;;;;;;;;;;66123:35;;66173:15;66208:10;-1:-1:-1;;;;;66191:38:0;;66230:10;66191:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66173:68;;66261:9;66256:354;66280:7;66276:1;:11;66256:354;;;66331:63;;-1:-1:-1;;;66331:63:0;;66313:15;;-1:-1:-1;;;;;66331:48:0;;;;;:63;;66380:10;;66392:1;;66331:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66313:81;;66413:15;66431:32;66443:10;66455:7;66431:11;:32::i;:::-;66413:50;;66496:1;66486:7;:11;:54;;;;-1:-1:-1;;;;;;66502:29:0;;;;;;:17;:29;;;;;;;;:38;;;;;;;;;;;66501:39;66486:54;66482:113;;;66565:10;66574:1;66565:10;;:::i;:::-;;;66482:113;66256:354;;66289:3;;;;;:::i;:::-;;;;66256:354;;;;66059:562;;66103:3;;;;;:::i;:::-;;;;66059:562;;26260:334;26333:13;26367:16;26375:7;26367;:16::i;:::-;26359:76;;;;-1:-1:-1;;;26359:76:0;;;;;;;:::i;:::-;26448:21;26472:10;:8;:10::i;:::-;26448:34;;26524:1;26506:7;26500:21;:25;:86;;;;;;;;;;;;;;;;;26552:7;26561:18;:7;:16;:18::i;:::-;26535:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26500:86;26493:93;26260:334;-1:-1:-1;;;26260:334:0:o;59348:31::-;;;;:::o;58574:75::-;;;-1:-1:-1;;;;;58574:75:0;;:::o;59616:50::-;;;;;;;;;;;;;:::o;59122:45::-;;;;:::o;59565:44::-;;;;;;;;;;;;;;;:::o;28134:164::-;-1:-1:-1;;;;;28255:25:0;;;28231:4;28255:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28134:164::o;47079:192::-;46410:12;:10;:12::i;:::-;-1:-1:-1;;;;;46399:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46399:23:0;;46391:68;;;;-1:-1:-1;;;46391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47168:22:0;::::1;47160:73;;;;-1:-1:-1::0;;;47160:73:0::1;;;;;;;:::i;:::-;47244:19;47254:8;47244:9;:19::i;64238:302::-:0;64379:10;64290:7;64363:27;;;:15;:27;;;;;;64330:30;;64290:7;;64330:60;;;:::i;:::-;64310:80;;64401:17;64434:27;64452:8;;64434:13;:11;:13::i;:27::-;64421:10;;:40;;;;:::i;:::-;64401:60;;64499:9;64486;:22;;:46;;64523:9;64486:46;;;64511:9;64486:46;64479:53;;;;64238:302;:::o;66752:1639::-;66832:1;66823:6;:10;66815:42;;;;-1:-1:-1;;;66815:42:0;;;;;;;:::i;:::-;66894:16;;66876:15;:34;66868:54;;;;-1:-1:-1;;;66868:54:0;;;;;;;:::i;:::-;66941:10;;66967:9;;66941:22;;66956:6;66941:14;:22::i;:::-;:35;;66933:57;;;;-1:-1:-1;;;66933:57:0;;;;;;;:::i;:::-;67001:17;67034:27;67052:8;;67034:13;:11;:13::i;:27::-;67021:10;;:40;;;;:::i;:::-;67001:60;;67092:1;67080:9;:13;67072:48;;;;-1:-1:-1;;;67072:48:0;;;;;;;:::i;:::-;67149:9;67139:6;:19;;67131:64;;;;-1:-1:-1;;;67131:64:0;;;;;;;:::i;:::-;67230:10;;67212:15;:28;67208:896;;;67279:10;67266:24;;;;:12;:24;;;;;;;;67265:25;67257:63;;;;-1:-1:-1;;;67257:63:0;;;;;;;:::i;:::-;67348:10;67335:24;;;;:12;:24;;;;;;;;:31;;-1:-1:-1;;67335:31:0;67362:4;67335:31;;;67427:11;:23;;;;;;67335:31;67427:23;67423:109;;;67490:26;;67471:45;;;;:::i;:::-;;;67423:109;67565:24;:22;:24::i;:::-;67546:43;;;;:::i;:::-;;;67630:1;67612:15;:19;67604:54;;;;-1:-1:-1;;;67604:54:0;;;;;;;:::i;:::-;67691:15;67681:6;:25;;67673:63;;;;-1:-1:-1;;;67673:63:0;;;;;;;:::i;:::-;67208:896;;;;67857:10;67769:21;67841:27;;;:15;:27;;;;;;67800:30;;67793:76;;67841:27;67793:76;:::i;:::-;67769:100;;67909:1;67892:14;:18;67884:63;;;;-1:-1:-1;;;67884:63:0;;;;;;;:::i;:::-;67988:14;67970:6;:33;;67962:78;;;;-1:-1:-1;;;67962:78:0;;;;;;;:::i;:::-;68071:10;68055:27;;;;:15;:27;;;;;:37;;68086:6;;68055:27;:37;;68086:6;;68055:37;:::i;:::-;;;;-1:-1:-1;;;67208:896:0;68128:6;68124:163;68144:6;68140:1;:10;68124:163;;;68172:15;68192:8;;68190:10;;;;;:::i;:::-;;;;;-1:-1:-1;68190:10:0;-1:-1:-1;68215:13:0;68190:10;68215:4;:13::i;:::-;-1:-1:-1;68248:27:0;;68264:10;;68255:7;;68248:27;;;;;-1:-1:-1;68152:3:0;;;;:::i;:::-;;;;68124:163;;;;68347:16;68365:15;68330:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68330:51:0;;;;;;;;;68320:62;;68330:51;68320:62;;;;68299:13;:84;-1:-1:-1;;66752:1639:0:o;58703:35::-;;;;:::o;59244:63::-;;;;:::o;58385:98::-;;;;;;;:::i;39027:224::-;39129:4;-1:-1:-1;;;;;;39153:50:0;;-1:-1:-1;;;39153:50:0;;:90;;;39207:36;39231:11;39207:23;:36::i;30869:127::-;30934:4;30958:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30958:16:0;:30;;;30869:127::o;34851:174::-;34926:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34926:29:0;-1:-1:-1;;;;;34926:29:0;;;;;;;;:24;;34980:23;34926:24;34980:14;:23::i;:::-;-1:-1:-1;;;;;34971:46:0;;;;;;;;;;;34851:174;;:::o;31163:348::-;31256:4;31281:16;31289:7;31281;:16::i;:::-;31273:73;;;;-1:-1:-1;;;31273:73:0;;;;;;;:::i;:::-;31357:13;31373:23;31388:7;31373:14;:23::i;:::-;31357:39;;31426:5;-1:-1:-1;;;;;31415:16:0;:7;-1:-1:-1;;;;;31415:16:0;;:51;;;;31459:7;-1:-1:-1;;;;;31435:31:0;:20;31447:7;31435:11;:20::i;:::-;-1:-1:-1;;;;;31435:31:0;;31415:51;:87;;;;31470:32;31487:5;31494:7;31470:16;:32::i;:::-;31407:96;31163:348;-1:-1:-1;;;;31163:348:0:o;34155:578::-;34314:4;-1:-1:-1;;;;;34287:31:0;:23;34302:7;34287:14;:23::i;:::-;-1:-1:-1;;;;;34287:31:0;;34279:85;;;;-1:-1:-1;;;34279:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34383:16:0;;34375:65;;;;-1:-1:-1;;;34375:65:0;;;;;;;:::i;:::-;34453:39;34474:4;34480:2;34484:7;34453:20;:39::i;:::-;34557:29;34574:1;34578:7;34557:8;:29::i;:::-;-1:-1:-1;;;;;34599:15:0;;;;;;:9;:15;;;;;:20;;34618:1;;34599:15;:20;;34618:1;;34599:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34630:13:0;;;;;;:9;:13;;;;;:18;;34647:1;;34630:13;:18;;34647:1;;34630:18;:::i;:::-;;;;-1:-1:-1;;34659:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34659:21:0;-1:-1:-1;;;;;34659:21:0;;;;;;;;;34698:27;;34659:16;;34698:27;;;;-1:-1:-1;;;;;;;;;;;34698:27:0;;34155:578;;;:::o;56535:415::-;56637:17;:20;56619:14;:39;;56594:4;;-1:-1:-1;;;;;56619:47:0;;;:14;:39;;;;-1:-1:-1;;;56619:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56619:39:0;:47;;:116;;-1:-1:-1;56706:20:0;;56688:17;:39;;-1:-1:-1;;;;;56688:47:0;;;56706:20;56688:39;;;;-1:-1:-1;;;56688:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56688:39:0;:47;56619:116;:185;;;-1:-1:-1;56775:20:0;;56757:17;:39;;-1:-1:-1;;;;;56757:47:0;;;56775:20;56757:39;;;;-1:-1:-1;;;56757:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56757:39:0;:47;56619:185;:254;;;-1:-1:-1;56844:20:0;;56826:17;:39;;-1:-1:-1;;;;;56826:47:0;;;56844:20;56826:39;;;;-1:-1:-1;;;56826:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56826:39:0;:47;56619:254;:323;;;-1:-1:-1;56913:20:0;;56895:17;:39;;-1:-1:-1;;;;;56895:47:0;;;56913:20;56895:39;;;;-1:-1:-1;;;56895:39:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56895:39:0;:47;;56535:415;-1:-1:-1;;56535:415:0:o;47279:173::-;47354:6;;;-1:-1:-1;;;;;47371:17:0;;;-1:-1:-1;;;;;;47371:17:0;;;;;;;47404:40;;47354:6;;;47371:17;47354:6;;47404:40;;47335:16;;47404:40;47279:173;;:::o;50259:98::-;50317:7;50344:5;50348:1;50344;:5;:::i;50997:98::-;51055:7;51082:5;51086:1;51082;:5;:::i;51396:98::-;51454:7;51481:5;51485:1;51481;:5;:::i;50640:98::-;50698:7;50725:5;50729:1;50725;:5;:::i;13731:317::-;13846:6;13821:21;:31;;13813:73;;;;-1:-1:-1;;;13813:73:0;;;;;;;:::i;:::-;13900:12;13918:9;-1:-1:-1;;;;;13918:14:0;13940:6;13918:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13899:52;;;13970:7;13962:78;;;;-1:-1:-1;;;13962:78:0;;;;;;;:::i;62616:243::-;62664:7;62708:10;;62692:13;:11;:13::i;:::-;:26;62684:58;;;;-1:-1:-1;;;62684:58:0;;;;;;;:::i;:::-;62753:30;62763:10;62775:7;62753:9;:30::i;:::-;62799:27;;62815:10;;62806:7;;62799:27;;;;;-1:-1:-1;62844:7:0;62616:243::o;60059:1743::-;60207:15;;60139:7;;;;-1:-1:-1;;;;;60193:29:0;;;60207:15;;60193:29;60189:1581;;;60243:7;60254:11;60243:22;60239:840;;;60286:13;60297:2;60286:13;;:::i;:::-;;;60239:840;;;60441:11;60430:7;:22;;:48;;;;;60467:11;60456:7;:22;;60430:48;60426:653;;;60499:12;60510:1;60499:12;;:::i;60426:653::-;60656:11;60645:7;:22;;:48;;;;;60682:11;60671:7;:22;;60645:48;60641:438;;;60714:12;60725:1;60714:12;;:::i;60641:438::-;60869:11;60858:7;:22;;:48;;;;;60895:11;60884:7;:22;;60858:48;60854:225;;;60927:12;60938:1;60927:12;;:::i;:::-;;;60854:225;60189:1581;;;61114:15;;-1:-1:-1;;;;;61100:29:0;;;61114:15;;61100:29;61096:674;;;61161:11;61150:7;:22;;:48;;;;;61187:11;61176:7;:22;;61150:48;61146:613;;;61219:12;61230:1;61219:12;;:::i;61146:613::-;61361:11;61350:7;:22;;:48;;;;;61387:11;61376:7;:22;;61350:48;61346:413;;;61419:12;61430:1;61419:12;;:::i;61346:413::-;61575:11;61564:7;:22;;:48;;;;;61601:11;61590:7;:22;;61564:48;61560:199;;;61633:12;61644:1;61633:12;;:::i;30241:315::-;30398:28;30408:4;30414:2;30418:7;30398:9;:28::i;:::-;30445:48;30468:4;30474:2;30478:7;30487:5;30445:22;:48::i;:::-;30437:111;;;;-1:-1:-1;;;30437:111:0;;;;;;;:::i;64130:100::-;64182:13;64215:7;64208:14;;;;;:::i;20906:723::-;20962:13;21183:10;21179:53;;-1:-1:-1;21210:10:0;;;;;;;;;;;;-1:-1:-1;;;21210:10:0;;;;;;21179:53;21257:5;21242:12;21298:78;21305:9;;21298:78;;21331:8;;;;:::i;:::-;;-1:-1:-1;21354:10:0;;-1:-1:-1;21362:2:0;21354:10;;:::i;:::-;;;21298:78;;;21386:19;21418:6;-1:-1:-1;;;;;21408:17:0;;;;;-1:-1:-1;;;21408:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21408:17:0;;21386:39;;21436:154;21443:10;;21436:154;;21470:11;21480:1;21470:11;;:::i;:::-;;-1:-1:-1;21539:10:0;21547:2;21539:5;:10;:::i;:::-;21526:24;;:2;:24;:::i;:::-;21513:39;;21496:6;21503;21496:14;;;;;;-1:-1:-1;;;21496:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;21496:56:0;;;;;;;;-1:-1:-1;21567:11:0;21576:2;21567:11;;:::i;:::-;;;21436:154;;61812:794;61915:66;;;;;;;;;61948:15;;-1:-1:-1;;;;;61948:15:0;;;61915:66;;61965:15;;;61915:66;;;;61863:7;;;;;61992:579;62016:18;62012:1;:22;61992:579;;;62056:18;62077:11;62089:1;62077:14;;;;;-1:-1:-1;;;62077:14:0;;;;;;;;;;;;;62056:35;;62106:15;62141:10;-1:-1:-1;;;;;62124:38:0;;62163:10;62124:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62106:68;;62194:9;62189:371;62213:7;62209:1;:11;62189:371;;;62264:63;;-1:-1:-1;;;62264:63:0;;62246:15;;-1:-1:-1;;;;;62264:48:0;;;;;:63;;62313:10;;62325:1;;62264:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62351:27:0;;;;;;:15;:27;;;;;;;;:36;;;;;;;;;62246:81;;-1:-1:-1;62351:36:0;;62346:198;;-1:-1:-1;;;;;62412:27:0;;;;;;:15;:27;;;;;;;;:36;;;;;;;;:43;;-1:-1:-1;;62412:43:0;62451:4;62412:43;;;62492:32;62428:10;62440:7;62492:11;:32::i;:::-;62478:46;;;;:::i;:::-;;;62346:198;-1:-1:-1;62222:3:0;;;;:::i;:::-;;;;62189:371;;;;61992:579;;62036:3;;;;;:::i;:::-;;;;61992:579;;;-1:-1:-1;62588:10:0;;-1:-1:-1;;61812:794:0;:::o;24971:305::-;25073:4;-1:-1:-1;;;;;;25110:40:0;;-1:-1:-1;;;25110:40:0;;:105;;-1:-1:-1;;;;;;;25167:48:0;;-1:-1:-1;;;25167:48:0;25110:105;:158;;;;25232:36;25256:11;25232:23;:36::i;70021:223::-;70191:45;70218:4;70224:2;70228:7;70191:26;:45::i;31853:110::-;31929:26;31939:2;31943:7;31929:26;;;;;;;;;;;;:9;:26::i;35590:799::-;35745:4;35766:15;:2;-1:-1:-1;;;;;35766:13:0;;:15::i;:::-;35762:620;;;35818:2;-1:-1:-1;;;;;35802:36:0;;35839:12;:10;:12::i;:::-;35853:4;35859:7;35868:5;35802:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35802:72:0;;;;;;;;-1:-1:-1;;35802:72:0;;;;;;;;;;;;:::i;:::-;;;35798:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36044:13:0;;36040:272;;36087:60;;-1:-1:-1;;;36087:60:0;;;;;;;:::i;36040:272::-;36262:6;36256:13;36247:6;36243:2;36239:15;36232:38;35798:529;-1:-1:-1;;;;;;35925:51:0;-1:-1:-1;;;35925:51:0;;-1:-1:-1;35918:58:0;;35762:620;-1:-1:-1;36366:4:0;35590:799;;;;;;:::o;23469:157::-;-1:-1:-1;;;;;;23578:40:0;;-1:-1:-1;;;23578:40:0;23469:157;;;:::o;40703:589::-;40847:45;40874:4;40880:2;40884:7;40847:26;:45::i;:::-;-1:-1:-1;;;;;40909:18:0;;40905:187;;40944:40;40976:7;40944:31;:40::i;:::-;40905:187;;;41014:2;-1:-1:-1;;;;;41006:10:0;:4;-1:-1:-1;;;;;41006:10:0;;41002:90;;41033:47;41066:4;41072:7;41033:32;:47::i;:::-;-1:-1:-1;;;;;41106:16:0;;41102:183;;41139:45;41176:7;41139:36;:45::i;:::-;41102:183;;;41212:4;-1:-1:-1;;;;;41206:10:0;:2;-1:-1:-1;;;;;41206:10:0;;41202:83;;41233:40;41261:2;41265:7;41233:27;:40::i;32190:321::-;32320:18;32326:2;32330:7;32320:5;:18::i;:::-;32371:54;32402:1;32406:2;32410:7;32419:5;32371:22;:54::i;:::-;32349:154;;;;-1:-1:-1;;;32349:154:0;;;;;;;:::i;12409:387::-;12732:20;12780:8;;;12409:387::o;42015:164::-;42119:10;:17;;42092:24;;;;:15;:24;;;;;:44;;;42147:24;;;;;;;;;;;;42015:164::o;42806:988::-;43072:22;43122:1;43097:22;43114:4;43097:16;:22::i;:::-;:26;;;;:::i;:::-;43134:18;43155:26;;;:17;:26;;;;;;43072:51;;-1:-1:-1;43288:28:0;;;43284:328;;-1:-1:-1;;;;;43355:18:0;;43333:19;43355:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43406:30;;;;;;:44;;;43523:30;;:17;:30;;;;;:43;;;43284:328;-1:-1:-1;43708:26:0;;;;:17;:26;;;;;;;;43701:33;;;-1:-1:-1;;;;;43752:18:0;;;;;:12;:18;;;;;:34;;;;;;;43745:41;42806:988::o;44089:1079::-;44367:10;:17;44342:22;;44367:21;;44387:1;;44367:21;:::i;:::-;44399:18;44420:24;;;:15;:24;;;;;;44793:10;:26;;44342:46;;-1:-1:-1;44420:24:0;;44342:46;;44793:26;;;;-1:-1:-1;;;44793:26:0;;;;;;;;;;;;;;;;;44771:48;;44857:11;44832:10;44843;44832:22;;;;;;-1:-1:-1;;;44832:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;44937:28;;;;;;;;;;:41;;;45109:24;;;;;45102:31;45144:10;:16;;;;;-1:-1:-1;;;45144:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;44089:1079;;;;:::o;41593:221::-;41678:14;41695:20;41712:2;41695:16;:20::i;:::-;-1:-1:-1;;;;;41726:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41771:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41593:221:0:o;32847:382::-;-1:-1:-1;;;;;32927:16:0;;32919:61;;;;-1:-1:-1;;;32919:61:0;;;;;;;:::i;:::-;33000:16;33008:7;33000;:16::i;:::-;32999:17;32991:58;;;;-1:-1:-1;;;32991:58:0;;;;;;;:::i;:::-;33062:45;33091:1;33095:2;33099:7;33062:20;:45::i;:::-;-1:-1:-1;;;;;33120:13:0;;;;;;:9;:13;;;;;:18;;33137:1;;33120:13;:18;;33137:1;;33120:18;:::i;:::-;;;;-1:-1:-1;;33149:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33149:21:0;-1:-1:-1;;;;;33149:21:0;;;;;;;;33188:33;;33149:16;;;-1:-1:-1;;;;;;;;;;;33188:33:0;33149:16;;33188:33;32847:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;-1:-1:-1;;;;;103:30:1;;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:198;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;769:31;790:9;769:31;:::i;811:274::-;;;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:31;1010:9;989:31;:::i;:::-;979:41;;1039:40;1075:2;1064:9;1060:18;1039:40;:::i;:::-;1029:50;;898:187;;;;;:::o;1090:342::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1285:31;1306:9;1285:31;:::i;:::-;1275:41;;1335:40;1371:2;1360:9;1356:18;1335:40;:::i;:::-;1325:50;;1422:2;1411:9;1407:18;1394:32;1384:42;;1194:238;;;;;:::o;1437:702::-;;;;;1609:3;1597:9;1588:7;1584:23;1580:33;1577:2;;;1631:6;1623;1616:22;1577:2;1659:31;1680:9;1659:31;:::i;:::-;1649:41;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;:::-;1699:50;-1:-1:-1;1796:2:1;1781:18;;1768:32;;-1:-1:-1;1851:2:1;1836:18;;1823:32;-1:-1:-1;;;;;1867:30:1;;1864:2;;;1915:6;1907;1900:22;1864:2;1943:22;;1996:4;1988:13;;1984:27;-1:-1:-1;1974:2:1;;2030:6;2022;2015:22;1974:2;2058:75;2125:7;2120:2;2107:16;2102:2;2098;2094:11;2058:75;:::i;:::-;2048:85;;;1567:572;;;;;;;:::o;2144:369::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2291:6;2283;2276:22;2238:2;2319:31;2340:9;2319:31;:::i;:::-;2309:41;;2400:2;2389:9;2385:18;2372:32;2447:5;2440:13;2433:21;2426:5;2423:32;2413:2;;2474:6;2466;2459:22;2413:2;2502:5;2492:15;;;2228:285;;;;;:::o;2518:266::-;;;2647:2;2635:9;2626:7;2622:23;2618:32;2615:2;;;2668:6;2660;2653:22;2615:2;2696:31;2717:9;2696:31;:::i;:::-;2686:41;2774:2;2759:18;;;;2746:32;;-1:-1:-1;;;2605:179:1:o;2789:1010::-;;2904:2;2947;2935:9;2926:7;2922:23;2918:32;2915:2;;;2968:6;2960;2953:22;2915:2;3000:23;;-1:-1:-1;;;;;3072:14:1;;;3069:2;;;3104:6;3096;3089:22;3069:2;3147:6;3136:9;3132:22;3122:32;;3192:7;3185:4;3181:2;3177:13;3173:27;3163:2;;3219:6;3211;3204:22;3163:2;3260;3247:16;3282:2;3278;3275:10;3272:2;;;3288:18;;:::i;:::-;3335:2;3331;3327:11;3317:21;;3358:27;3381:2;3377;3373:11;3358:27;:::i;:::-;3419:15;;;3450:12;;;;3482:11;;;3512;;;3508:20;;3505:33;-1:-1:-1;3502:2:1;;;3556:6;3548;3541:22;3502:2;3583:6;3574:15;;3598:171;3612:2;3609:1;3606:9;3598:171;;;3669:25;3690:3;3669:25;:::i;:::-;3657:38;;3630:1;3623:9;;;;;3715:12;;;;3747;;3598:171;;;-1:-1:-1;3788:5:1;2884:915;-1:-1:-1;;;;;;;;2884:915:1:o;3804:257::-;;3915:2;3903:9;3894:7;3890:23;3886:32;3883:2;;;3936:6;3928;3921:22;3883:2;3980:9;3967:23;3999:32;4025:5;3999:32;:::i;4066:261::-;;4188:2;4176:9;4167:7;4163:23;4159:32;4156:2;;;4209:6;4201;4194:22;4156:2;4246:9;4240:16;4265:32;4291:5;4265:32;:::i;4332:482::-;;4454:2;4442:9;4433:7;4429:23;4425:32;4422:2;;;4475:6;4467;4460:22;4422:2;4507:23;;-1:-1:-1;;;;;4542:30:1;;4539:2;;;4590:6;4582;4575:22;4539:2;4618:22;;4671:4;4663:13;;4659:27;-1:-1:-1;4649:2:1;;4705:6;4697;4690:22;4649:2;4733:75;4800:7;4795:2;4782:16;4777:2;4773;4769:11;4733:75;:::i;4819:190::-;;4931:2;4919:9;4910:7;4906:23;4902:32;4899:2;;;4952:6;4944;4937:22;4899:2;-1:-1:-1;4980:23:1;;4889:120;-1:-1:-1;4889:120:1:o;5014:194::-;;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5158:6;5150;5143:22;5105:2;-1:-1:-1;5186:16:1;;5095:113;-1:-1:-1;5095:113:1:o;5213:259::-;;5294:5;5288:12;5321:6;5316:3;5309:19;5337:63;5393:6;5386:4;5381:3;5377:14;5370:4;5363:5;5359:16;5337:63;:::i;:::-;5454:2;5433:15;-1:-1:-1;;5429:29:1;5420:39;;;;5461:4;5416:50;;5264:208;-1:-1:-1;;5264:208:1:o;5477:470::-;;5694:6;5688:13;5710:53;5756:6;5751:3;5744:4;5736:6;5732:17;5710:53;:::i;:::-;5826:13;;5785:16;;;;5848:57;5826:13;5785:16;5882:4;5870:17;;5848:57;:::i;:::-;5921:20;;5664:283;-1:-1:-1;;;;5664:283:1:o;6162:247::-;6319:19;;;6363:2;6354:12;;6347:28;6400:2;6391:12;;6309:100::o;6414:203::-;-1:-1:-1;;;;;6578:32:1;;;;6560:51;;6548:2;6533:18;;6515:102::o;6622:490::-;-1:-1:-1;;;;;6891:15:1;;;6873:34;;6943:15;;6938:2;6923:18;;6916:43;6990:2;6975:18;;6968:34;;;7038:3;7033:2;7018:18;;7011:31;;;6622:490;;7059:47;;7086:19;;7078:6;7059:47;:::i;:::-;7051:55;6825:287;-1:-1:-1;;;;;;6825:287:1:o;7117:274::-;-1:-1:-1;;;;;7309:32:1;;;;7291:51;;7373:2;7358:18;;7351:34;7279:2;7264:18;;7246:145::o;7396:187::-;7561:14;;7554:22;7536:41;;7524:2;7509:18;;7491:92::o;7588:221::-;;7737:2;7726:9;7719:21;7757:46;7799:2;7788:9;7784:18;7776:6;7757:46;:::i;7814:407::-;8016:2;7998:21;;;8055:2;8035:18;;;8028:30;8094:34;8089:2;8074:18;;8067:62;-1:-1:-1;;;8160:2:1;8145:18;;8138:41;8211:3;8196:19;;7988:233::o;8226:414::-;8428:2;8410:21;;;8467:2;8447:18;;;8440:30;8506:34;8501:2;8486:18;;8479:62;-1:-1:-1;;;8572:2:1;8557:18;;8550:48;8630:3;8615:19;;8400:240::o;8645:402::-;8847:2;8829:21;;;8886:2;8866:18;;;8859:30;8925:34;8920:2;8905:18;;8898:62;-1:-1:-1;;;8991:2:1;8976:18;;8969:36;9037:3;9022:19;;8819:228::o;9052:340::-;9254:2;9236:21;;;9293:2;9273:18;;;9266:30;-1:-1:-1;;;9327:2:1;9312:18;;9305:46;9383:2;9368:18;;9226:166::o;9397:352::-;9599:2;9581:21;;;9638:2;9618:18;;;9611:30;-1:-1:-1;;;9672:2:1;9657:18;;9650:58;9740:2;9725:18;;9571:178::o;9754:344::-;9956:2;9938:21;;;9995:2;9975:18;;;9968:30;-1:-1:-1;;;10029:2:1;10014:18;;10007:50;10089:2;10074:18;;9928:170::o;10103:331::-;10305:2;10287:21;;;10344:1;10324:18;;;10317:29;-1:-1:-1;;;10377:2:1;10362:18;;10355:38;10425:2;10410:18;;10277:157::o;10439:338::-;10641:2;10623:21;;;10680:2;10660:18;;;10653:30;-1:-1:-1;;;10714:2:1;10699:18;;10692:44;10768:2;10753:18;;10613:164::o;10782:400::-;10984:2;10966:21;;;11023:2;11003:18;;;10996:30;11062:34;11057:2;11042:18;;11035:62;-1:-1:-1;;;11128:2:1;11113:18;;11106:34;11172:3;11157:19;;10956:226::o;11187:349::-;11389:2;11371:21;;;11428:2;11408:18;;;11401:30;-1:-1:-1;;;11462:2:1;11447:18;;11440:55;11527:2;11512:18;;11361:175::o;11541:340::-;11743:2;11725:21;;;11782:2;11762:18;;;11755:30;-1:-1:-1;;;11816:2:1;11801:18;;11794:46;11872:2;11857:18;;11715:166::o;11886:349::-;12088:2;12070:21;;;12127:2;12107:18;;;12100:30;-1:-1:-1;;;12161:2:1;12146:18;;12139:55;12226:2;12211:18;;12060:175::o;12240:422::-;12442:2;12424:21;;;12481:2;12461:18;;;12454:30;12520:34;12515:2;12500:18;;12493:62;-1:-1:-1;;;12586:2:1;12571:18;;12564:56;12652:3;12637:19;;12414:248::o;12667:353::-;12869:2;12851:21;;;12908:2;12888:18;;;12881:30;12947:31;12942:2;12927:18;;12920:59;13011:2;12996:18;;12841:179::o;13025:408::-;13227:2;13209:21;;;13266:2;13246:18;;;13239:30;13305:34;13300:2;13285:18;;13278:62;-1:-1:-1;;;13371:2:1;13356:18;;13349:42;13423:3;13408:19;;13199:234::o;13438:343::-;13640:2;13622:21;;;13679:2;13659:18;;;13652:30;-1:-1:-1;;;13713:2:1;13698:18;;13691:49;13772:2;13757:18;;13612:169::o;13786:349::-;13988:2;13970:21;;;14027:2;14007:18;;;14000:30;-1:-1:-1;;;14061:2:1;14046:18;;14039:55;14126:2;14111:18;;13960:175::o;14140:420::-;14342:2;14324:21;;;14381:2;14361:18;;;14354:30;14420:34;14415:2;14400:18;;14393:62;-1:-1:-1;;;14486:2:1;14471:18;;14464:54;14550:3;14535:19;;14314:246::o;14565:346::-;14767:2;14749:21;;;14806:2;14786:18;;;14779:30;-1:-1:-1;;;14840:2:1;14825:18;;14818:52;14902:2;14887:18;;14739:172::o;14916:406::-;15118:2;15100:21;;;15157:2;15137:18;;;15130:30;15196:34;15191:2;15176:18;;15169:62;-1:-1:-1;;;15262:2:1;15247:18;;15240:40;15312:3;15297:19;;15090:232::o;15327:405::-;15529:2;15511:21;;;15568:2;15548:18;;;15541:30;15607:34;15602:2;15587:18;;15580:62;-1:-1:-1;;;15673:2:1;15658:18;;15651:39;15722:3;15707:19;;15501:231::o;15737:346::-;15939:2;15921:21;;;15978:2;15958:18;;;15951:30;-1:-1:-1;;;16012:2:1;15997:18;;15990:52;16074:2;16059:18;;15911:172::o;16088:356::-;16290:2;16272:21;;;16309:18;;;16302:30;16368:34;16363:2;16348:18;;16341:62;16435:2;16420:18;;16262:182::o;16449:346::-;16651:2;16633:21;;;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16724:2:1;16709:18;;16702:52;16786:2;16771:18;;16623:172::o;16800:356::-;17002:2;16984:21;;;17021:18;;;17014:30;17080:34;17075:2;17060:18;;17053:62;17147:2;17132:18;;16974:182::o;17161:356::-;17363:2;17345:21;;;17382:18;;;17375:30;17441:34;17436:2;17421:18;;17414:62;17508:2;17493:18;;17335:182::o;17522:339::-;17724:2;17706:21;;;17763:2;17743:18;;;17736:30;-1:-1:-1;;;17797:2:1;17782:18;;17775:45;17852:2;17837:18;;17696:165::o;17866:408::-;18068:2;18050:21;;;18107:2;18087:18;;;18080:30;18146:34;18141:2;18126:18;;18119:62;-1:-1:-1;;;18212:2:1;18197:18;;18190:42;18264:3;18249:19;;18040:234::o;18279:356::-;18481:2;18463:21;;;18500:18;;;18493:30;18559:34;18554:2;18539:18;;18532:62;18626:2;18611:18;;18453:182::o;18640:405::-;18842:2;18824:21;;;18881:2;18861:18;;;18854:30;18920:34;18915:2;18900:18;;18893:62;-1:-1:-1;;;18986:2:1;18971:18;;18964:39;19035:3;19020:19;;18814:231::o;19050:411::-;19252:2;19234:21;;;19291:2;19271:18;;;19264:30;19330:34;19325:2;19310:18;;19303:62;-1:-1:-1;;;19396:2:1;19381:18;;19374:45;19451:3;19436:19;;19224:237::o;19466:332::-;19668:2;19650:21;;;19707:1;19687:18;;;19680:29;-1:-1:-1;;;19740:2:1;19725:18;;19718:39;19789:2;19774:18;;19640:158::o;19803:330::-;20005:2;19987:21;;;20044:1;20024:18;;;20017:29;-1:-1:-1;;;20077:2:1;20062:18;;20055:37;20124:2;20109:18;;19977:156::o;20138:343::-;20340:2;20322:21;;;20379:2;20359:18;;;20352:30;-1:-1:-1;;;20413:2:1;20398:18;;20391:49;20472:2;20457:18;;20312:169::o;20486:397::-;20688:2;20670:21;;;20727:2;20707:18;;;20700:30;20766:34;20761:2;20746:18;;20739:62;-1:-1:-1;;;20832:2:1;20817:18;;20810:31;20873:3;20858:19;;20660:223::o;20888:330::-;21090:2;21072:21;;;21129:1;21109:18;;;21102:29;-1:-1:-1;;;21162:2:1;21147:18;;21140:37;21209:2;21194:18;;21062:156::o;21223:413::-;21425:2;21407:21;;;21464:2;21444:18;;;21437:30;21503:34;21498:2;21483:18;;21476:62;-1:-1:-1;;;21569:2:1;21554:18;;21547:47;21626:3;21611:19;;21397:239::o;21641:408::-;21843:2;21825:21;;;21882:2;21862:18;;;21855:30;21921:34;21916:2;21901:18;;21894:62;-1:-1:-1;;;21987:2:1;21972:18;;21965:42;22039:3;22024:19;;21815:234::o;22054:343::-;22256:2;22238:21;;;22295:2;22275:18;;;22268:30;-1:-1:-1;;;22329:2:1;22314:18;;22307:49;22388:2;22373:18;;22228:169::o;22402:331::-;22604:2;22586:21;;;22643:1;22623:18;;;22616:29;-1:-1:-1;;;22676:2:1;22661:18;;22654:38;22724:2;22709:18;;22576:157::o;22738:349::-;22940:2;22922:21;;;22979:2;22959:18;;;22952:30;-1:-1:-1;;;23013:2:1;22998:18;;22991:55;23078:2;23063:18;;22912:175::o;23092:340::-;23294:2;23276:21;;;23333:2;23313:18;;;23306:30;-1:-1:-1;;;23367:2:1;23352:18;;23345:46;23423:2;23408:18;;23266:166::o;23437:343::-;23639:2;23621:21;;;23678:2;23658:18;;;23651:30;-1:-1:-1;;;23712:2:1;23697:18;;23690:49;23771:2;23756:18;;23611:169::o;23785:177::-;23931:25;;;23919:2;23904:18;;23886:76::o;23967:184::-;24139:4;24127:17;;;;24109:36;;24097:2;24082:18;;24064:87::o;24156:251::-;24226:2;24220:9;24256:17;;;-1:-1:-1;;;;;24288:34:1;;24324:22;;;24285:62;24282:2;;;24350:18;;:::i;:::-;24386:2;24379:22;24200:207;;-1:-1:-1;24200:207:1:o;24412:128::-;;24483:1;24479:6;24476:1;24473:13;24470:2;;;24489:18;;:::i;:::-;-1:-1:-1;24525:9:1;;24460:80::o;24545:204::-;;24619:4;24616:1;24612:12;24651:4;24648:1;24644:12;24686:3;24680:4;24676:14;24671:3;24668:23;24665:2;;;24694:18;;:::i;:::-;24730:13;;24591:158;-1:-1:-1;;;24591:158:1:o;24754:120::-;;24820:1;24810:2;;24825:18;;:::i;:::-;-1:-1:-1;24859:9:1;;24800:74::o;24879:168::-;;24985:1;24981;24977:6;24973:14;24970:1;24967:21;24962:1;24955:9;24948:17;24944:45;24941:2;;;24992:18;;:::i;:::-;-1:-1:-1;25032:9:1;;24931:116::o;25052:270::-;;25120:12;;;25148:10;;-1:-1:-1;;;25167:19:1;;25160:27;;25144:44;25141:2;;;25191:18;;:::i;:::-;-1:-1:-1;;;;;25238:27:1;;25231:35;;25223:44;;25220:2;;;25270:18;;:::i;:::-;-1:-1:-1;;25307:9:1;;25100:222::o;25327:125::-;;25395:1;25392;25389:8;25386:2;;;25400:18;;:::i;:::-;-1:-1:-1;25437:9:1;;25376:76::o;25457:258::-;25529:1;25539:113;25553:6;25550:1;25547:13;25539:113;;;25629:11;;;25623:18;25610:11;;;25603:39;25575:2;25568:10;25539:113;;;25670:6;25667:1;25664:13;25661:2;;;-1:-1:-1;;25705:1:1;25687:16;;25680:27;25510:205::o;25720:380::-;25805:1;25795:12;;25852:1;25842:12;;;25863:2;;25917:4;25909:6;25905:17;25895:27;;25863:2;25970;25962:6;25959:14;25939:18;25936:38;25933:2;;;26016:10;26011:3;26007:20;26004:1;25997:31;26051:4;26048:1;26041:15;26079:4;26076:1;26069:15;25933:2;;25775:325;;;:::o;26105:135::-;;-1:-1:-1;;26165:17:1;;26162:2;;;26185:18;;:::i;:::-;-1:-1:-1;26232:1:1;26221:13;;26152:88::o;26245:112::-;;26303:1;26293:2;;26308:18;;:::i;:::-;-1:-1:-1;26342:9:1;;26283:74::o;26362:127::-;26423:10;26418:3;26414:20;26411:1;26404:31;26454:4;26451:1;26444:15;26478:4;26475:1;26468:15;26494:127;26555:10;26550:3;26546:20;26543:1;26536:31;26586:4;26583:1;26576:15;26610:4;26607:1;26600:15;26626:127;26687:10;26682:3;26678:20;26675:1;26668:31;26718:4;26715:1;26708:15;26742:4;26739:1;26732:15;26758:133;-1:-1:-1;;;;;;26834:32:1;;26824:43;;26814:2;;26881:1;26878;26871:12

Swarm Source

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