ETH Price: $3,966.32 (+1.91%)

Token

grom (GROM)
 

Overview

Max Total Supply

1,000 GROM

Holders

222

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 GROM
0x7198527c57788A8215875d326212Af1EAA0d4Aad
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
grom

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-22
*/

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

pragma solidity ^0.8.0;

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

////import "../../utils/introspection/IERC165.sol";

/**
 * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

////import "../IERC721.sol";

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

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

////import "../IERC721.sol";

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol)

pragma solidity ^0.8.0;

////import "../token/ERC721/IERC721Receiver.sol";




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol)

pragma solidity ^0.8.0;

////import "../token/ERC721/extensions/IERC721Metadata.sol";




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;

////import "../token/ERC721/IERC721.sol";




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

////import "./IERC165.sol";

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

////import "../token/ERC721/extensions/IERC721Enumerable.sol";




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT

pragma solidity ^0.8.0;

////import "@openzeppelin/contracts/utils/Context.sol";
////import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
////import "@openzeppelin/contracts/interfaces/IERC721.sol";
////import "@openzeppelin/contracts/interfaces/IERC721Metadata.sol";
////import "@openzeppelin/contracts/utils/Address.sol";
////import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata {
	using Address for address;

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Mapping from token ID to owner address
	address[] internal _owners;

	// 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");

		uint count = 0;
		uint length = _owners.length;
		for( uint i = 0; i < length; ++i ){
		  if( owner == _owners[i] ){
			++count;
		  }
		}

		delete length;
		return count;
	}

	/**
	 * @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 {IERC721-approve}.
	 */
	function approve(address to, uint256 tokenId) public virtual override {
		address owner = ERC721B.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 tokenId < _owners.length && _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 = ERC721B.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);
		_owners.push(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 = ERC721B.ownerOf(tokenId);

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

		// Clear approvals
		_approve(address(0), tokenId);
		_owners[tokenId] = address(0);

		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(ERC721B.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);
		_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(ERC721B.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 {}
}



/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

////import "../utils/Context.sol";

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

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

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

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

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

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

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

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

////import "../IERC20.sol";
////import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT

pragma solidity ^0.8.0;

////import "./ERC721B.sol";
////import "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

/**
 * @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 ERC721EnumerableB is ERC721B, IERC721Enumerable {
	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721B) 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 tokenId) {
		require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

		uint count;
		uint length = _owners.length;
		for( uint i; i < length; ++i ){
			if( owner == _owners[i] ){
				if( count == index ){
					delete count;
					delete length;
					return i;
				}
				else
					++count;
			}
		}

		delete count;
		delete length;
		require(false, "ERC721Enumerable: owner index out of bounds");
	}

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

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



/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT

pragma solidity ^0.8.0;

////import "@openzeppelin/contracts/access/Ownable.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

contract Delegated is Ownable{
  mapping(address => bool) internal _delegates;

  constructor(){
	_delegates[owner()] = true;
  }

  modifier onlyDelegates {
	require(_delegates[msg.sender], "Invalid delegate" );
	_;
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns ( bool ){
	return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{
	_delegates[addr] = isDelegate_;
  }
}



/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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




/** 
 *  
*/
            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

////import "../token/ERC20/utils/SafeERC20.sol";
////import "../utils/Address.sol";
////import "../utils/Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


/** 
 *  
*/

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT

pragma solidity ^0.8.7;

////import "@openzeppelin/contracts/finance/PaymentSplitter.sol";
////import "@openzeppelin/contracts/utils/Strings.sol";
////import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
////import "./Delegated.sol";
////import "./ERC721EnumerableB.sol";

/****************************************
 * @author: Squeebo                     *
 * @team:   X-11                        *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/

contract grom is Delegated, ERC721EnumerableB, PaymentSplitter {
	using Strings for uint;

	bytes32 public merkleRoot;

	uint public MAX_SUPPLY = 1000;
	uint public WL_SUPPLY  = 500;

	bool public isActive   = false;
	bool public isActiveWL = false;
	uint public maxOrder   = 5;
	uint public price	   = 0.0169 ether;

	string private _baseTokenURI = '';
	string private _tokenURISuffix = '';

	mapping(address => uint[]) private _balances;

	address[] private addressList = [
		0x7aa4720178a05654D48182aCF853b4eC1fe5f7E5,
		0xD932B57C2A2A019C5b5924b86134FaF51280F956
	];
	uint[] private shareList = [
		50,
		50
	];

	constructor()
		Delegated()
		ERC721B("grom", "GROM")
		PaymentSplitter(addressList, shareList)  {
	}

	//external
	fallback() external payable {}

	function mint( uint quantity ) external payable {
		require( isActive,        				"Sale is not active"		);
		require( quantity <= maxOrder,          "Order too big"             );
		require( msg.value >= price * quantity, "Ether sent is not correct" );

		uint256 supply = totalSupply();
		require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		for(uint i = 0; i < quantity; ++i){
			_safeMint( msg.sender, supply++, "" );
		}
	}

	function whitelistMint( bytes32[] calldata proof, uint quantity ) external payable {
		require( isActiveWL,        			   "Whitelist sale is not active");
		require( quantity <= maxOrder,            "Order too big"               );

		bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
		require( MerkleProof.verify(proof, merkleRoot, leaf), "Not whitelisted");

		uint256 supply = totalSupply();
		require( supply + quantity <= WL_SUPPLY,  "Mint/order exceeds whitelist supply" );
		require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		
		for(uint i = 0; i < quantity; ++i){
			_safeMint( msg.sender, supply++, "" );
		}  
	}

	//external delegated
	function gift(uint[] calldata quantity, address[] calldata recipient) external onlyDelegates{
		require(quantity.length == recipient.length, "Must provide equal quantities and recipients" );

		uint totalQuantity = 0;
		uint256 supply = totalSupply();
		for(uint i = 0; i < quantity.length; ++i){
			totalQuantity += quantity[i];
		}
		require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		delete totalQuantity;

		for(uint i = 0; i < recipient.length; ++i){
			for(uint j = 0; j < quantity[i]; ++j){
				_safeMint( recipient[i], supply++, "Sent with love" );
			}
		}
	}

	function setWhitelistActive(bool isActiveWL_) external onlyDelegates {
		if( isActiveWL != isActiveWL_ ) 
			isActiveWL = isActiveWL_;
	}

	function setActive(bool isActive_) external onlyDelegates{
		if( isActive != isActive_ )
			isActive = isActive_;
	}

	function setMaxOrder(uint maxOrder_) external onlyDelegates{
		if( maxOrder != maxOrder_ )
			maxOrder = maxOrder_;
	}

	function setPrice(uint price_) external onlyDelegates{
		if( price != price_ )
			price = price_;
	}

	function setMerkleRoot(bytes32 root) external onlyDelegates {
		merkleRoot = root;
	}

	function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyDelegates{
		_baseTokenURI = _newBaseURI;
		_tokenURISuffix = _newSuffix;
	}

	//external owner
	function setMaxSupply(uint maxSupply) external onlyOwner{
		if( MAX_SUPPLY != maxSupply ){
			require(maxSupply >= totalSupply(), "Specified supply is lower than current balance" );
			MAX_SUPPLY = maxSupply;
		}
	}

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

	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
		require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
		return _balances[owner][index];
	}

	function tokenURI(uint tokenId) external view virtual override returns (string memory) {
		require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
		return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix));
	}

	//internal
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal override virtual {
		address zero = address(0);
		if( from != zero || to == zero ){
			//find this token and remove it
			uint length = _balances[from].length;
			for( uint i; i < length; ++i ){
				if( _balances[from][i] == tokenId ){
					_balances[from][i] = _balances[from][length - 1];
					_balances[from].pop();
					break;
				}
			}

			delete length;
		}

		if( from == zero || to != zero ){
			_balances[to].push( tokenId );
		}
	}
}

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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","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":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActiveWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setActive","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"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder_","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActiveWL_","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6103e8600f556101f46010556011805461ffff191690556005601255663c0a75e0b4400060135560a06040819052600060808190526200004291601491620005d2565b506040805160208101918290526000908190526200006391601591620005d2565b5060408051808201909152737aa4720178a05654d48182acf853b4ec1fe5f7e5815273d932b57c2a2a019c5b5924b86134faf51280f9566020820152620000af90601790600262000661565b506040805180820190915260328082526020820152620000d4906018906002620006b9565b50348015620000e257600080fd5b5060178054806020026020016040519081016040528092919081815260200182805480156200013b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200011c575b505050505060188054806020026020016040519081016040528092919081815260200182805480156200018e57602002820191906000526020600020905b81548152602001906001019080831162000179575b50505050506040518060400160405280600481526020016367726f6d60e01b8152506040518060400160405280600481526020016347524f4d60e01b815250620001e7620001e16200039060201b60201c565b62000394565b6001806000620001ff6000546001600160a01b031690565b6001600160a01b03168152602080820192909252604001600020805460ff19169215159290921790915582516200023d9160029190850190620005d2565b50805162000253906003906020840190620005d2565b5050508051825114620002c85760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200031b5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620002bf565b60005b82518110156200038757620003728382815181106200034157620003416200079f565b60200260200101518383815181106200035e576200035e6200079f565b6020026020010151620003e460201b60201c565b806200037e816200076b565b9150506200031e565b505050620007b5565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620004515760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620002bf565b60008111620004a35760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620002bf565b6001600160a01b038216600090815260096020526040902054156200051f5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620002bf565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200058990829062000713565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620005e0906200072e565b90600052602060002090601f0160209004810192826200060457600085556200064f565b82601f106200061f57805160ff19168380011785556200064f565b828001600101855582156200064f579182015b828111156200064f57825182559160200191906001019062000632565b506200065d929150620006fc565b5090565b8280548282559060005260206000209081019282156200064f579160200282015b828111156200064f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000682565b8280548282559060005260206000209081019282156200064f579160200282015b828111156200064f578251829060ff16905591602001919060010190620006da565b5b808211156200065d5760008155600101620006fd565b6000821982111562000729576200072962000789565b500190565b600181811c908216806200074357607f821691505b602082108114156200076557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000782576200078262000789565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b61333480620007c56000396000f3fe6080604052600436106102735760003560e01c80636f8b44b01161014e578063a22cb465116100bb578063ce7c2ac211610077578063ce7c2ac2146107d6578063d79779b21461080c578063dde3d31314610842578063e33b7de314610862578063e985e9c514610877578063f2fde38b146108c057005b8063a22cb46514610720578063acec338a14610740578063afe2e1fa14610760578063b88d4fde14610776578063c3b754dc14610796578063c87b56dd146107b657005b806391b7f5ed1161010a57806391b7f5ed1461066c57806395d89b411461068c57806396ea3a47146106a15780639852595c146106c1578063a035b1fe146106f7578063a0712d681461070d57005b80636f8b44b0146105b957806370a08231146105d9578063715018a6146105f95780637cb647591461060e5780638b83209b1461062e5780638da5cb5b1461064e57005b80632eb4a7ab116101ec57806348b75044116101a857806348b75044146104fa5780634a994eef1461051a5780634f6ccce71461053a5780635306deaf1461055a5780636352211e146105795780636790a9de1461059957005b80632eb4a7ab146104335780632f745c591461044957806332cb6b0c146104695780633a98ef391461047f578063406072a91461049457806342842e0e146104da57005b8063095ea7b31161023b578063095ea7b31461039157806318160ddd146103b157806319165587146103c657806322f3e2d4146103e657806323b872dd146104005780632904e6d91461042057005b8062451026146102be57806301ffc9a7146102e757806306fdde03146103175780630777962714610339578063081812fc1461035957005b366102bc577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b3480156102ca57600080fd5b506102d460125481565b6040519081526020015b60405180910390f35b3480156102f357600080fd5b50610307610302366004612d3e565b6108e0565b60405190151581526020016102de565b34801561032357600080fd5b5061032c61090b565b6040516102de9190612f38565b34801561034557600080fd5b50610307610354366004612a62565b61099d565b34801561036557600080fd5b50610379610374366004612d25565b6109f0565b6040516001600160a01b0390911681526020016102de565b34801561039d57600080fd5b506102bc6103ac366004612c07565b610a78565b3480156103bd57600080fd5b506004546102d4565b3480156103d257600080fd5b506102bc6103e1366004612a62565b610b8e565b3480156103f257600080fd5b506011546103079060ff1681565b34801561040c57600080fd5b506102bc61041b366004612ab8565b610cbc565b6102bc61042e366004612c33565b610ced565b34801561043f57600080fd5b506102d4600e5481565b34801561045557600080fd5b506102d4610464366004612c07565b610f26565b34801561047557600080fd5b506102d4600f5481565b34801561048b57600080fd5b506007546102d4565b3480156104a057600080fd5b506102d46104af366004612a7f565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156104e657600080fd5b506102bc6104f5366004612ab8565b610fd0565b34801561050657600080fd5b506102bc610515366004612a7f565b610feb565b34801561052657600080fd5b506102bc610535366004612bd9565b6111d3565b34801561054657600080fd5b506102d4610555366004612d25565b611228565b34801561056657600080fd5b5060115461030790610100900460ff1681565b34801561058557600080fd5b50610379610594366004612d25565b61129a565b3480156105a557600080fd5b506102bc6105b4366004612d78565b611326565b3480156105c557600080fd5b506102bc6105d4366004612d25565b611375565b3480156105e557600080fd5b506102d46105f4366004612a62565b61141a565b34801561060557600080fd5b506102bc61145e565b34801561061a57600080fd5b506102bc610629366004612d25565b611494565b34801561063a57600080fd5b50610379610649366004612d25565b6114c8565b34801561065a57600080fd5b506000546001600160a01b0316610379565b34801561067857600080fd5b506102bc610687366004612d25565b6114f8565b34801561069857600080fd5b5061032c611535565b3480156106ad57600080fd5b506102bc6106bc366004612c7f565b611544565b3480156106cd57600080fd5b506102d46106dc366004612a62565b6001600160a01b03166000908152600a602052604090205490565b34801561070357600080fd5b506102d460135481565b6102bc61071b366004612d25565b611710565b34801561072c57600080fd5b506102bc61073b366004612bd9565b611858565b34801561074c57600080fd5b506102bc61075b366004612ceb565b61191d565b34801561076c57600080fd5b506102d460105481565b34801561078257600080fd5b506102bc610791366004612af9565b61196f565b3480156107a257600080fd5b506102bc6107b1366004612ceb565b6119a7565b3480156107c257600080fd5b5061032c6107d1366004612d25565b611a04565b3480156107e257600080fd5b506102d46107f1366004612a62565b6001600160a01b031660009081526009602052604090205490565b34801561081857600080fd5b506102d4610827366004612a62565b6001600160a01b03166000908152600c602052604090205490565b34801561084e57600080fd5b506102bc61085d366004612d25565b611aa8565b34801561086e57600080fd5b506008546102d4565b34801561088357600080fd5b50610307610892366004612a7f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108cc57600080fd5b506102bc6108db366004612a62565b611ae5565b60006001600160e01b0319821663780e9d6360e01b1480610905575061090582611b7d565b92915050565b60606002805461091a906131ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610946906131ed565b80156109935780601f1061096857610100808354040283529160200191610993565b820191906000526020600020905b81548152906001019060200180831161097657829003601f168201915b5050505050905090565b600080546001600160a01b031633146109d15760405162461bcd60e51b81526004016109c8906130a2565b60405180910390fd5b506001600160a01b031660009081526001602052604090205460ff1690565b60006109fb82611bcd565b610a5c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c8565b506000908152600560205260409020546001600160a01b031690565b6000610a838261129a565b9050806001600160a01b0316836001600160a01b03161415610af15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c8565b336001600160a01b0382161480610b0d5750610b0d8133610892565b610b7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c8565b610b898383611c17565b505050565b6001600160a01b038116600090815260096020526040902054610bc35760405162461bcd60e51b81526004016109c890612fc7565b6000610bce60085490565b610bd8904761315f565b90506000610c058383610c00866001600160a01b03166000908152600a602052604090205490565b611c85565b905080610c245760405162461bcd60e51b81526004016109c89061300d565b6001600160a01b0383166000908152600a602052604081208054839290610c4c90849061315f565b925050819055508060086000828254610c65919061315f565b90915550610c7590508382611ccd565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610cc63382611de6565b610ce25760405162461bcd60e51b81526004016109c8906130d7565b610b89838383611ed0565b601154610100900460ff16610d445760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f74206163746976650000000060448201526064016109c8565b601254811115610d865760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b60448201526064016109c8565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610e0084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612031565b610e3e5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b60448201526064016109c8565b6000610e4960045490565b601054909150610e59848361315f565b1115610eb35760405162461bcd60e51b815260206004820152602360248201527f4d696e742f6f7264657220657863656564732077686974656c69737420737570604482015262706c7960e81b60648201526084016109c8565b600f54610ec0848361315f565b1115610ede5760405162461bcd60e51b81526004016109c890613128565b60005b83811015610f1e57610f0e3383610ef781613228565b945060405180602001604052806000815250612047565b610f1781613228565b9050610ee1565b505050505050565b6000610f318361207a565b8210610f935760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c8565b6001600160a01b0383166000908152601660205260409020805483908110610fbd57610fbd613299565b9060005260206000200154905092915050565b610b898383836040518060200160405280600081525061196f565b6001600160a01b0381166000908152600960205260409020546110205760405162461bcd60e51b81526004016109c890612fc7565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190612dd8565b6110ba919061315f565b905060006110f38383610c0087876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806111125760405162461bcd60e51b81526004016109c89061300d565b6001600160a01b038085166000908152600d602090815260408083209387168352929052908120805483929061114990849061315f565b90915550506001600160a01b0384166000908152600c60205260408120805483929061117690849061315f565b909155506111879050848483612109565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000546001600160a01b031633146111fd5760405162461bcd60e51b81526004016109c8906130a2565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600061123360045490565b82106112965760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c8565b5090565b600080600483815481106112b0576112b0613299565b6000918252602090912001546001600160a01b03169050806109055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c8565b3360009081526001602052604090205460ff166113555760405162461bcd60e51b81526004016109c890612f4b565b61136160148585612944565b5061136e60158383612944565b5050505050565b6000546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109c8906130a2565b80600f5414611417576004548110156114115760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b60648201526084016109c8565b600f8190555b50565b60006001600160a01b0382166114425760405162461bcd60e51b81526004016109c890613058565b506001600160a01b031660009081526016602052604090205490565b6000546001600160a01b031633146114885760405162461bcd60e51b81526004016109c8906130a2565b611492600061215b565b565b3360009081526001602052604090205460ff166114c35760405162461bcd60e51b81526004016109c890612f4b565b600e55565b6000600b82815481106114dd576114dd613299565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff166115275760405162461bcd60e51b81526004016109c890612f4b565b806013541461141757601355565b60606003805461091a906131ed565b3360009081526001602052604090205460ff166115735760405162461bcd60e51b81526004016109c890612f4b565b8281146115d75760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b60648201526084016109c8565b6000806115e360045490565b905060005b858110156116265786868281811061160257611602613299565b9050602002013583611614919061315f565b925061161f81613228565b90506115e8565b50600f54611634838361315f565b11156116525760405162461bcd60e51b81526004016109c890613128565b6000915060005b838110156117075760005b87878381811061167657611676613299565b905060200201358110156116f6576116e686868481811061169957611699613299565b90506020020160208101906116ae9190612a62565b846116b881613228565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b815250612047565b6116ef81613228565b9050611664565b5061170081613228565b9050611659565b50505050505050565b60115460ff166117575760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b60448201526064016109c8565b6012548111156117995760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b60448201526064016109c8565b806013546117a7919061318b565b3410156117f65760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f72726563740000000000000060448201526064016109c8565b600061180160045490565b600f54909150611811838361315f565b111561182f5760405162461bcd60e51b81526004016109c890613128565b60005b82811015610b89576118483383610ef781613228565b61185181613228565b9050611832565b6001600160a01b0382163314156118b15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff1661194c5760405162461bcd60e51b81526004016109c890612f4b565b60115460ff16151581151514611417576011805482151560ff1990911617905550565b6119793383611de6565b6119955760405162461bcd60e51b81526004016109c8906130d7565b6119a1848484846121ab565b50505050565b3360009081526001602052604090205460ff166119d65760405162461bcd60e51b81526004016109c890612f4b565b60115460ff6101009091041615158115151461141757601180548215156101000261ff001990911617905550565b6060611a0f82611bcd565b611a735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c8565b6014611a7e836121de565b6015604051602001611a9293929190612ed3565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff16611ad75760405162461bcd60e51b81526004016109c890612f4b565b806012541461141757601255565b6000546001600160a01b03163314611b0f5760405162461bcd60e51b81526004016109c8906130a2565b6001600160a01b038116611b745760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c8565b6114178161215b565b60006001600160e01b031982166380ac58cd60e01b1480611bae57506001600160e01b03198216635b5e139f60e01b145b8061090557506301ffc9a760e01b6001600160e01b0319831614610905565b60045460009082108015610905575060006001600160a01b031660048381548110611bfa57611bfa613299565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c4c8261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391611caf908661318b565b611cb99190613177565b611cc391906131aa565b90505b9392505050565b80471015611d1d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109c8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d6a576040519150601f19603f3d011682016040523d82523d6000602084013e611d6f565b606091505b5050905080610b895760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109c8565b6000611df182611bcd565b611e525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c8565b6000611e5d8361129a565b9050806001600160a01b0316846001600160a01b03161480611e985750836001600160a01b0316611e8d846109f0565b6001600160a01b0316145b80611ec857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ee38261129a565b6001600160a01b031614611f4b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109c8565b6001600160a01b038216611fad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c8565b611fb88383836122dc565b611fc3600082611c17565b8160048281548110611fd757611fd7613299565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008261203e85846124a9565b14949350505050565b612051838361251d565b61205e6000848484612651565b610b895760405162461bcd60e51b81526004016109c890612f75565b60006001600160a01b0382166120a25760405162461bcd60e51b81526004016109c890613058565b600454600090815b8181101561210057600481815481106120c5576120c5613299565b6000918252602090912001546001600160a01b03868116911614156120f0576120ed83613228565b92505b6120f981613228565b90506120aa565b50909392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b8990849061275e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121b6848484611ed0565b6121c284848484612651565b6119a15760405162461bcd60e51b81526004016109c890612f75565b6060816122025750506040805180820190915260018152600360fc1b602082015290565b8160005b811561222c578061221681613228565b91506122259050600a83613177565b9150612206565b60008167ffffffffffffffff811115612247576122476132af565b6040519080825280601f01601f191660200182016040528015612271576020820181803683370190505b5090505b8415611ec8576122866001836131aa565b9150612293600a86613243565b61229e90603061315f565b60f81b8183815181106122b3576122b3613299565b60200101906001600160f81b031916908160001a9053506122d5600a86613177565b9450612275565b60006001600160a01b0384161515806123065750806001600160a01b0316836001600160a01b0316145b15612443576001600160a01b038416600090815260166020526040812054905b81811015612440576001600160a01b038616600090815260166020526040902080548591908390811061235b5761235b613299565b90600052602060002001541415612430576001600160a01b038616600090815260166020526040902061238f6001846131aa565b8154811061239f5761239f613299565b906000526020600020015460166000886001600160a01b03166001600160a01b0316815260200190815260200160002082815481106123e0576123e0613299565b60009182526020808320909101929092556001600160a01b038816815260169091526040902080548061241557612415613283565b60019003818190600052602060002001600090559055612440565b61243981613228565b9050612326565b50505b806001600160a01b0316846001600160a01b031614806124755750806001600160a01b0316836001600160a01b031614155b156119a157506001600160a01b03919091166000908152601660209081526040822080546001810182559083529120015550565b600081815b84518110156125155760008582815181106124cb576124cb613299565b602002602001015190508083116124f15760008381526020829052604090209250612502565b600081815260208490526040902092505b508061250d81613228565b9150506124ae565b509392505050565b6001600160a01b0382166125735760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c8565b61257c81611bcd565b156125c95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c8565b6125d5600083836122dc565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561275357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612695903390899088908890600401612efb565b602060405180830381600087803b1580156126af57600080fd5b505af19250505080156126df575060408051601f3d908101601f191682019092526126dc91810190612d5b565b60015b612739573d80801561270d576040519150601f19603f3d011682016040523d82523d6000602084013e612712565b606091505b5080516127315760405162461bcd60e51b81526004016109c890612f75565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ec8565b506001949350505050565b60006127b3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128309092919063ffffffff16565b805190915015610b8957808060200190518101906127d19190612d08565b610b895760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109c8565b6060611cc38484600085856001600160a01b0385163b6128925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c8565b600080866001600160a01b031685876040516128ae9190612eb7565b60006040518083038185875af1925050503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b509150915061290082828661290b565b979650505050505050565b6060831561291a575081611cc6565b82511561292a5782518084602001fd5b8160405162461bcd60e51b81526004016109c89190612f38565b828054612950906131ed565b90600052602060002090601f01602090048101928261297257600085556129b8565b82601f1061298b5782800160ff198235161785556129b8565b828001600101855582156129b8579182015b828111156129b857823582559160200191906001019061299d565b506112969291505b8082111561129657600081556001016129c0565b60008083601f8401126129e657600080fd5b50813567ffffffffffffffff8111156129fe57600080fd5b6020830191508360208260051b8501011115612a1957600080fd5b9250929050565b60008083601f840112612a3257600080fd5b50813567ffffffffffffffff811115612a4a57600080fd5b602083019150836020828501011115612a1957600080fd5b600060208284031215612a7457600080fd5b8135611cc6816132c5565b60008060408385031215612a9257600080fd5b8235612a9d816132c5565b91506020830135612aad816132c5565b809150509250929050565b600080600060608486031215612acd57600080fd5b8335612ad8816132c5565b92506020840135612ae8816132c5565b929592945050506040919091013590565b60008060008060808587031215612b0f57600080fd5b8435612b1a816132c5565b93506020850135612b2a816132c5565b925060408501359150606085013567ffffffffffffffff80821115612b4e57600080fd5b818701915087601f830112612b6257600080fd5b813581811115612b7457612b746132af565b604051601f8201601f19908116603f01168101908382118183101715612b9c57612b9c6132af565b816040528281528a6020848701011115612bb557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612bec57600080fd5b8235612bf7816132c5565b91506020830135612aad816132da565b60008060408385031215612c1a57600080fd5b8235612c25816132c5565b946020939093013593505050565b600080600060408486031215612c4857600080fd5b833567ffffffffffffffff811115612c5f57600080fd5b612c6b868287016129d4565b909790965060209590950135949350505050565b60008060008060408587031215612c9557600080fd5b843567ffffffffffffffff80821115612cad57600080fd5b612cb9888389016129d4565b90965094506020870135915080821115612cd257600080fd5b50612cdf878288016129d4565b95989497509550505050565b600060208284031215612cfd57600080fd5b8135611cc6816132da565b600060208284031215612d1a57600080fd5b8151611cc6816132da565b600060208284031215612d3757600080fd5b5035919050565b600060208284031215612d5057600080fd5b8135611cc6816132e8565b600060208284031215612d6d57600080fd5b8151611cc6816132e8565b60008060008060408587031215612d8e57600080fd5b843567ffffffffffffffff80821115612da657600080fd5b612db288838901612a20565b90965094506020870135915080821115612dcb57600080fd5b50612cdf87828801612a20565b600060208284031215612dea57600080fd5b5051919050565b60008151808452612e098160208601602086016131c1565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612e3757607f831692505b6020808410821415612e5957634e487b7160e01b600052602260045260246000fd5b818015612e6d5760018114612e7e57612eab565b60ff19861689528489019650612eab565b60008881526020902060005b86811015612ea35781548b820152908501908301612e8a565b505084890196505b50505050505092915050565b60008251612ec98184602087016131c1565b9190910192915050565b6000612edf8286612e1d565b8451612eef8183602089016131c1565b61290081830186612e1d565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f2e90830184612df1565b9695505050505050565b602081526000611cc66020830184612df1565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604082015260600190565b6000821982111561317257613172613257565b500190565b6000826131865761318661326d565b500490565b60008160001904831182151516156131a5576131a5613257565b500290565b6000828210156131bc576131bc613257565b500390565b60005b838110156131dc5781810151838201526020016131c4565b838111156119a15750506000910152565b600181811c9082168061320157607f821691505b6020821081141561322257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561323c5761323c613257565b5060010190565b6000826132525761325261326d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461141757600080fd5b801515811461141757600080fd5b6001600160e01b03198116811461141757600080fdfea264697066735822122005a0139531ed4f8f81e9ed862fe7980d98061184fd04a2946882c92459c1274764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102735760003560e01c80636f8b44b01161014e578063a22cb465116100bb578063ce7c2ac211610077578063ce7c2ac2146107d6578063d79779b21461080c578063dde3d31314610842578063e33b7de314610862578063e985e9c514610877578063f2fde38b146108c057005b8063a22cb46514610720578063acec338a14610740578063afe2e1fa14610760578063b88d4fde14610776578063c3b754dc14610796578063c87b56dd146107b657005b806391b7f5ed1161010a57806391b7f5ed1461066c57806395d89b411461068c57806396ea3a47146106a15780639852595c146106c1578063a035b1fe146106f7578063a0712d681461070d57005b80636f8b44b0146105b957806370a08231146105d9578063715018a6146105f95780637cb647591461060e5780638b83209b1461062e5780638da5cb5b1461064e57005b80632eb4a7ab116101ec57806348b75044116101a857806348b75044146104fa5780634a994eef1461051a5780634f6ccce71461053a5780635306deaf1461055a5780636352211e146105795780636790a9de1461059957005b80632eb4a7ab146104335780632f745c591461044957806332cb6b0c146104695780633a98ef391461047f578063406072a91461049457806342842e0e146104da57005b8063095ea7b31161023b578063095ea7b31461039157806318160ddd146103b157806319165587146103c657806322f3e2d4146103e657806323b872dd146104005780632904e6d91461042057005b8062451026146102be57806301ffc9a7146102e757806306fdde03146103175780630777962714610339578063081812fc1461035957005b366102bc577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b3480156102ca57600080fd5b506102d460125481565b6040519081526020015b60405180910390f35b3480156102f357600080fd5b50610307610302366004612d3e565b6108e0565b60405190151581526020016102de565b34801561032357600080fd5b5061032c61090b565b6040516102de9190612f38565b34801561034557600080fd5b50610307610354366004612a62565b61099d565b34801561036557600080fd5b50610379610374366004612d25565b6109f0565b6040516001600160a01b0390911681526020016102de565b34801561039d57600080fd5b506102bc6103ac366004612c07565b610a78565b3480156103bd57600080fd5b506004546102d4565b3480156103d257600080fd5b506102bc6103e1366004612a62565b610b8e565b3480156103f257600080fd5b506011546103079060ff1681565b34801561040c57600080fd5b506102bc61041b366004612ab8565b610cbc565b6102bc61042e366004612c33565b610ced565b34801561043f57600080fd5b506102d4600e5481565b34801561045557600080fd5b506102d4610464366004612c07565b610f26565b34801561047557600080fd5b506102d4600f5481565b34801561048b57600080fd5b506007546102d4565b3480156104a057600080fd5b506102d46104af366004612a7f565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156104e657600080fd5b506102bc6104f5366004612ab8565b610fd0565b34801561050657600080fd5b506102bc610515366004612a7f565b610feb565b34801561052657600080fd5b506102bc610535366004612bd9565b6111d3565b34801561054657600080fd5b506102d4610555366004612d25565b611228565b34801561056657600080fd5b5060115461030790610100900460ff1681565b34801561058557600080fd5b50610379610594366004612d25565b61129a565b3480156105a557600080fd5b506102bc6105b4366004612d78565b611326565b3480156105c557600080fd5b506102bc6105d4366004612d25565b611375565b3480156105e557600080fd5b506102d46105f4366004612a62565b61141a565b34801561060557600080fd5b506102bc61145e565b34801561061a57600080fd5b506102bc610629366004612d25565b611494565b34801561063a57600080fd5b50610379610649366004612d25565b6114c8565b34801561065a57600080fd5b506000546001600160a01b0316610379565b34801561067857600080fd5b506102bc610687366004612d25565b6114f8565b34801561069857600080fd5b5061032c611535565b3480156106ad57600080fd5b506102bc6106bc366004612c7f565b611544565b3480156106cd57600080fd5b506102d46106dc366004612a62565b6001600160a01b03166000908152600a602052604090205490565b34801561070357600080fd5b506102d460135481565b6102bc61071b366004612d25565b611710565b34801561072c57600080fd5b506102bc61073b366004612bd9565b611858565b34801561074c57600080fd5b506102bc61075b366004612ceb565b61191d565b34801561076c57600080fd5b506102d460105481565b34801561078257600080fd5b506102bc610791366004612af9565b61196f565b3480156107a257600080fd5b506102bc6107b1366004612ceb565b6119a7565b3480156107c257600080fd5b5061032c6107d1366004612d25565b611a04565b3480156107e257600080fd5b506102d46107f1366004612a62565b6001600160a01b031660009081526009602052604090205490565b34801561081857600080fd5b506102d4610827366004612a62565b6001600160a01b03166000908152600c602052604090205490565b34801561084e57600080fd5b506102bc61085d366004612d25565b611aa8565b34801561086e57600080fd5b506008546102d4565b34801561088357600080fd5b50610307610892366004612a7f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108cc57600080fd5b506102bc6108db366004612a62565b611ae5565b60006001600160e01b0319821663780e9d6360e01b1480610905575061090582611b7d565b92915050565b60606002805461091a906131ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610946906131ed565b80156109935780601f1061096857610100808354040283529160200191610993565b820191906000526020600020905b81548152906001019060200180831161097657829003601f168201915b5050505050905090565b600080546001600160a01b031633146109d15760405162461bcd60e51b81526004016109c8906130a2565b60405180910390fd5b506001600160a01b031660009081526001602052604090205460ff1690565b60006109fb82611bcd565b610a5c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c8565b506000908152600560205260409020546001600160a01b031690565b6000610a838261129a565b9050806001600160a01b0316836001600160a01b03161415610af15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109c8565b336001600160a01b0382161480610b0d5750610b0d8133610892565b610b7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c8565b610b898383611c17565b505050565b6001600160a01b038116600090815260096020526040902054610bc35760405162461bcd60e51b81526004016109c890612fc7565b6000610bce60085490565b610bd8904761315f565b90506000610c058383610c00866001600160a01b03166000908152600a602052604090205490565b611c85565b905080610c245760405162461bcd60e51b81526004016109c89061300d565b6001600160a01b0383166000908152600a602052604081208054839290610c4c90849061315f565b925050819055508060086000828254610c65919061315f565b90915550610c7590508382611ccd565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610cc63382611de6565b610ce25760405162461bcd60e51b81526004016109c8906130d7565b610b89838383611ed0565b601154610100900460ff16610d445760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f74206163746976650000000060448201526064016109c8565b601254811115610d865760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b60448201526064016109c8565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610e0084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612031565b610e3e5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b60448201526064016109c8565b6000610e4960045490565b601054909150610e59848361315f565b1115610eb35760405162461bcd60e51b815260206004820152602360248201527f4d696e742f6f7264657220657863656564732077686974656c69737420737570604482015262706c7960e81b60648201526084016109c8565b600f54610ec0848361315f565b1115610ede5760405162461bcd60e51b81526004016109c890613128565b60005b83811015610f1e57610f0e3383610ef781613228565b945060405180602001604052806000815250612047565b610f1781613228565b9050610ee1565b505050505050565b6000610f318361207a565b8210610f935760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109c8565b6001600160a01b0383166000908152601660205260409020805483908110610fbd57610fbd613299565b9060005260206000200154905092915050565b610b898383836040518060200160405280600081525061196f565b6001600160a01b0381166000908152600960205260409020546110205760405162461bcd60e51b81526004016109c890612fc7565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190612dd8565b6110ba919061315f565b905060006110f38383610c0087876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806111125760405162461bcd60e51b81526004016109c89061300d565b6001600160a01b038085166000908152600d602090815260408083209387168352929052908120805483929061114990849061315f565b90915550506001600160a01b0384166000908152600c60205260408120805483929061117690849061315f565b909155506111879050848483612109565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000546001600160a01b031633146111fd5760405162461bcd60e51b81526004016109c8906130a2565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600061123360045490565b82106112965760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109c8565b5090565b600080600483815481106112b0576112b0613299565b6000918252602090912001546001600160a01b03169050806109055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109c8565b3360009081526001602052604090205460ff166113555760405162461bcd60e51b81526004016109c890612f4b565b61136160148585612944565b5061136e60158383612944565b5050505050565b6000546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109c8906130a2565b80600f5414611417576004548110156114115760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b60648201526084016109c8565b600f8190555b50565b60006001600160a01b0382166114425760405162461bcd60e51b81526004016109c890613058565b506001600160a01b031660009081526016602052604090205490565b6000546001600160a01b031633146114885760405162461bcd60e51b81526004016109c8906130a2565b611492600061215b565b565b3360009081526001602052604090205460ff166114c35760405162461bcd60e51b81526004016109c890612f4b565b600e55565b6000600b82815481106114dd576114dd613299565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff166115275760405162461bcd60e51b81526004016109c890612f4b565b806013541461141757601355565b60606003805461091a906131ed565b3360009081526001602052604090205460ff166115735760405162461bcd60e51b81526004016109c890612f4b565b8281146115d75760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b60648201526084016109c8565b6000806115e360045490565b905060005b858110156116265786868281811061160257611602613299565b9050602002013583611614919061315f565b925061161f81613228565b90506115e8565b50600f54611634838361315f565b11156116525760405162461bcd60e51b81526004016109c890613128565b6000915060005b838110156117075760005b87878381811061167657611676613299565b905060200201358110156116f6576116e686868481811061169957611699613299565b90506020020160208101906116ae9190612a62565b846116b881613228565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b815250612047565b6116ef81613228565b9050611664565b5061170081613228565b9050611659565b50505050505050565b60115460ff166117575760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b60448201526064016109c8565b6012548111156117995760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b60448201526064016109c8565b806013546117a7919061318b565b3410156117f65760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f72726563740000000000000060448201526064016109c8565b600061180160045490565b600f54909150611811838361315f565b111561182f5760405162461bcd60e51b81526004016109c890613128565b60005b82811015610b89576118483383610ef781613228565b61185181613228565b9050611832565b6001600160a01b0382163314156118b15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c8565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff1661194c5760405162461bcd60e51b81526004016109c890612f4b565b60115460ff16151581151514611417576011805482151560ff1990911617905550565b6119793383611de6565b6119955760405162461bcd60e51b81526004016109c8906130d7565b6119a1848484846121ab565b50505050565b3360009081526001602052604090205460ff166119d65760405162461bcd60e51b81526004016109c890612f4b565b60115460ff6101009091041615158115151461141757601180548215156101000261ff001990911617905550565b6060611a0f82611bcd565b611a735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c8565b6014611a7e836121de565b6015604051602001611a9293929190612ed3565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff16611ad75760405162461bcd60e51b81526004016109c890612f4b565b806012541461141757601255565b6000546001600160a01b03163314611b0f5760405162461bcd60e51b81526004016109c8906130a2565b6001600160a01b038116611b745760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c8565b6114178161215b565b60006001600160e01b031982166380ac58cd60e01b1480611bae57506001600160e01b03198216635b5e139f60e01b145b8061090557506301ffc9a760e01b6001600160e01b0319831614610905565b60045460009082108015610905575060006001600160a01b031660048381548110611bfa57611bfa613299565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c4c8261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391611caf908661318b565b611cb99190613177565b611cc391906131aa565b90505b9392505050565b80471015611d1d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109c8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d6a576040519150601f19603f3d011682016040523d82523d6000602084013e611d6f565b606091505b5050905080610b895760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109c8565b6000611df182611bcd565b611e525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109c8565b6000611e5d8361129a565b9050806001600160a01b0316846001600160a01b03161480611e985750836001600160a01b0316611e8d846109f0565b6001600160a01b0316145b80611ec857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ee38261129a565b6001600160a01b031614611f4b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109c8565b6001600160a01b038216611fad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109c8565b611fb88383836122dc565b611fc3600082611c17565b8160048281548110611fd757611fd7613299565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008261203e85846124a9565b14949350505050565b612051838361251d565b61205e6000848484612651565b610b895760405162461bcd60e51b81526004016109c890612f75565b60006001600160a01b0382166120a25760405162461bcd60e51b81526004016109c890613058565b600454600090815b8181101561210057600481815481106120c5576120c5613299565b6000918252602090912001546001600160a01b03868116911614156120f0576120ed83613228565b92505b6120f981613228565b90506120aa565b50909392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b8990849061275e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121b6848484611ed0565b6121c284848484612651565b6119a15760405162461bcd60e51b81526004016109c890612f75565b6060816122025750506040805180820190915260018152600360fc1b602082015290565b8160005b811561222c578061221681613228565b91506122259050600a83613177565b9150612206565b60008167ffffffffffffffff811115612247576122476132af565b6040519080825280601f01601f191660200182016040528015612271576020820181803683370190505b5090505b8415611ec8576122866001836131aa565b9150612293600a86613243565b61229e90603061315f565b60f81b8183815181106122b3576122b3613299565b60200101906001600160f81b031916908160001a9053506122d5600a86613177565b9450612275565b60006001600160a01b0384161515806123065750806001600160a01b0316836001600160a01b0316145b15612443576001600160a01b038416600090815260166020526040812054905b81811015612440576001600160a01b038616600090815260166020526040902080548591908390811061235b5761235b613299565b90600052602060002001541415612430576001600160a01b038616600090815260166020526040902061238f6001846131aa565b8154811061239f5761239f613299565b906000526020600020015460166000886001600160a01b03166001600160a01b0316815260200190815260200160002082815481106123e0576123e0613299565b60009182526020808320909101929092556001600160a01b038816815260169091526040902080548061241557612415613283565b60019003818190600052602060002001600090559055612440565b61243981613228565b9050612326565b50505b806001600160a01b0316846001600160a01b031614806124755750806001600160a01b0316836001600160a01b031614155b156119a157506001600160a01b03919091166000908152601660209081526040822080546001810182559083529120015550565b600081815b84518110156125155760008582815181106124cb576124cb613299565b602002602001015190508083116124f15760008381526020829052604090209250612502565b600081815260208490526040902092505b508061250d81613228565b9150506124ae565b509392505050565b6001600160a01b0382166125735760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c8565b61257c81611bcd565b156125c95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c8565b6125d5600083836122dc565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561275357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612695903390899088908890600401612efb565b602060405180830381600087803b1580156126af57600080fd5b505af19250505080156126df575060408051601f3d908101601f191682019092526126dc91810190612d5b565b60015b612739573d80801561270d576040519150601f19603f3d011682016040523d82523d6000602084013e612712565b606091505b5080516127315760405162461bcd60e51b81526004016109c890612f75565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ec8565b506001949350505050565b60006127b3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128309092919063ffffffff16565b805190915015610b8957808060200190518101906127d19190612d08565b610b895760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109c8565b6060611cc38484600085856001600160a01b0385163b6128925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c8565b600080866001600160a01b031685876040516128ae9190612eb7565b60006040518083038185875af1925050503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b509150915061290082828661290b565b979650505050505050565b6060831561291a575081611cc6565b82511561292a5782518084602001fd5b8160405162461bcd60e51b81526004016109c89190612f38565b828054612950906131ed565b90600052602060002090601f01602090048101928261297257600085556129b8565b82601f1061298b5782800160ff198235161785556129b8565b828001600101855582156129b8579182015b828111156129b857823582559160200191906001019061299d565b506112969291505b8082111561129657600081556001016129c0565b60008083601f8401126129e657600080fd5b50813567ffffffffffffffff8111156129fe57600080fd5b6020830191508360208260051b8501011115612a1957600080fd5b9250929050565b60008083601f840112612a3257600080fd5b50813567ffffffffffffffff811115612a4a57600080fd5b602083019150836020828501011115612a1957600080fd5b600060208284031215612a7457600080fd5b8135611cc6816132c5565b60008060408385031215612a9257600080fd5b8235612a9d816132c5565b91506020830135612aad816132c5565b809150509250929050565b600080600060608486031215612acd57600080fd5b8335612ad8816132c5565b92506020840135612ae8816132c5565b929592945050506040919091013590565b60008060008060808587031215612b0f57600080fd5b8435612b1a816132c5565b93506020850135612b2a816132c5565b925060408501359150606085013567ffffffffffffffff80821115612b4e57600080fd5b818701915087601f830112612b6257600080fd5b813581811115612b7457612b746132af565b604051601f8201601f19908116603f01168101908382118183101715612b9c57612b9c6132af565b816040528281528a6020848701011115612bb557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612bec57600080fd5b8235612bf7816132c5565b91506020830135612aad816132da565b60008060408385031215612c1a57600080fd5b8235612c25816132c5565b946020939093013593505050565b600080600060408486031215612c4857600080fd5b833567ffffffffffffffff811115612c5f57600080fd5b612c6b868287016129d4565b909790965060209590950135949350505050565b60008060008060408587031215612c9557600080fd5b843567ffffffffffffffff80821115612cad57600080fd5b612cb9888389016129d4565b90965094506020870135915080821115612cd257600080fd5b50612cdf878288016129d4565b95989497509550505050565b600060208284031215612cfd57600080fd5b8135611cc6816132da565b600060208284031215612d1a57600080fd5b8151611cc6816132da565b600060208284031215612d3757600080fd5b5035919050565b600060208284031215612d5057600080fd5b8135611cc6816132e8565b600060208284031215612d6d57600080fd5b8151611cc6816132e8565b60008060008060408587031215612d8e57600080fd5b843567ffffffffffffffff80821115612da657600080fd5b612db288838901612a20565b90965094506020870135915080821115612dcb57600080fd5b50612cdf87828801612a20565b600060208284031215612dea57600080fd5b5051919050565b60008151808452612e098160208601602086016131c1565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612e3757607f831692505b6020808410821415612e5957634e487b7160e01b600052602260045260246000fd5b818015612e6d5760018114612e7e57612eab565b60ff19861689528489019650612eab565b60008881526020902060005b86811015612ea35781548b820152908501908301612e8a565b505084890196505b50505050505092915050565b60008251612ec98184602087016131c1565b9190910192915050565b6000612edf8286612e1d565b8451612eef8183602089016131c1565b61290081830186612e1d565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f2e90830184612df1565b9695505050505050565b602081526000611cc66020830184612df1565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604082015260600190565b6000821982111561317257613172613257565b500190565b6000826131865761318661326d565b500490565b60008160001904831182151516156131a5576131a5613257565b500290565b6000828210156131bc576131bc613257565b500390565b60005b838110156131dc5781810151838201526020016131c4565b838111156119a15750506000910152565b600181811c9082168061320157607f821691505b6020821081141561322257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561323c5761323c613257565b5060010190565b6000826132525761325261326d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461141757600080fd5b801515811461141757600080fd5b6001600160e01b03198116811461141757600080fdfea264697066735822122005a0139531ed4f8f81e9ed862fe7980d98061184fd04a2946882c92459c1274764736f6c63430008070033

Deployed Bytecode Sourcemap

57760:4907:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52716:40;20145:10;52716:40;;;-1:-1:-1;;;;;11163:32:1;;;11145:51;;52746:9:0;11227:2:1;11212:18;;11205:34;11118:18;52716:40:0;;;;;;;57760:4907;;;58021:26;;;;;;;;;;;;;;;;;;;12360:25:1;;;12348:2;12333:18;58021:26:0;;;;;;;;42372:216;;;;;;;;;;-1:-1:-1;42372:216:0;;;;;:::i;:::-;;:::i;:::-;;;12187:14:1;;12180:22;12162:41;;12150:2;12135:18;42372:216:0;12022:187:1;22932:91:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44213:109::-;;;;;;;;;;-1:-1:-1;44213:109:0;;;;;:::i;:::-;;:::i;23640:206::-;;;;;;;;;;-1:-1:-1;23640:206:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10919:32:1;;;10901:51;;10889:2;10874:18;23640:206:0;10755:203:1;23225:361:0;;;;;;;;;;-1:-1:-1;23225:361:0;;;;;:::i;:::-;;:::i;43282:101::-;;;;;;;;;;-1:-1:-1;43364:7:0;:14;43282:101;;54502:566;;;;;;;;;;-1:-1:-1;54502:566:0;;;;;:::i;:::-;;:::i;57953:30::-;;;;;;;;;;-1:-1:-1;57953:30:0;;;;;;;;24451:297;;;;;;;;;;-1:-1:-1;24451:297:0;;;;;:::i;:::-;;:::i;59027:666::-;;;;;;:::i;:::-;;:::i;57855:25::-;;;;;;;;;;;;;;;;61577:247;;;;;;;;;;-1:-1:-1;61577:247:0;;;;;:::i;:::-;;:::i;57886:29::-;;;;;;;;;;;;;;;;52847:91;;;;;;;;;;-1:-1:-1;52918:12:0;;52847:91;;53976:135;;;;;;;;;;-1:-1:-1;53976:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;54073:21:0;;;54046:7;54073:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;53976:135;24807:155;;;;;;;;;;-1:-1:-1;24807:155:0;;;;;:::i;:::-;;:::i;55336:641::-;;;;;;;;;;-1:-1:-1;55336:641:0;;;;;:::i;:::-;;:::i;44328:113::-;;;;;;;;;;-1:-1:-1;44328:113:0;;;;;:::i;:::-;;:::i;43448:207::-;;;;;;;;;;-1:-1:-1;43448:207:0;;;;;:::i;:::-;;:::i;57987:30::-;;;;;;;;;;-1:-1:-1;57987:30:0;;;;;;;;;;;22659:218;;;;;;;;;;-1:-1:-1;22659:218:0;;;;;:::i;:::-;;:::i;60934:169::-;;;;;;;;;;-1:-1:-1;60934:169:0;;;;;:::i;:::-;;:::i;61127:220::-;;;;;;;;;;-1:-1:-1;61127:220:0;;;;;:::i;:::-;;:::i;61363:209::-;;;;;;;;;;-1:-1:-1;61363:209:0;;;;;:::i;:::-;;:::i;33870:103::-;;;;;;;;;;;;;:::i;60842:87::-;;;;;;;;;;-1:-1:-1;60842:87:0;;;;;:::i;:::-;;:::i;54202:100::-;;;;;;;;;;-1:-1:-1;54202:100:0;;;;;:::i;:::-;;:::i;33219:87::-;;;;;;;;;;-1:-1:-1;33265:7:0;33292:6;-1:-1:-1;;;;;33292:6:0;33219:87;;60734:103;;;;;;;;;;-1:-1:-1;60734:103:0;;;;;:::i;:::-;;:::i;23080:95::-;;;;;;;;;;;;;:::i;59721:613::-;;;;;;;;;;-1:-1:-1;59721:613:0;;;;;:::i;:::-;;:::i;53698:109::-;;;;;;;;;;-1:-1:-1;53698:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;53781:18:0;53754:7;53781:18;;;:9;:18;;;;;;;53698:109;58051:35;;;;;;;;;;;;;;;;58563:459;;;;;;:::i;:::-;;:::i;23906:274::-;;;;;;;;;;-1:-1:-1;23906:274:0;;;;;:::i;:::-;;:::i;60484:119::-;;;;;;;;;;-1:-1:-1;60484:119:0;;;;;:::i;:::-;;:::i;57919:28::-;;;;;;;;;;;;;;;;25021:286;;;;;;;;;;-1:-1:-1;25021:286:0;;;;;:::i;:::-;;:::i;60339:140::-;;;;;;;;;;-1:-1:-1;60339:140:0;;;;;:::i;:::-;;:::i;61829:261::-;;;;;;;;;;-1:-1:-1;61829:261:0;;;;;:::i;:::-;;:::i;53494:105::-;;;;;;;;;;-1:-1:-1;53494:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;53575:16:0;53548:7;53575:16;;;:7;:16;;;;;;;53494:105;53284:119;;;;;;;;;;-1:-1:-1;53284:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;53369:26:0;53342:7;53369:26;;;:19;:26;;;;;;;53284:119;60608:121;;;;;;;;;;-1:-1:-1;60608:121:0;;;;;:::i;:::-;;:::i;53032:95::-;;;;;;;;;;-1:-1:-1;53105:14:0;;53032:95;;24239:155;;;;;;;;;;-1:-1:-1;24239:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;24354:25:0;;;24336:4;24354:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24239:155;34128:201;;;;;;;;;;-1:-1:-1;34128:201:0;;;;;:::i;:::-;;:::i;42372:216::-;42475:4;-1:-1:-1;;;;;;42493:50:0;;-1:-1:-1;;;42493:50:0;;:90;;;42547:36;42571:11;42547:23;:36::i;:::-;42486:97;42372:216;-1:-1:-1;;42372:216:0:o;22932:91::-;22986:13;23013:5;23006:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22932:91;:::o;44213:109::-;44283:4;33292:6;;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;;44300:16:0::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;::::0;44213:109::o;23640:206::-;23716:7;23738:16;23746:7;23738;:16::i;:::-;23730:73;;;;-1:-1:-1;;;23730:73:0;;21404:2:1;23730:73:0;;;21386:21:1;21443:2;21423:18;;;21416:30;21482:34;21462:18;;;21455:62;-1:-1:-1;;;21533:18:1;;;21526:42;21585:19;;23730:73:0;21202:408:1;23730:73:0;-1:-1:-1;23817:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23817:24:0;;23640:206::o;23225:361::-;23300:13;23316:24;23332:7;23316:15;:24::i;:::-;23300:40;;23359:5;-1:-1:-1;;;;;23353:11:0;:2;-1:-1:-1;;;;;23353:11:0;;;23345:57;;;;-1:-1:-1;;;23345:57:0;;23004:2:1;23345:57:0;;;22986:21:1;23043:2;23023:18;;;23016:30;23082:34;23062:18;;;23055:62;-1:-1:-1;;;23133:18:1;;;23126:31;23174:19;;23345:57:0;22802:397:1;23345:57:0;20145:10;-1:-1:-1;;;;;23422:21:0;;;;:62;;-1:-1:-1;23447:37:0;23464:5;20145:10;24239:155;:::i;23447:37::-;23409:144;;;;-1:-1:-1;;;23409:144:0;;19111:2:1;23409:144:0;;;19093:21:1;19150:2;19130:18;;;19123:30;19189:34;19169:18;;;19162:62;19260:26;19240:18;;;19233:54;19304:19;;23409:144:0;18909:420:1;23409:144:0;23560:21;23569:2;23573:7;23560:8;:21::i;:::-;23295:291;23225:361;;:::o;54502:566::-;-1:-1:-1;;;;;54578:16:0;;54597:1;54578:16;;;:7;:16;;;;;;54570:71;;;;-1:-1:-1;;;54570:71:0;;;;;;;:::i;:::-;54654:21;54702:15;53105:14;;;53032:95;54702:15;54678:39;;:21;:39;:::i;:::-;54654:63;;54728:15;54746:58;54762:7;54771:13;54786:17;54795:7;-1:-1:-1;;;;;53781:18:0;53754:7;53781:18;;;:9;:18;;;;;;;53698:109;54786:17;54746:15;:58::i;:::-;54728:76;-1:-1:-1;54825:12:0;54817:68;;;;-1:-1:-1;;;54817:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54898:18:0;;;;;;:9;:18;;;;;:29;;54920:7;;54898:18;:29;;54920:7;;54898:29;:::i;:::-;;;;;;;;54956:7;54938:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;54976:35:0;;-1:-1:-1;54994:7:0;55003;54976:17;:35::i;:::-;55027:33;;;-1:-1:-1;;;;;11163:32:1;;11145:51;;11227:2;11212:18;;11205:34;;;55027:33:0;;11118:18:1;55027:33:0;;;;;;;54559:509;;54502:566;:::o;24451:297::-;24613:41;20145:10;24646:7;24613:18;:41::i;:::-;24605:103;;;;-1:-1:-1;;;24605:103:0;;;;;;;:::i;:::-;24715:28;24725:4;24731:2;24735:7;24715:9;:28::i;59027:666::-;59124:10;;;;;;;59115:65;;;;-1:-1:-1;;;59115:65:0;;25773:2:1;59115:65:0;;;25755:21:1;25812:2;25792:18;;;25785:30;25851;25831:18;;;25824:58;25899:18;;59115:65:0;25571:352:1;59115:65:0;59206:8;;59194;:20;;59185:73;;;;-1:-1:-1;;;59185:73:0;;20701:2:1;59185:73:0;;;20683:21:1;20740:2;20720:18;;;20713:30;-1:-1:-1;;;20759:18:1;;;20752:43;20812:18;;59185:73:0;20499:337:1;59185:73:0;59290:28;;-1:-1:-1;;59307:10:0;9720:2:1;9716:15;9712:53;59290:28:0;;;9700:66:1;59265:12:0;;9782::1;;59290:28:0;;;;;;;;;;;;59280:39;;;;;;59265:54;;59333:43;59352:5;;59333:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59359:10:0;;;-1:-1:-1;59371:4:0;;-1:-1:-1;59333:18:0;:43::i;:::-;59324:72;;;;-1:-1:-1;;;59324:72:0;;19536:2:1;59324:72:0;;;19518:21:1;19575:2;19555:18;;;19548:30;-1:-1:-1;;;19594:18:1;;;19587:45;19649:18;;59324:72:0;19334:339:1;59324:72:0;59403:14;59420:13;43364:7;:14;;43282:101;59420:13;59468:9;;59403:30;;-1:-1:-1;59447:17:0;59456:8;59403:30;59447:17;:::i;:::-;:30;;59438:81;;;;-1:-1:-1;;;59438:81:0;;13167:2:1;59438:81:0;;;13149:21:1;13206:2;13186:18;;;13179:30;13245:34;13225:18;;;13218:62;-1:-1:-1;;;13296:18:1;;;13289:33;13339:19;;59438:81:0;12965:399:1;59438:81:0;59554:10;;59533:17;59542:8;59533:6;:17;:::i;:::-;:31;;59524:71;;;;-1:-1:-1;;;59524:71:0;;;;;;;:::i;:::-;59608:6;59604:83;59624:8;59620:1;:12;59604:83;;;59644:37;59655:10;59667:8;;;;:::i;:::-;;;59644:37;;;;;;;;;;;;:9;:37::i;:::-;59634:3;;;:::i;:::-;;;59604:83;;;;59110:583;;59027:666;;;:::o;61577:247::-;61674:15;61712:24;61730:5;61712:17;:24::i;:::-;61704:5;:32;61696:88;;;;-1:-1:-1;;;61696:88:0;;13571:2:1;61696:88:0;;;13553:21:1;13610:2;13590:18;;;13583:30;13649:34;13629:18;;;13622:62;-1:-1:-1;;;13700:18:1;;;13693:41;13751:19;;61696:88:0;13369:407:1;61696:88:0;-1:-1:-1;;;;;61796:16:0;;;;;;:9;:16;;;;;:23;;61813:5;;61796:23;;;;;;:::i;:::-;;;;;;;;;61789:30;;61577:247;;;;:::o;24807:155::-;24918:39;24935:4;24941:2;24945:7;24918:39;;;;;;;;;;;;:16;:39::i;55336:641::-;-1:-1:-1;;;;;55418:16:0;;55437:1;55418:16;;;:7;:16;;;;;;55410:71;;;;-1:-1:-1;;;55410:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53369:26:0;;55494:21;53369:26;;;:19;:26;;;;;;55518:30;;-1:-1:-1;;;55518:30:0;;55542:4;55518:30;;;10901:51:1;-1:-1:-1;;;;;55518:15:0;;;;;10874:18:1;;55518:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;55494:77;;55582:15;55600:65;55616:7;55625:13;55640:24;55649:5;55656:7;-1:-1:-1;;;;;54073:21:0;;;54046:7;54073:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;53976:135;55600:65;55582:83;-1:-1:-1;55686:12:0;55678:68;;;;-1:-1:-1;;;55678:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55759:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;55793:7;;55759:21;:41;;55793:7;;55759:41;:::i;:::-;;;;-1:-1:-1;;;;;;;55811:26:0;;;;;;:19;:26;;;;;:37;;55841:7;;55811:26;:37;;55841:7;;55811:37;:::i;:::-;;;;-1:-1:-1;55861:47:0;;-1:-1:-1;55884:5:0;55891:7;55900;55861:22;:47::i;:::-;55924:45;;;-1:-1:-1;;;;;11163:32:1;;;11145:51;;11227:2;11212:18;;11205:34;;;55924:45:0;;;;;11118:18:1;55924:45:0;;;;;;;55399:578;;55336:641;;:::o;44328:113::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44405:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;44405:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44328:113::o;43448:207::-;43523:7;43553:31;43364:7;:14;;43282:101;43553:31;43545:5;:39;43537:96;;;;-1:-1:-1;;;43537:96:0;;24536:2:1;43537:96:0;;;24518:21:1;24575:2;24555:18;;;24548:30;24614:34;24594:18;;;24587:62;-1:-1:-1;;;24665:18:1;;;24658:42;24717:19;;43537:96:0;24334:408:1;43537:96:0;-1:-1:-1;43645:5:0;43448:207::o;22659:218::-;22731:7;22745:13;22761:7;22769;22761:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22761:16:0;;-1:-1:-1;22790:19:0;22782:73;;;;-1:-1:-1;;;22782:73:0;;20291:2:1;22782:73:0;;;20273:21:1;20330:2;20310:18;;;20303:30;20369:34;20349:18;;;20342:62;-1:-1:-1;;;20420:18:1;;;20413:39;20469:19;;22782:73:0;20089:405:1;60934:169:0;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;61038:27:::1;:13;61054:11:::0;;61038:27:::1;:::i;:::-;-1:-1:-1::0;61070:28:0::1;:15;61088:10:::0;;61070:28:::1;:::i;:::-;;60934:169:::0;;;;:::o;61127:220::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;61206:9:::1;61192:10;;:23;61188:155;;43364:7:::0;:14;61231:9:::1;:26;;61223:86;;;::::0;-1:-1:-1;;;61223:86:0;;15573:2:1;61223:86:0::1;::::0;::::1;15555:21:1::0;15612:2;15592:18;;;15585:30;15651:34;15631:18;;;15624:62;-1:-1:-1;;;15702:18:1;;;15695:44;15756:19;;61223:86:0::1;15371:410:1::0;61223:86:0::1;61315:10;:22:::0;;;61188:155:::1;61127:220:::0;:::o;61363:209::-;61444:7;-1:-1:-1;;;;;61466:19:0;;61458:74;;;;-1:-1:-1;;;61458:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;61544:16:0;;;;;:9;:16;;;;;:23;;61363:209::o;33870:103::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;33935:30:::1;33962:1;33935:18;:30::i;:::-;33870:103::o:0;60842:87::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;60907:10:::1;:17:::0;60842:87::o;54202:100::-;54253:7;54280;54288:5;54280:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;54280:14:0;;54202:100;-1:-1:-1;;54202:100:0:o;60734:103::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;60805:6:::1;60796:5;;:15;60792:40;;60818:5;:14:::0;60734:103::o;23080:95::-;23136:13;23163:7;23156:14;;;;;:::i;59721:613::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;59826:35;;::::1;59818:93;;;::::0;-1:-1:-1;;;59818:93:0;;24949:2:1;59818:93:0::1;::::0;::::1;24931:21:1::0;24988:2;24968:18;;;24961:30;25027:34;25007:18;;;25000:62;-1:-1:-1;;;25078:18:1;;;25071:42;25130:19;;59818:93:0::1;24747:408:1::0;59818:93:0::1;59918:18;59945:14:::0;59962:13:::1;43364:7:::0;:14;;43282:101;59962:13:::1;59945:30;;59984:6;59980:81;59996:19:::0;;::::1;59980:81;;;60044:8;;60053:1;60044:11;;;;;;;:::i;:::-;;;;;;;60027:28;;;;;:::i;:::-;::::0;-1:-1:-1;60017:3:0::1;::::0;::::1;:::i;:::-;;;59980:81;;;-1:-1:-1::0;60100:10:0::1;::::0;60074:22:::1;60083:13:::0;60074:6;:22:::1;:::i;:::-;:36;;60065:76;;;;-1:-1:-1::0;;;60065:76:0::1;;;;;;;:::i;:::-;60146:20;;;60177:6;60173:157;60189:20:::0;;::::1;60173:157;;;60225:6;60221:104;60241:8;;60250:1;60241:11;;;;;;;:::i;:::-;;;;;;;60237:1;:15;60221:104;;;60265:53;60276:9;;60286:1;60276:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60290:8:::0;::::1;::::0;::::1;:::i;:::-;;;60265:53;;;;;;;;;;;;;-1:-1:-1::0;;;60265:53:0::1;;::::0;:9:::1;:53::i;:::-;60254:3;::::0;::::1;:::i;:::-;;;60221:104;;;-1:-1:-1::0;60211:3:0::1;::::0;::::1;:::i;:::-;;;60173:157;;;;59813:521;;59721:613:::0;;;;:::o;58563:459::-;58625:8;;;;58616:53;;;;-1:-1:-1;;;58616:53:0;;16747:2:1;58616:53:0;;;16729:21:1;16786:2;16766:18;;;16759:30;-1:-1:-1;;;16805:18:1;;;16798:48;16863:18;;58616:53:0;16545:342:1;58616:53:0;58695:8;;58683;:20;;58674:69;;;;-1:-1:-1;;;58674:69:0;;20701:2:1;58674:69:0;;;20683:21:1;20740:2;20720:18;;;20713:30;-1:-1:-1;;;20759:18:1;;;20752:43;20812:18;;58674:69:0;20499:337:1;58674:69:0;58778:8;58770:5;;:16;;;;:::i;:::-;58757:9;:29;;58748:69;;;;-1:-1:-1;;;58748:69:0;;23406:2:1;58748:69:0;;;23388:21:1;23445:2;23425:18;;;23418:30;23484:27;23464:18;;;23457:55;23529:18;;58748:69:0;23204:349:1;58748:69:0;58824:14;58841:13;43364:7;:14;;43282:101;58841:13;58889:10;;58824:30;;-1:-1:-1;58868:17:0;58877:8;58824:30;58868:17;:::i;:::-;:31;;58859:71;;;;-1:-1:-1;;;58859:71:0;;;;;;;:::i;:::-;58939:6;58935:83;58955:8;58951:1;:12;58935:83;;;58975:37;58986:10;58998:8;;;;:::i;58975:37::-;58965:3;;;:::i;:::-;;;58935:83;;23906:274;-1:-1:-1;;;;;24003:24:0;;20145:10;24003:24;;23995:62;;;;-1:-1:-1;;;23995:62:0;;16393:2:1;23995:62:0;;;16375:21:1;16432:2;16412:18;;;16405:30;16471:27;16451:18;;;16444:55;16516:18;;23995:62:0;16191:349:1;23995:62:0;20145:10;24064:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24064:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24064:53:0;;;;;;;;;;24127:48;;12162:41:1;;;24064:42:0;;20145:10;24127:48;;12135:18:1;24127:48:0;;;;;;;23906:274;;:::o;60484:119::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;60550:8:::1;::::0;::::1;;:21;;::::0;::::1;;;60546:52;;60578:8;:20:::0;;;::::1;;-1:-1:-1::0;;60578:20:0;;::::1;;::::0;;60484:119;:::o;25021:286::-;25163:41;20145:10;25196:7;25163:18;:41::i;:::-;25155:103;;;;-1:-1:-1;;;25155:103:0;;;;;;;:::i;:::-;25263:39;25277:4;25283:2;25287:7;25296:5;25263:13;:39::i;:::-;25021:286;;;;:::o;60339:140::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;60417:10:::1;::::0;::::1;;::::0;;::::1;;:25;;::::0;::::1;;;60413:61;;60450:10;:24:::0;;;::::1;;;;-1:-1:-1::0;;60450:24:0;;::::1;;::::0;;60339:140;:::o;61829:261::-;61901:13;61929:16;61937:7;61929;:16::i;:::-;61921:76;;;;-1:-1:-1;;;61921:76:0;;22588:2:1;61921:76:0;;;22570:21:1;22627:2;22607:18;;;22600:30;22666:34;22646:18;;;22639:62;-1:-1:-1;;;22717:18:1;;;22710:45;22772:19;;61921:76:0;22386:411:1;61921:76:0;62033:13;62048:18;:7;:16;:18::i;:::-;62068:15;62016:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62002:83;;61829:261;;;:::o;60608:121::-;44148:10;44137:22;;;;:10;:22;;;;;;;;44129:52;;;;-1:-1:-1;;;44129:52:0;;;;;;;:::i;:::-;60688:9:::1;60676:8;;:21;60672:52;;60704:8;:20:::0;60608:121::o;34128:201::-;33265:7;33292:6;-1:-1:-1;;;;;33292:6:0;20145:10;33439:23;33431:68;;;;-1:-1:-1;;;33431:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34217:22:0;::::1;34209:73;;;::::0;-1:-1:-1;;;34209:73:0;;14402:2:1;34209:73:0::1;::::0;::::1;14384:21:1::0;14441:2;14421:18;;;14414:30;14480:34;14460:18;;;14453:62;-1:-1:-1;;;14531:18:1;;;14524:36;14577:19;;34209:73:0::1;14200:402:1::0;34209:73:0::1;34293:28;34312:8;34293:18;:28::i;21936:269::-:0;22038:4;-1:-1:-1;;;;;;22060:40:0;;-1:-1:-1;;;22060:40:0;;:96;;-1:-1:-1;;;;;;;22108:48:0;;-1:-1:-1;;;22108:48:0;22060:96;:140;;;-1:-1:-1;;;;;;;;;;19289:40:0;;;22164:36;19180:157;26691:146;26784:7;:14;26756:4;;26774:24;;:58;;;;;26830:1;-1:-1:-1;;;;;26802:30:0;:7;26810;26802:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26802:16:0;:30;;26767:65;26691:146;-1:-1:-1;;26691:146:0:o;30145:160::-;30214:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30214:29:0;-1:-1:-1;;;;;30214:29:0;;;;;;;;:24;;30262;30214;30262:15;:24::i;:::-;-1:-1:-1;;;;;30253:47:0;;;;;;;;;;;30145:160;;:::o;56155:248::-;56365:12;;-1:-1:-1;;;;;56345:16:0;;56301:7;56345:16;;;:7;:16;;;;;;56301:7;;56380:15;;56329:32;;:13;:32;:::i;:::-;56328:49;;;;:::i;:::-;:67;;;;:::i;:::-;56321:74;;56155:248;;;;;;:::o;11759:317::-;11874:6;11849:21;:31;;11841:73;;;;-1:-1:-1;;;11841:73:0;;17521:2:1;11841:73:0;;;17503:21:1;17560:2;17540:18;;;17533:30;17599:31;17579:18;;;17572:59;17648:18;;11841:73:0;17319:353:1;11841:73:0;11928:12;11946:9;-1:-1:-1;;;;;11946:14:0;11968:6;11946:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11927:52;;;11998:7;11990:78;;;;-1:-1:-1;;;11990:78:0;;17094:2:1;11990:78:0;;;17076:21:1;17133:2;17113:18;;;17106:30;17172:34;17152:18;;;17145:62;17243:28;17223:18;;;17216:56;17289:19;;11990:78:0;16892:422:1;26980:328:0;27073:4;27092:16;27100:7;27092;:16::i;:::-;27084:73;;;;-1:-1:-1;;;27084:73:0;;18286:2:1;27084:73:0;;;18268:21:1;18325:2;18305:18;;;18298:30;18364:34;18344:18;;;18337:62;-1:-1:-1;;;18415:18:1;;;18408:42;18467:19;;27084:73:0;18084:408:1;27084:73:0;27162:13;27178:24;27194:7;27178:15;:24::i;:::-;27162:40;;27226:5;-1:-1:-1;;;;;27215:16:0;:7;-1:-1:-1;;;;;27215:16:0;;:51;;;;27259:7;-1:-1:-1;;;;;27235:31:0;:20;27247:7;27235:11;:20::i;:::-;-1:-1:-1;;;;;27235:31:0;;27215:51;:87;;;-1:-1:-1;;;;;;24354:25:0;;;24336:4;24354:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27270:32;27207:96;26980:328;-1:-1:-1;;;;26980:328:0:o;29594:451::-;29727:4;-1:-1:-1;;;;;29699:32:0;:24;29715:7;29699:15;:24::i;:::-;-1:-1:-1;;;;;29699:32:0;;29691:86;;;;-1:-1:-1;;;29691:86:0;;22178:2:1;29691:86:0;;;22160:21:1;22217:2;22197:18;;;22190:30;22256:34;22236:18;;;22229:62;-1:-1:-1;;;22307:18:1;;;22300:39;22356:19;;29691:86:0;21976:405:1;29691:86:0;-1:-1:-1;;;;;29790:16:0;;29782:65;;;;-1:-1:-1;;;29782:65:0;;15988:2:1;29782:65:0;;;15970:21:1;16027:2;16007:18;;;16000:30;16066:34;16046:18;;;16039:62;-1:-1:-1;;;16117:18:1;;;16110:34;16161:19;;29782:65:0;15786:400:1;29782:65:0;29854:39;29875:4;29881:2;29885:7;29854:20;:39::i;:::-;29946:29;29963:1;29967:7;29946:8;:29::i;:::-;29999:2;29980:7;29988;29980:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;29980:21:0;-1:-1:-1;;;;;29980:21:0;;;;;;30013:27;;30032:7;;30013:27;;;;;;;;;;29980:16;30013:27;29594:451;;;:::o;45691:190::-;45816:4;45869;45840:25;45853:5;45860:4;45840:12;:25::i;:::-;:33;;45691:190;-1:-1:-1;;;;45691:190:0:o;27932:261::-;28035:18;28041:2;28045:7;28035:5;:18::i;:::-;28071:54;28102:1;28106:2;28110:7;28119:5;28071:22;:54::i;:::-;28058:130;;;;-1:-1:-1;;;28058:130:0;;;;;;;:::i;22257:352::-;22329:7;-1:-1:-1;;;;;22351:19:0;;22343:74;;;;-1:-1:-1;;;22343:74:0;;;;;;;:::i;:::-;22457:7;:14;22424:10;;;22476:92;22497:6;22493:1;:10;22476:92;;;22530:7;22538:1;22530:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;22521:19:0;;;22530:10;;22521:19;22517:46;;;22548:7;;;:::i;:::-;;;22517:46;22505:3;;;:::i;:::-;;;22476:92;;;-1:-1:-1;22599:5:0;;22257:352;-1:-1:-1;;;22257:352:0:o;38401:211::-;38545:58;;;-1:-1:-1;;;;;11163:32:1;;38545:58:0;;;11145:51:1;11212:18;;;;11205:34;;;38545:58:0;;;;;;;;;;11118:18:1;;;;38545:58:0;;;;;;;;-1:-1:-1;;;;;38545:58:0;-1:-1:-1;;;38545:58:0;;;38518:86;;38538:5;;38518:19;:86::i;34489:191::-;34563:16;34582:6;;-1:-1:-1;;;;;34599:17:0;;;-1:-1:-1;;;;;;34599:17:0;;;;;;34632:40;;34582:6;;;;;;;34632:40;;34563:16;34632:40;34552:128;34489:191;:::o;26132:273::-;26256:28;26266:4;26272:2;26276:7;26256:9;:28::i;:::-;26297:48;26320:4;26326:2;26330:7;26339:5;26297:22;:48::i;:::-;26289:111;;;;-1:-1:-1;;;26289:111:0;;;;;;;:::i;47563:723::-;47619:13;47840:10;47836:53;;-1:-1:-1;;47867:10:0;;;;;;;;;;;;-1:-1:-1;;;47867:10:0;;;;;47563:723::o;47836:53::-;47914:5;47899:12;47955:78;47962:9;;47955:78;;47988:8;;;;:::i;:::-;;-1:-1:-1;48011:10:0;;-1:-1:-1;48019:2:0;48011:10;;:::i;:::-;;;47955:78;;;48043:19;48075:6;48065:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48065:17:0;;48043:39;;48093:154;48100:10;;48093:154;;48127:11;48137:1;48127:11;;:::i;:::-;;-1:-1:-1;48196:10:0;48204:2;48196:5;:10;:::i;:::-;48183:24;;:2;:24;:::i;:::-;48170:39;;48153:6;48160;48153:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;48153:56:0;;;;;;;;-1:-1:-1;48224:11:0;48233:2;48224:11;;:::i;:::-;;;48093:154;;62108:556;62225:12;-1:-1:-1;;;;;62259:12:0;;;;;:26;;;62281:4;-1:-1:-1;;;;;62275:10:0;:2;-1:-1:-1;;;;;62275:10:0;;62259:26;62255:326;;;-1:-1:-1;;;;;62343:15:0;;62329:11;62343:15;;;:9;:15;;;;;:22;;62371:184;62388:6;62384:1;:10;62371:184;;;-1:-1:-1;;;;;62412:15:0;;;;;;:9;:15;;;;;:18;;62434:7;;62412:15;62428:1;;62412:18;;;;;;:::i;:::-;;;;;;;;;:29;62408:141;;;-1:-1:-1;;;;;62472:15:0;;;;;;:9;:15;;;;;62488:10;62497:1;62488:6;:10;:::i;:::-;62472:27;;;;;;;;:::i;:::-;;;;;;;;;62451:9;:15;62461:4;-1:-1:-1;;;;;62451:15:0;-1:-1:-1;;;;;62451:15:0;;;;;;;;;;;;62467:1;62451:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;;-1:-1:-1;;;;;62507:15:0;;;;:9;:15;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62536:5;;62408:141;62396:3;;;:::i;:::-;;;62371:184;;;-1:-1:-1;;62255:326:0;62599:4;-1:-1:-1;;;;;62591:12:0;:4;-1:-1:-1;;;;;62591:12:0;;:26;;;;62613:4;-1:-1:-1;;;;;62607:10:0;:2;-1:-1:-1;;;;;62607:10:0;;;62591:26;62587:73;;;-1:-1:-1;;;;;;62625:13:0;;;;;;;;:9;:13;;;;;;;:29;;;;;;;;;;;;;;-1:-1:-1;62108:556:0:o;46242:675::-;46325:7;46368:4;46325:7;46383:497;46407:5;:12;46403:1;:16;46383:497;;;46441:20;46464:5;46470:1;46464:8;;;;;;;;:::i;:::-;;;;;;;46441:31;;46507:12;46491;:28;46487:382;;46993:13;47043:15;;;47079:4;47072:15;;;47126:4;47110:21;;46619:57;;46487:382;;;46993:13;47043:15;;;47079:4;47072:15;;;47126:4;47110:21;;46796:57;;46487:382;-1:-1:-1;46421:3:0;;;;:::i;:::-;;;;46383:497;;;-1:-1:-1;46897:12:0;46242:675;-1:-1:-1;;;46242:675:0:o;28490:313::-;-1:-1:-1;;;;;28564:16:0;;28556:61;;;;-1:-1:-1;;;28556:61:0;;21043:2:1;28556:61:0;;;21025:21:1;;;21062:18;;;21055:30;21121:34;21101:18;;;21094:62;21173:18;;28556:61:0;20841:356:1;28556:61:0;28631:16;28639:7;28631;:16::i;:::-;28630:17;28622:58;;;;-1:-1:-1;;;28622:58:0;;14809:2:1;28622:58:0;;;14791:21:1;14848:2;14828:18;;;14821:30;14887;14867:18;;;14860:58;14935:18;;28622:58:0;14607:352:1;28622:58:0;28687:45;28716:1;28720:2;28724:7;28687:20;:45::i;:::-;28737:7;:16;;;;;;;-1:-1:-1;28737:16:0;;;;;;;-1:-1:-1;;;;;;28737:16:0;-1:-1:-1;;;;;28737:16:0;;;;;;;;28765:33;;28790:7;;-1:-1:-1;28765:33:0;;-1:-1:-1;;28765:33:0;28490:313;;:::o;30839:604::-;30967:4;-1:-1:-1;;;;;30982:13:0;;10789:19;:23;30978:461;;31009:72;;-1:-1:-1;;;31009:72:0;;-1:-1:-1;;;;;31009:36:0;;;;;:72;;20145:10;;31060:4;;31066:7;;31075:5;;31009:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31009:72:0;;;;;;;;-1:-1:-1;;31009:72:0;;;;;;;;;;;;:::i;:::-;;;31005:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31218:13:0;;31214:185;;31246:60;;-1:-1:-1;;;31246:60:0;;;;;;;:::i;31214:185::-;31376:6;31370:13;31361:6;31357:2;31353:15;31346:38;31005:400;-1:-1:-1;;;;;;31120:51:0;-1:-1:-1;;;31120:51:0;;-1:-1:-1;31113:58:0;;30978:461;-1:-1:-1;31429:4:0;30839:604;;;;;;:::o;40974:716::-;41398:23;41424:69;41452:4;41424:69;;;;;;;;;;;;;;;;;41432:5;-1:-1:-1;;;;;41424:27:0;;;:69;;;;;:::i;:::-;41508:17;;41398:95;;-1:-1:-1;41508:21:0;41504:179;;41605:10;41594:30;;;;;;;;;;;;:::i;:::-;41586:85;;;;-1:-1:-1;;;41586:85:0;;25362:2:1;41586:85:0;;;25344:21:1;25401:2;25381:18;;;25374:30;25440:34;25420:18;;;25413:62;-1:-1:-1;;;25491:18:1;;;25484:40;25541:19;;41586:85:0;25160:406:1;13243:229:0;13380:12;13412:52;13434:6;13442:4;13448:1;13451:12;13380;-1:-1:-1;;;;;10789:19:0;;;14650:60;;;;-1:-1:-1;;;14650:60:0;;24178:2:1;14650:60:0;;;24160:21:1;24217:2;24197:18;;;24190:30;24256:31;24236:18;;;24229:59;24305:18;;14650:60:0;23976:353:1;14650:60:0;14724:12;14738:23;14765:6;-1:-1:-1;;;;;14765:11:0;14784:5;14791:4;14765:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14723:73;;;;14814:51;14831:7;14840:10;14852:12;14814:16;:51::i;:::-;14807:58;14363:510;-1:-1:-1;;;;;;;14363:510:0:o;17049:712::-;17199:12;17228:7;17224:530;;;-1:-1:-1;17259:10:0;17252:17;;17224:530;17373:17;;:21;17369:374;;17571:10;17565:17;17632:15;17619:10;17615:2;17611:19;17604:44;17369:374;17714:12;17707:20;;-1:-1:-1;;;17707:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:348::-;438:8;448:6;502:3;495:4;487:6;483:17;479:27;469:55;;520:1;517;510:12;469:55;-1:-1:-1;543:20:1;;586:18;575:30;;572:50;;;618:1;615;608:12;572:50;655:4;647:6;643:17;631:29;;707:3;700:4;691:6;683;679:19;675:30;672:39;669:59;;;724:1;721;714:12;739:247;798:6;851:2;839:9;830:7;826:23;822:32;819:52;;;867:1;864;857:12;819:52;906:9;893:23;925:31;950:5;925:31;:::i;1251:388::-;1319:6;1327;1380:2;1368:9;1359:7;1355:23;1351:32;1348:52;;;1396:1;1393;1386:12;1348:52;1435:9;1422:23;1454:31;1479:5;1454:31;:::i;:::-;1504:5;-1:-1:-1;1561:2:1;1546:18;;1533:32;1574:33;1533:32;1574:33;:::i;:::-;1626:7;1616:17;;;1251:388;;;;;:::o;1644:456::-;1721:6;1729;1737;1790:2;1778:9;1769:7;1765:23;1761:32;1758:52;;;1806:1;1803;1796:12;1758:52;1845:9;1832:23;1864:31;1889:5;1864:31;:::i;:::-;1914:5;-1:-1:-1;1971:2:1;1956:18;;1943:32;1984:33;1943:32;1984:33;:::i;:::-;1644:456;;2036:7;;-1:-1:-1;;;2090:2:1;2075:18;;;;2062:32;;1644:456::o;2105:1266::-;2200:6;2208;2216;2224;2277:3;2265:9;2256:7;2252:23;2248:33;2245:53;;;2294:1;2291;2284:12;2245:53;2333:9;2320:23;2352:31;2377:5;2352:31;:::i;:::-;2402:5;-1:-1:-1;2459:2:1;2444:18;;2431:32;2472:33;2431:32;2472:33;:::i;:::-;2524:7;-1:-1:-1;2578:2:1;2563:18;;2550:32;;-1:-1:-1;2633:2:1;2618:18;;2605:32;2656:18;2686:14;;;2683:34;;;2713:1;2710;2703:12;2683:34;2751:6;2740:9;2736:22;2726:32;;2796:7;2789:4;2785:2;2781:13;2777:27;2767:55;;2818:1;2815;2808:12;2767:55;2854:2;2841:16;2876:2;2872;2869:10;2866:36;;;2882:18;;:::i;:::-;2957:2;2951:9;2925:2;3011:13;;-1:-1:-1;;3007:22:1;;;3031:2;3003:31;2999:40;2987:53;;;3055:18;;;3075:22;;;3052:46;3049:72;;;3101:18;;:::i;:::-;3141:10;3137:2;3130:22;3176:2;3168:6;3161:18;3216:7;3211:2;3206;3202;3198:11;3194:20;3191:33;3188:53;;;3237:1;3234;3227:12;3188:53;3293:2;3288;3284;3280:11;3275:2;3267:6;3263:15;3250:46;3338:1;3333:2;3328;3320:6;3316:15;3312:24;3305:35;3359:6;3349:16;;;;;;;2105:1266;;;;;;;:::o;3376:382::-;3441:6;3449;3502:2;3490:9;3481:7;3477:23;3473:32;3470:52;;;3518:1;3515;3508:12;3470:52;3557:9;3544:23;3576:31;3601:5;3576:31;:::i;:::-;3626:5;-1:-1:-1;3683:2:1;3668:18;;3655:32;3696:30;3655:32;3696:30;:::i;3763:315::-;3831:6;3839;3892:2;3880:9;3871:7;3867:23;3863:32;3860:52;;;3908:1;3905;3898:12;3860:52;3947:9;3934:23;3966:31;3991:5;3966:31;:::i;:::-;4016:5;4068:2;4053:18;;;;4040:32;;-1:-1:-1;;;3763:315:1:o;4083:505::-;4178:6;4186;4194;4247:2;4235:9;4226:7;4222:23;4218:32;4215:52;;;4263:1;4260;4253:12;4215:52;4303:9;4290:23;4336:18;4328:6;4325:30;4322:50;;;4368:1;4365;4358:12;4322:50;4407:70;4469:7;4460:6;4449:9;4445:22;4407:70;:::i;:::-;4496:8;;4381:96;;-1:-1:-1;4578:2:1;4563:18;;;;4550:32;;4083:505;-1:-1:-1;;;;4083:505:1:o;4593:773::-;4715:6;4723;4731;4739;4792:2;4780:9;4771:7;4767:23;4763:32;4760:52;;;4808:1;4805;4798:12;4760:52;4848:9;4835:23;4877:18;4918:2;4910:6;4907:14;4904:34;;;4934:1;4931;4924:12;4904:34;4973:70;5035:7;5026:6;5015:9;5011:22;4973:70;:::i;:::-;5062:8;;-1:-1:-1;4947:96:1;-1:-1:-1;5150:2:1;5135:18;;5122:32;;-1:-1:-1;5166:16:1;;;5163:36;;;5195:1;5192;5185:12;5163:36;;5234:72;5298:7;5287:8;5276:9;5272:24;5234:72;:::i;:::-;4593:773;;;;-1:-1:-1;5325:8:1;-1:-1:-1;;;;4593:773:1:o;5371:241::-;5427:6;5480:2;5468:9;5459:7;5455:23;5451:32;5448:52;;;5496:1;5493;5486:12;5448:52;5535:9;5522:23;5554:28;5576:5;5554:28;:::i;5617:245::-;5684:6;5737:2;5725:9;5716:7;5712:23;5708:32;5705:52;;;5753:1;5750;5743:12;5705:52;5785:9;5779:16;5804:28;5826:5;5804:28;:::i;5867:180::-;5926:6;5979:2;5967:9;5958:7;5954:23;5950:32;5947:52;;;5995:1;5992;5985:12;5947:52;-1:-1:-1;6018:23:1;;5867:180;-1:-1:-1;5867:180:1:o;6052:245::-;6110:6;6163:2;6151:9;6142:7;6138:23;6134:32;6131:52;;;6179:1;6176;6169:12;6131:52;6218:9;6205:23;6237:30;6261:5;6237:30;:::i;6302:249::-;6371:6;6424:2;6412:9;6403:7;6399:23;6395:32;6392:52;;;6440:1;6437;6430:12;6392:52;6472:9;6466:16;6491:30;6515:5;6491:30;:::i;7231:721::-;7323:6;7331;7339;7347;7400:2;7388:9;7379:7;7375:23;7371:32;7368:52;;;7416:1;7413;7406:12;7368:52;7456:9;7443:23;7485:18;7526:2;7518:6;7515:14;7512:34;;;7542:1;7539;7532:12;7512:34;7581:59;7632:7;7623:6;7612:9;7608:22;7581:59;:::i;:::-;7659:8;;-1:-1:-1;7555:85:1;-1:-1:-1;7747:2:1;7732:18;;7719:32;;-1:-1:-1;7763:16:1;;;7760:36;;;7792:1;7789;7782:12;7760:36;;7831:61;7884:7;7873:8;7862:9;7858:24;7831:61;:::i;8142:184::-;8212:6;8265:2;8253:9;8244:7;8240:23;8236:32;8233:52;;;8281:1;8278;8271:12;8233:52;-1:-1:-1;8304:16:1;;8142:184;-1:-1:-1;8142:184:1:o;8331:257::-;8372:3;8410:5;8404:12;8437:6;8432:3;8425:19;8453:63;8509:6;8502:4;8497:3;8493:14;8486:4;8479:5;8475:16;8453:63;:::i;:::-;8570:2;8549:15;-1:-1:-1;;8545:29:1;8536:39;;;;8577:4;8532:50;;8331:257;-1:-1:-1;;8331:257:1:o;8593:973::-;8678:12;;8643:3;;8733:1;8753:18;;;;8806;;;;8833:61;;8887:4;8879:6;8875:17;8865:27;;8833:61;8913:2;8961;8953:6;8950:14;8930:18;8927:38;8924:161;;;9007:10;9002:3;8998:20;8995:1;8988:31;9042:4;9039:1;9032:15;9070:4;9067:1;9060:15;8924:161;9101:18;9128:104;;;;9246:1;9241:319;;;;9094:466;;9128:104;-1:-1:-1;;9161:24:1;;9149:37;;9206:16;;;;-1:-1:-1;9128:104:1;;9241:319;26537:1;26530:14;;;26574:4;26561:18;;9335:1;9349:165;9363:6;9360:1;9357:13;9349:165;;;9441:14;;9428:11;;;9421:35;9484:16;;;;9378:10;;9349:165;;;9353:3;;9543:6;9538:3;9534:16;9527:23;;9094:466;;;;;;;8593:973;;;;:::o;9805:274::-;9934:3;9972:6;9966:13;9988:53;10034:6;10029:3;10022:4;10014:6;10010:17;9988:53;:::i;:::-;10057:16;;;;;9805:274;-1:-1:-1;;9805:274:1:o;10084:456::-;10305:3;10333:38;10367:3;10359:6;10333:38;:::i;:::-;10400:6;10394:13;10416:52;10461:6;10457:2;10450:4;10442:6;10438:17;10416:52;:::i;:::-;10484:50;10526:6;10522:2;10518:15;10510:6;10484:50;:::i;11250:488::-;-1:-1:-1;;;;;11519:15:1;;;11501:34;;11571:15;;11566:2;11551:18;;11544:43;11618:2;11603:18;;11596:34;;;11666:3;11661:2;11646:18;;11639:31;;;11444:4;;11687:45;;11712:19;;11704:6;11687:45;:::i;:::-;11679:53;11250:488;-1:-1:-1;;;;;;11250:488:1:o;12396:219::-;12545:2;12534:9;12527:21;12508:4;12565:44;12605:2;12594:9;12590:18;12582:6;12565:44;:::i;12620:340::-;12822:2;12804:21;;;12861:2;12841:18;;;12834:30;-1:-1:-1;;;12895:2:1;12880:18;;12873:46;12951:2;12936:18;;12620:340::o;13781:414::-;13983:2;13965:21;;;14022:2;14002:18;;;13995:30;14061:34;14056:2;14041:18;;14034:62;-1:-1:-1;;;14127:2:1;14112:18;;14105:48;14185:3;14170:19;;13781:414::o;14964:402::-;15166:2;15148:21;;;15205:2;15185:18;;;15178:30;15244:34;15239:2;15224:18;;15217:62;-1:-1:-1;;;15310:2:1;15295:18;;15288:36;15356:3;15341:19;;14964:402::o;18497:407::-;18699:2;18681:21;;;18738:2;18718:18;;;18711:30;18777:34;18772:2;18757:18;;18750:62;-1:-1:-1;;;18843:2:1;18828:18;;18821:41;18894:3;18879:19;;18497:407::o;19678:406::-;19880:2;19862:21;;;19919:2;19899:18;;;19892:30;19958:34;19953:2;19938:18;;19931:62;-1:-1:-1;;;20024:2:1;20009:18;;20002:40;20074:3;20059:19;;19678:406::o;21615:356::-;21817:2;21799:21;;;21836:18;;;21829:30;21895:34;21890:2;21875:18;;21868:62;21962:2;21947:18;;21615:356::o;23558:413::-;23760:2;23742:21;;;23799:2;23779:18;;;23772:30;23838:34;23833:2;23818:18;;23811:62;-1:-1:-1;;;23904:2:1;23889:18;;23882:47;23961:3;23946:19;;23558:413::o;25928:349::-;26130:2;26112:21;;;26169:2;26149:18;;;26142:30;26208:27;26203:2;26188:18;;26181:55;26268:2;26253:18;;25928:349::o;26590:128::-;26630:3;26661:1;26657:6;26654:1;26651:13;26648:39;;;26667:18;;:::i;:::-;-1:-1:-1;26703:9:1;;26590:128::o;26723:120::-;26763:1;26789;26779:35;;26794:18;;:::i;:::-;-1:-1:-1;26828:9:1;;26723:120::o;26848:168::-;26888:7;26954:1;26950;26946:6;26942:14;26939:1;26936:21;26931:1;26924:9;26917:17;26913:45;26910:71;;;26961:18;;:::i;:::-;-1:-1:-1;27001:9:1;;26848:168::o;27021:125::-;27061:4;27089:1;27086;27083:8;27080:34;;;27094:18;;:::i;:::-;-1:-1:-1;27131:9:1;;27021:125::o;27151:258::-;27223:1;27233:113;27247:6;27244:1;27241:13;27233:113;;;27323:11;;;27317:18;27304:11;;;27297:39;27269:2;27262:10;27233:113;;;27364:6;27361:1;27358:13;27355:48;;;-1:-1:-1;;27399:1:1;27381:16;;27374:27;27151:258::o;27414:380::-;27493:1;27489:12;;;;27536;;;27557:61;;27611:4;27603:6;27599:17;27589:27;;27557:61;27664:2;27656:6;27653:14;27633:18;27630:38;27627:161;;;27710:10;27705:3;27701:20;27698:1;27691:31;27745:4;27742:1;27735:15;27773:4;27770:1;27763:15;27627:161;;27414:380;;;:::o;27799:135::-;27838:3;-1:-1:-1;;27859:17:1;;27856:43;;;27879:18;;:::i;:::-;-1:-1:-1;27926:1:1;27915:13;;27799:135::o;27939:112::-;27971:1;27997;27987:35;;28002:18;;:::i;:::-;-1:-1:-1;28036:9:1;;27939:112::o;28056:127::-;28117:10;28112:3;28108:20;28105:1;28098:31;28148:4;28145:1;28138:15;28172:4;28169:1;28162:15;28188:127;28249:10;28244:3;28240:20;28237:1;28230:31;28280:4;28277:1;28270:15;28304:4;28301:1;28294:15;28320:127;28381:10;28376:3;28372:20;28369:1;28362:31;28412:4;28409:1;28402:15;28436:4;28433:1;28426:15;28452:127;28513:10;28508:3;28504:20;28501:1;28494:31;28544:4;28541:1;28534:15;28568:4;28565:1;28558:15;28584:127;28645:10;28640:3;28636:20;28633:1;28626:31;28676:4;28673:1;28666:15;28700:4;28697:1;28690:15;28716:131;-1:-1:-1;;;;;28791:31:1;;28781:42;;28771:70;;28837:1;28834;28827:12;28852:118;28938:5;28931:13;28924:21;28917:5;28914:32;28904:60;;28960:1;28957;28950:12;28975:131;-1:-1:-1;;;;;;29049:32:1;;29039:43;;29029:71;;29096:1;29093;29086:12

Swarm Source

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